From 4749358b5717b9a2f7e1d44f9baac48ed5d80431 Mon Sep 17 00:00:00 2001 From: Eliot Miranda Date: Wed, 7 Mar 2018 15:11:21 -0800 Subject: [PATCH] CogVM source as per VMMaker.oscog-eem.2347 StackInterpreter: Immutability: Fix primitiveSlotAtPut (& InterpreterPrimitives>>primitiveInstVarAtPut) to fail with PrimErrorNoModification for read-only objects. Cogit: Inline a few trivial methods. StackToRegisterMappingCogit: For simplicity, especially in the RegisterAllocatingCogit subclass, eliminate simSelf and optStatus and include the receiver's simStackEntry as the 0'th element of the simStack. optStatus is therefore whether simSelf's liveRegister is ReceiverResultReg. Hence loops from 0 to: methodOrBlockNumTemps - 1 become loops from 1 to: methodOrBlockNumTemps. The simSelf variable is replaced by self simSelf, which is short-hand for self simStackAt: 0. Fix ancient bug in voidReceiverResultRegContainsSelf. The computed index is the right argument for ssFlushTo:; it shouldn't be subtracted from simStackPtr! Replace the UnknownSimStackPtrFlag hack in a fixup's simStackPtr and replace it by a proper flag. Consequently make a fixup's simStackPtr unsigned char, giving us a maximim of 255 stack slots (0 being for the receiver). Get much stricter with simSpillBase for the benefit of RegisterAllocatingCogit. updateSimSpillBase is now called after the new descriptor is pushed and either counts up or counts down as required to guarantee it points one beyond the last spilled entry. The assertCorrectSimStackPtr asserts now insist on this. With this change we can start to replace all the simSpillBase max: 0 phrases with simply simSpillBase. Deal with the assert failures due to frameless methods with unused temporaries by simply refusing to JIT them; see the new methodFoundInvalidPostScan hook. Plugins: All plugins should include config.h and it should always be the first include. FilePlugin connect to file primitives primitiveConnectToFileDescriptor & primitiveConnectToFile. Many thanks to Holger Freyther for the original code. Rewrite the primitives in MiscPrimitivePlugin using conventional Slang, avoiding the translatedPrimitives ineffiicencies and dependence on methods in the image. Volunteers are invited to do the same for the ADPCMCodecPlugin and SoundGenerationPlugin. --- nsspur64src/vm/cogit.h | 2 +- nsspur64src/vm/cogitX64SysV.c | 737 +++-- nsspur64src/vm/cogitX64WIN64.c | 747 +++-- nsspur64src/vm/cointerp.c | 117 +- nsspur64src/vm/cointerp.h | 3 +- nsspur64src/vm/gcc3x-cointerp.c | 117 +- nsspursrc/vm/cogit.h | 2 +- nsspursrc/vm/cogitARMv5.c | 733 +++-- nsspursrc/vm/cogitIA32.c | 743 +++-- nsspursrc/vm/cogitMIPSEL.c | 739 +++-- nsspursrc/vm/cointerp.c | 111 +- nsspursrc/vm/cointerp.h | 3 +- nsspursrc/vm/gcc3x-cointerp.c | 111 +- nsspurstack64src/vm/gcc3x-interp.c | 64 +- nsspurstack64src/vm/interp.c | 64 +- nsspurstacksrc/vm/gcc3x-interp.c | 64 +- nsspurstacksrc/vm/interp.c | 64 +- .../plugins/FilePlugin/sqWin32FilePrims.c | 2 +- spur64src/vm/cogit.h | 2 +- spur64src/vm/cogitX64SysV.c | 745 +++-- spur64src/vm/cogitX64WIN64.c | 745 +++-- spur64src/vm/cointerp.c | 121 +- spur64src/vm/cointerp.h | 3 +- spur64src/vm/gcc3x-cointerp.c | 121 +- spurlowcode64src/vm/cogit.h | 2 +- spurlowcode64src/vm/cogitX64SysV.c | 2608 +++++++++------ spurlowcode64src/vm/cogitX64WIN64.c | 2614 +++++++++------ spurlowcode64src/vm/cointerp.c | 111 +- spurlowcode64src/vm/cointerp.h | 3 +- spurlowcode64src/vm/gcc3x-cointerp.c | 111 +- spurlowcodesrc/vm/cogit.h | 2 +- spurlowcodesrc/vm/cogitARMv5.c | 2750 +++++++++------- spurlowcodesrc/vm/cogitIA32.c | 2828 ++++++++++------- spurlowcodesrc/vm/cogitMIPSEL.c | 2826 +++++++++------- spurlowcodesrc/vm/cointerp.c | 115 +- spurlowcodesrc/vm/cointerp.h | 5 +- spurlowcodesrc/vm/gcc3x-cointerp.c | 115 +- spurlowcodestack64src/vm/gcc3x-interp.c | 64 +- spurlowcodestack64src/vm/interp.c | 64 +- spurlowcodestacksrc/vm/gcc3x-interp.c | 64 +- spurlowcodestacksrc/vm/interp.c | 64 +- spursista64src/vm/cogit.h | 2 +- spursista64src/vm/cogitX64SysV.c | 845 +++-- spursista64src/vm/cogitX64WIN64.c | 835 +++-- spursista64src/vm/cointerp.c | 111 +- spursista64src/vm/cointerp.h | 3 +- spursista64src/vm/gcc3x-cointerp.c | 111 +- spursistasrc/vm/cogit.h | 2 +- spursistasrc/vm/cogitARMv5.c | 839 +++-- spursistasrc/vm/cogitIA32.c | 841 +++-- spursistasrc/vm/cogitMIPSEL.c | 847 +++-- spursistasrc/vm/cointerp.c | 117 +- spursistasrc/vm/cointerp.h | 3 +- spursistasrc/vm/gcc3x-cointerp.c | 117 +- spursrc/vm/cogit.h | 2 +- spursrc/vm/cogitARMv5.c | 747 +++-- spursrc/vm/cogitIA32.c | 755 +++-- spursrc/vm/cogitMIPSEL.c | 747 +++-- spursrc/vm/cointerp.c | 115 +- spursrc/vm/cointerp.h | 5 +- spursrc/vm/gcc3x-cointerp.c | 115 +- spurstack64src/vm/gcc3x-interp.c | 64 +- spurstack64src/vm/interp.c | 64 +- spurstacksrc/vm/gcc3x-interp.c | 64 +- spurstacksrc/vm/interp.c | 64 +- .../ADPCMCodecPlugin/ADPCMCodecPlugin.c | 11 +- src/plugins/AioPlugin/AioPlugin.c | 3 +- .../AsynchFilePlugin/AsynchFilePlugin.c | 11 +- src/plugins/B2DPlugin/B2DPlugin.c | 11 +- .../B3DAcceleratorPlugin.c | 11 +- .../BMPReadWriterPlugin/BMPReadWriterPlugin.c | 11 +- src/plugins/BitBltPlugin/BitBltPlugin.c | 11 +- src/plugins/BochsIA32Plugin/BochsIA32Plugin.c | 11 +- src/plugins/BochsX64Plugin/BochsX64Plugin.c | 11 +- src/plugins/CameraPlugin/CameraPlugin.c | 11 +- src/plugins/CroquetPlugin/CroquetPlugin.c | 11 +- src/plugins/DESPlugin/DESPlugin.c | 75 +- src/plugins/DSAPrims/DSAPrims.c | 3 +- src/plugins/DropPlugin/DropPlugin.c | 11 +- src/plugins/FFTPlugin/FFTPlugin.c | 11 +- .../FileAttributesPlugin.c | 1207 ++++--- src/plugins/FileCopyPlugin/FileCopyPlugin.c | 11 +- src/plugins/FilePlugin/FilePlugin.c | 73 +- .../FloatArrayPlugin/FloatArrayPlugin.c | 11 +- src/plugins/FloatMathPlugin/FloatMathPlugin.c | 11 +- src/plugins/GdbARMPlugin/GdbARMPlugin.c | 11 +- src/plugins/GeniePlugin/GeniePlugin.c | 11 +- .../HostWindowPlugin/HostWindowPlugin.c | 11 +- src/plugins/IA32ABI/IA32ABI.c | 11 +- src/plugins/ImmX11Plugin/ImmX11Plugin.c | 11 +- .../InternetConfigPlugin.c | 11 +- .../JPEGReadWriter2Plugin.c | 11 +- .../JPEGReaderPlugin/JPEGReaderPlugin.c | 11 +- .../JoystickTabletPlugin.c | 11 +- src/plugins/Klatt/Klatt.c | 11 +- src/plugins/LargeIntegers/LargeIntegers.c | 13 +- src/plugins/LocalePlugin/LocalePlugin.c | 11 +- src/plugins/MD5Plugin/MD5Plugin.c | 3 +- src/plugins/MIDIPlugin/MIDIPlugin.c | 11 +- .../MacMenubarPlugin/MacMenubarPlugin.c | 11 +- src/plugins/Matrix2x3Plugin/Matrix2x3Plugin.c | 11 +- .../MiscPrimitivePlugin/MiscPrimitivePlugin.c | 669 ++-- src/plugins/Mpeg3Plugin/Mpeg3Plugin.c | 11 +- src/plugins/QuicktimePlugin/QuicktimePlugin.c | 11 +- src/plugins/RePlugin/RePlugin.c | 11 +- src/plugins/SHA256Plugin/SHA256Plugin.c | 3 +- src/plugins/ScratchPlugin/ScratchPlugin.c | 11 +- src/plugins/SecurityPlugin/SecurityPlugin.c | 11 +- src/plugins/SerialPlugin/SerialPlugin.c | 11 +- src/plugins/SocketPlugin/SocketPlugin.c | 11 +- src/plugins/SoundCodecPrims/SoundCodecPrims.c | 11 +- .../SoundGenerationPlugin.c | 15 +- src/plugins/SoundPlugin/SoundPlugin.c | 11 +- src/plugins/Squeak3D/Squeak3D.c | 3 +- src/plugins/SqueakFFIPrims/ARM32FFIPlugin.c | 11 +- src/plugins/SqueakFFIPrims/IA32FFIPlugin.c | 11 +- src/plugins/SqueakFFIPrims/X64SysVFFIPlugin.c | 11 +- .../SqueakFFIPrims/X64Win64FFIPlugin.c | 11 +- src/plugins/SqueakSSL/SqueakSSL.c | 11 +- .../StarSqueakPlugin/StarSqueakPlugin.c | 11 +- src/plugins/UUIDPlugin/UUIDPlugin.c | 11 +- src/plugins/UnicodePlugin/UnicodePlugin.c | 11 +- .../UnixOSProcessPlugin/UnixOSProcessPlugin.c | 4 +- .../VMProfileLinuxSupportPlugin.c | 11 +- .../VMProfileMacSupportPlugin.c | 11 +- src/plugins/WeDoPlugin/WeDoPlugin.c | 11 +- .../Win32OSProcessPlugin.c | 3 +- .../XDisplayControlPlugin.c | 3 +- src/plugins/ZipPlugin/ZipPlugin.c | 11 +- src/vm/cogit.h | 2 +- src/vm/cogitARMv5.c | 721 +++-- src/vm/cogitIA32.c | 729 +++-- src/vm/cogitMIPSEL.c | 725 +++-- src/vm/cointerp.c | 111 +- src/vm/cointerp.h | 3 +- src/vm/cointerpmt.c | 113 +- src/vm/cointerpmt.h | 3 +- src/vm/gcc3x-cointerp.c | 111 +- src/vm/gcc3x-cointerpmt.c | 113 +- stacksrc/vm/gcc3x-interp.c | 62 +- stacksrc/vm/interp.c | 62 +- 141 files changed, 21026 insertions(+), 12277 deletions(-) diff --git a/nsspur64src/vm/cogit.h b/nsspur64src/vm/cogit.h index ab1b7f4f25..9898fde651 100644 --- a/nsspur64src/vm/cogit.h +++ b/nsspur64src/vm/cogit.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ diff --git a/nsspur64src/vm/cogitX64SysV.c b/nsspur64src/vm/cogitX64SysV.c index 660fc7c5bb..1894ebc2b2 100644 --- a/nsspur64src/vm/cogitX64SysV.c +++ b/nsspur64src/vm/cogitX64SysV.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -342,7 +342,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 3 #define XCHGRR 157 @@ -433,7 +432,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -939,7 +939,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static sqInt NoDbgRegParms availableRegisterOrNoneFor(AbstractInstruction * self_in_availableRegisterOrNoneFor, sqInt liveRegsMask); static sqInt NoDbgRegParms callFullTargetFromReturnAddress(AbstractInstruction * self_in_callFullTargetFromReturnAddress, sqInt callSiteReturnAddress); @@ -1198,7 +1197,6 @@ static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmuta static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1209,12 +1207,14 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfExtBGT2(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1226,7 +1226,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1236,16 +1235,18 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); static sqInt NoDbgRegParms v3or4PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils); static sqInt NoDbgRegParms v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1920,7 +1921,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt outerSendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; @@ -1946,7 +1946,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2031,6 +2030,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -4230,6 +4230,7 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ @@ -4247,7 +4248,12 @@ cogselector(sqInt aMethodObj, sqInt aSelectorOop) } } assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -17254,7 +17260,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -17304,7 +17310,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -17582,8 +17588,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -17774,13 +17781,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -23300,11 +23300,7 @@ sizeImmediateGroup1at(AbstractInstruction * self_in_sizeImmediateGroup1at, sqInt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -26711,10 +26707,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -27040,6 +27033,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -27497,7 +27493,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -27523,7 +27520,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -27564,18 +27561,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -27647,7 +27643,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -28083,6 +28079,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -28194,7 +28191,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -28425,11 +28429,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -28465,13 +28477,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -28543,10 +28563,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -28556,13 +28578,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -28614,7 +28650,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -28677,7 +28713,7 @@ genNSSendnumArgsdepthsendTable(sqInt selectorIndex, sqInt numArgs, sqInt depth, anInstruction = genoperandoperand(MoveCwR, nsSendCache, SendNumArgsReg); CallNewspeakSend(sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); ssPushRegister(ReceiverResultReg); return 0; } @@ -29000,6 +29036,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -29007,7 +29044,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -29034,11 +29078,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -29104,7 +29147,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -29116,9 +29159,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -29220,6 +29263,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -29239,7 +29283,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((((rcvrInt = ((ssValue(1))->constant)))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -29282,7 +29326,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -29457,6 +29508,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -29474,14 +29526,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((((argInt = ((ssTop())->constant)))) & 7) == 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((((ssValue(1))->constant))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -29654,6 +29713,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -29677,7 +29737,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -29703,6 +29770,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -29732,7 +29800,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -29744,7 +29812,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -29763,6 +29838,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -29780,7 +29856,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -29837,7 +29920,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -29862,6 +29945,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -29870,7 +29954,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -29905,60 +29996,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -29968,57 +30037,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -30026,16 +30099,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -30094,6 +30168,8 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; AbstractInstruction *anInstruction3; + sqInt i; + sqInt i1; sqInt index; sqInt literal; sqInt literal1; @@ -30103,9 +30179,16 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) assert(needsFrame); ssAllocateCallReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - numArgs, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - numArgs)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= (simStackPtr - numArgs); i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - numArgs) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* The arguments must be pushed to the stack, and hence the receiver @@ -30134,7 +30217,14 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) genoperand(PushR, ReceiverResultReg); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { if (numArgs > 0) { @@ -30170,10 +30260,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -30184,7 +30284,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -30193,7 +30300,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -30264,7 +30378,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -30272,7 +30385,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -30285,38 +30409,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -30327,6 +30454,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfExtBGT2: */ static sqInt NoDbgRegParms needsFrameIfExtBGT2(sqInt stackDelta) @@ -30410,6 +30553,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -30420,6 +30574,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -30439,7 +30594,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -30558,6 +30718,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -30634,7 +30795,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -30692,7 +30858,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1ULL << requiredReg1) | ((1ULL << requiredReg2) | (1ULL << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1ULL << requiredReg1) | (1ULL << requiredReg2)) | (1ULL << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -30707,6 +30873,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -30721,12 +30888,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -30752,30 +30927,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1ULL << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -30785,15 +30936,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -30809,15 +30969,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -30828,11 +31000,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -30840,18 +31034,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -30870,18 +31054,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -30890,17 +31091,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -30908,6 +31126,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -30915,8 +31135,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -30926,17 +31162,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -30947,6 +31200,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -31014,13 +31274,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -31038,6 +31291,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -31137,6 +31421,13 @@ v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aM : 0)); } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -31146,18 +31437,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/nsspur64src/vm/cogitX64WIN64.c b/nsspur64src/vm/cogitX64WIN64.c index 735423a68a..db7fef657d 100644 --- a/nsspur64src/vm/cogitX64WIN64.c +++ b/nsspur64src/vm/cogitX64WIN64.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -342,7 +342,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 3 #define XCHGRR 157 @@ -433,7 +432,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -579,7 +579,7 @@ static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static CogMethod * NoDbgRegParms fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -652,7 +652,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -939,7 +939,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static sqInt NoDbgRegParms availableRegisterOrNoneFor(AbstractInstruction * self_in_availableRegisterOrNoneFor, sqInt liveRegsMask); static sqInt NoDbgRegParms callFullTargetFromReturnAddress(AbstractInstruction * self_in_callFullTargetFromReturnAddress, sqInt callSiteReturnAddress); @@ -1198,7 +1197,6 @@ static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmuta static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1209,12 +1207,14 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfExtBGT2(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1226,7 +1226,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1236,16 +1235,18 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); static sqInt NoDbgRegParms v3or4PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils); static sqInt NoDbgRegParms v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1920,7 +1921,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt outerSendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; @@ -1946,7 +1946,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2031,6 +2030,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -2788,7 +2788,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -4230,6 +4230,7 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ @@ -4247,7 +4248,12 @@ cogselector(sqInt aMethodObj, sqInt aSelectorOop) } } assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -5697,7 +5703,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -7516,7 +7522,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -17262,7 +17268,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -17312,7 +17318,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -17590,8 +17596,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -17782,13 +17789,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -23308,11 +23308,7 @@ sizeImmediateGroup1at(AbstractInstruction * self_in_sizeImmediateGroup1at, sqInt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -26740,10 +26736,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -27069,6 +27062,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -27526,7 +27522,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -27552,7 +27549,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -27593,18 +27590,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -27676,7 +27672,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -28112,6 +28108,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -28223,7 +28220,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -28454,11 +28458,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -28494,13 +28506,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -28572,10 +28592,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -28585,13 +28607,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -28643,7 +28679,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -28706,7 +28742,7 @@ genNSSendnumArgsdepthsendTable(sqInt selectorIndex, sqInt numArgs, sqInt depth, anInstruction = genoperandoperand(MoveCwR, nsSendCache, SendNumArgsReg); CallNewspeakSend(sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); ssPushRegister(ReceiverResultReg); return 0; } @@ -29029,6 +29065,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -29036,7 +29073,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -29063,11 +29107,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -29133,7 +29176,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -29145,9 +29188,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -29249,6 +29292,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -29268,7 +29312,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((((rcvrInt = ((ssValue(1))->constant)))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -29311,7 +29355,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -29486,6 +29537,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -29503,14 +29555,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((((argInt = ((ssTop())->constant)))) & 7) == 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((((ssValue(1))->constant))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -29683,6 +29742,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -29706,7 +29766,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -29732,6 +29799,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -29761,7 +29829,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -29773,7 +29841,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -29792,6 +29867,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -29809,7 +29885,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -29866,7 +29949,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -29891,6 +29974,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -29899,7 +29983,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -29934,60 +30025,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -29997,57 +30066,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -30055,16 +30128,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -30123,6 +30197,8 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; AbstractInstruction *anInstruction3; + sqInt i; + sqInt i1; sqInt index; sqInt literal; sqInt literal1; @@ -30132,9 +30208,16 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) assert(needsFrame); ssAllocateCallReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - numArgs, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - numArgs)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= (simStackPtr - numArgs); i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - numArgs) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* The arguments must be pushed to the stack, and hence the receiver @@ -30163,7 +30246,14 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) genoperand(PushR, ReceiverResultReg); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { if (numArgs > 0) { @@ -30199,10 +30289,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -30213,7 +30313,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -30222,7 +30329,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -30293,7 +30407,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -30301,7 +30414,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -30314,38 +30438,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -30356,6 +30483,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfExtBGT2: */ static sqInt NoDbgRegParms needsFrameIfExtBGT2(sqInt stackDelta) @@ -30439,6 +30582,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -30449,6 +30603,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -30468,7 +30623,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -30587,6 +30747,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -30663,7 +30824,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -30721,7 +30887,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1ULL << requiredReg1) | ((1ULL << requiredReg2) | (1ULL << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1ULL << requiredReg1) | (1ULL << requiredReg2)) | (1ULL << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -30736,6 +30902,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -30750,12 +30917,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -30781,30 +30956,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1ULL << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -30814,15 +30965,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -30838,15 +30998,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -30857,11 +31029,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -30869,18 +31063,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -30899,18 +31083,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -30919,17 +31120,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -30937,6 +31155,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -30944,8 +31164,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -30955,17 +31191,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -30976,6 +31229,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -31043,13 +31303,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -31067,6 +31320,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -31166,6 +31450,13 @@ v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aM : 0)); } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -31175,18 +31466,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/nsspur64src/vm/cointerp.c b/nsspur64src/vm/cointerp.c index 12fa6411bf..cd5327d187 100644 --- a/nsspur64src/vm/cointerp.c +++ b/nsspur64src/vm/cointerp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -536,7 +536,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1530,7 +1529,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2587,7 +2586,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.2320"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.2347"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -19963,24 +19962,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -22801,7 +22782,7 @@ printFrameWithSP(char *theFP, char *theSP) usqInt index; sqInt methodField; usqInt numArgs; - usqInt numTemps; + sqInt numTemps; char *rcvrAddress; sqInt rcvrOrClosure; sqInt theMethod; @@ -26961,7 +26942,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((sqInt)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -66358,8 +66347,8 @@ void (*functionPointerForinClass(sqInt primIdx,sqInt theClass))(void) static sqInt getErrorObjectFromPrimFailCode(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqInt clone; - usqInt errObj; + sqInt clone; + sqInt errObj; sqInt fieldIndex; sqInt i; sqInt knownClassIndex; @@ -69675,7 +69664,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -75594,7 +75583,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -75611,7 +75608,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -75619,11 +75616,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -75657,7 +75654,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -79067,7 +79072,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -79371,7 +79376,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -79402,18 +79406,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -79464,10 +79471,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -79475,22 +79482,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -79502,18 +79509,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -79795,7 +79802,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/nsspur64src/vm/cointerp.h b/nsspur64src/vm/cointerp.h index abafab2972..9620cd38e9 100644 --- a/nsspur64src/vm/cointerp.h +++ b/nsspur64src/vm/cointerp.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ @@ -327,6 +327,7 @@ extern sqInt literalofMethod(sqInt offset, sqInt methodPointer); extern void longPrintOop(sqInt oop); extern sqInt longStoreBytecodeForHeader(sqInt methodHeader); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodClassAssociationOf(sqInt methodPointer); extern sqInt methodClassOf(sqInt methodPointer); extern sqInt methodPrimitiveIndex(void); diff --git a/nsspur64src/vm/gcc3x-cointerp.c b/nsspur64src/vm/gcc3x-cointerp.c index ee7b7b9d98..20bec42f72 100644 --- a/nsspur64src/vm/gcc3x-cointerp.c +++ b/nsspur64src/vm/gcc3x-cointerp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -539,7 +539,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1533,7 +1532,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2590,7 +2589,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.2320"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.2347"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -19972,24 +19971,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -22810,7 +22791,7 @@ printFrameWithSP(char *theFP, char *theSP) usqInt index; sqInt methodField; usqInt numArgs; - usqInt numTemps; + sqInt numTemps; char *rcvrAddress; sqInt rcvrOrClosure; sqInt theMethod; @@ -26970,7 +26951,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((sqInt)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -66367,8 +66356,8 @@ void (*functionPointerForinClass(sqInt primIdx,sqInt theClass))(void) static sqInt getErrorObjectFromPrimFailCode(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqInt clone; - usqInt errObj; + sqInt clone; + sqInt errObj; sqInt fieldIndex; sqInt i; sqInt knownClassIndex; @@ -69684,7 +69673,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -75603,7 +75592,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -75620,7 +75617,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -75628,11 +75625,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -75666,7 +75663,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -79076,7 +79081,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -79380,7 +79385,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -79411,18 +79415,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -79473,10 +79480,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -79484,22 +79491,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -79511,18 +79518,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -79804,7 +79811,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/nsspursrc/vm/cogit.h b/nsspursrc/vm/cogit.h index ab1b7f4f25..9898fde651 100644 --- a/nsspursrc/vm/cogit.h +++ b/nsspursrc/vm/cogit.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ diff --git a/nsspursrc/vm/cogitARMv5.c b/nsspursrc/vm/cogitARMv5.c index a33c7a800e..ed1729fee1 100644 --- a/nsspursrc/vm/cogitARMv5.c +++ b/nsspursrc/vm/cogitARMv5.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -312,7 +312,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstOpcode 8 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 10 #define VC 7 @@ -401,7 +400,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -646,7 +646,7 @@ static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static CogMethod * NoDbgRegParms fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -1012,7 +1012,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms allocateLiteral(sqInt aLiteral); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1204,7 +1203,6 @@ static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmuta static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1215,12 +1213,14 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfExtBGT2(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1232,7 +1232,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1242,16 +1241,18 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); static sqInt NoDbgRegParms v3or4PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils); static sqInt NoDbgRegParms v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1934,7 +1935,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt outerSendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; @@ -1960,7 +1960,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2042,6 +2041,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -8875,6 +8875,7 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ @@ -8892,7 +8893,12 @@ cogselector(sqInt aMethodObj, sqInt aSelectorOop) } } assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -10364,7 +10370,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static sqInt NoDbgRegParms +static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -22279,7 +22285,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -22331,7 +22337,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -23133,8 +23139,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -23343,13 +23350,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -26636,10 +26636,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -26983,6 +26980,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -27458,7 +27458,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -27484,7 +27485,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -27525,18 +27526,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -27608,7 +27608,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -28044,6 +28044,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -28156,7 +28157,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -28410,11 +28418,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; sqInt address; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -28450,13 +28466,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -28534,10 +28558,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -28547,13 +28573,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -28608,7 +28648,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -28682,7 +28722,7 @@ genNSSendnumArgsdepthsendTable(sqInt selectorIndex, sqInt numArgs, sqInt depth, (anInstruction->dependent = allocateLiteral(nsSendCache)); CallNewspeakSend(sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); ssPushRegister(ReceiverResultReg); return 0; } @@ -29032,6 +29072,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -29039,7 +29080,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -29066,11 +29114,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -29139,7 +29186,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -29151,9 +29198,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -29255,6 +29302,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -29270,7 +29318,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -29313,7 +29361,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -29508,6 +29563,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -29525,14 +29581,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -29711,6 +29774,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -29737,7 +29801,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -29763,6 +29834,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -29795,7 +29867,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -29807,7 +29879,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); if (usesOutOfLineLiteral(anInstruction1)) { @@ -29829,6 +29908,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -29846,7 +29926,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -29909,7 +29996,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) if (usesOutOfLineLiteral(anInstruction)) { (anInstruction->dependent = locateLiteral(offset)); } - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -29934,6 +30021,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -29942,7 +30030,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -29979,60 +30074,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -30042,57 +30115,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -30100,16 +30177,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -30168,15 +30246,24 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; AbstractInstruction *anInstruction3; + sqInt i; + sqInt i1; sqInt index; sqInt numSpilled; assert(needsFrame); ssAllocateCallReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - numArgs, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - numArgs)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= (simStackPtr - numArgs); i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - numArgs) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* The arguments must be pushed to the stack, and hence the receiver @@ -30214,7 +30301,14 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) genoperand(PushR, ReceiverResultReg); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { if (numArgs > 0) { @@ -30250,10 +30344,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -30264,7 +30368,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -30273,7 +30384,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -30344,7 +30462,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -30352,7 +30469,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; + sqInt i1; + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -30365,38 +30493,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -30407,6 +30538,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfExtBGT2: */ static sqInt NoDbgRegParms needsFrameIfExtBGT2(sqInt stackDelta) @@ -30490,6 +30637,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -30500,6 +30658,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -30519,7 +30678,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -30638,6 +30802,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -30714,7 +30879,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -30772,7 +30942,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -30787,6 +30957,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -30801,12 +30972,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -30832,30 +31011,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -30865,15 +31020,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -30889,15 +31053,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -30908,11 +31084,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -30920,18 +31118,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -30950,18 +31138,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -30970,17 +31175,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -30988,6 +31210,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -30995,8 +31219,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -31006,17 +31246,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -31027,6 +31284,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -31094,13 +31358,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -31118,6 +31375,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -31217,6 +31505,13 @@ v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aM : 0)); } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -31226,18 +31521,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/nsspursrc/vm/cogitIA32.c b/nsspursrc/vm/cogitIA32.c index 72dadb55e9..0ff4f4dbc8 100644 --- a/nsspursrc/vm/cogitIA32.c +++ b/nsspursrc/vm/cogitIA32.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -327,7 +327,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #undef VarBaseReg #define XCHGAwR 155 @@ -417,7 +416,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -709,7 +709,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -983,7 +983,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); static AbstractInstruction * NoDbgRegParms checkQuickConstantforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1169,7 +1168,6 @@ static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmuta static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1180,12 +1178,14 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfExtBGT2(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1197,7 +1197,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1207,16 +1206,18 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); static sqInt NoDbgRegParms v3or4PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils); static sqInt NoDbgRegParms v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1894,7 +1895,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt outerSendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; @@ -1920,7 +1920,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2003,6 +2002,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -7153,11 +7153,7 @@ stackPageInterruptHeadroomBytes(AbstractInstruction * self_in_stackPageInterrupt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -7476,7 +7472,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -8911,6 +8907,7 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ @@ -8928,7 +8925,12 @@ cogselector(sqInt aMethodObj, sqInt aSelectorOop) } } assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -12187,7 +12189,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -21383,7 +21385,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -21433,7 +21435,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -21718,8 +21720,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -21910,13 +21913,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -24915,10 +24911,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -25244,6 +25237,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -25701,7 +25697,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -25727,7 +25724,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -25768,18 +25765,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -25851,7 +25847,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -26281,6 +26277,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -26392,7 +26389,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -26623,11 +26627,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -26663,13 +26675,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -26741,10 +26761,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -26754,13 +26776,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -26812,7 +26848,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -26875,7 +26911,7 @@ genNSSendnumArgsdepthsendTable(sqInt selectorIndex, sqInt numArgs, sqInt depth, anInstruction = genoperandoperand(MoveCwR, nsSendCache, SendNumArgsReg); CallNewspeakSend(sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); ssPushRegister(ReceiverResultReg); return 0; } @@ -27197,6 +27233,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -27204,7 +27241,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -27231,11 +27275,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -27301,7 +27344,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -27313,9 +27356,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -27417,6 +27460,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -27436,7 +27480,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -27479,7 +27523,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -27654,6 +27705,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -27671,14 +27723,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -27851,6 +27910,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -27874,7 +27934,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -27900,6 +27967,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -27929,7 +27997,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -27941,7 +28009,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -27960,6 +28035,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -27977,7 +28053,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -28034,7 +28117,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -28059,6 +28142,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -28067,7 +28151,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -28102,60 +28193,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -28165,57 +28234,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -28223,16 +28296,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -28291,6 +28365,8 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; AbstractInstruction *anInstruction3; + sqInt i; + sqInt i1; sqInt index; sqInt literal; sqInt literal1; @@ -28300,9 +28376,16 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) assert(needsFrame); ssAllocateCallReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - numArgs, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - numArgs)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= (simStackPtr - numArgs); i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - numArgs) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* The arguments must be pushed to the stack, and hence the receiver @@ -28331,7 +28414,14 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) genoperand(PushR, ReceiverResultReg); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { if (numArgs > 0) { @@ -28367,10 +28457,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -28381,7 +28481,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -28390,7 +28497,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -28461,7 +28575,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -28469,7 +28582,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -28482,38 +28606,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -28524,6 +28651,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfExtBGT2: */ static sqInt NoDbgRegParms needsFrameIfExtBGT2(sqInt stackDelta) @@ -28607,6 +28750,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -28617,6 +28771,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -28636,7 +28791,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -28755,6 +28915,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -28831,7 +28992,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -28889,7 +29055,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -28904,6 +29070,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -28918,12 +29085,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -28949,30 +29124,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -28982,15 +29133,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -29006,15 +29166,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -29025,11 +29197,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -29037,18 +29231,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -29067,18 +29251,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -29087,17 +29288,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -29105,6 +29323,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -29112,8 +29332,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -29123,17 +29359,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -29144,6 +29397,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -29211,13 +29471,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -29235,6 +29488,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -29334,6 +29618,13 @@ v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aM : 0)); } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -29343,18 +29634,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/nsspursrc/vm/cogitMIPSEL.c b/nsspursrc/vm/cogitMIPSEL.c index dd3218f9cf..63a73c9417 100644 --- a/nsspursrc/vm/cogitMIPSEL.c +++ b/nsspursrc/vm/cogitMIPSEL.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -358,7 +358,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define V0 2 #define ValueIndex 1 #define VarBaseReg 22 @@ -446,7 +445,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -654,7 +654,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -1129,7 +1129,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); static AbstractInstruction * NoDbgRegParms checkQuickConstantforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1314,7 +1313,6 @@ static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmuta static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1325,12 +1323,14 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfExtBGT2(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1342,7 +1342,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1352,16 +1351,18 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); static sqInt NoDbgRegParms v3or4PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils); static sqInt NoDbgRegParms v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -2039,7 +2040,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt outerSendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; @@ -2065,7 +2065,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2146,6 +2145,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -2669,7 +2669,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -4104,6 +4104,7 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ @@ -4121,7 +4122,12 @@ cogselector(sqInt aMethodObj, sqInt aSelectorOop) } } assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -5179,7 +5185,7 @@ static sqInt NoDbgRegParms createCPICData(CogMethod *cPIC) { sqInt array; - usqInt entryPoint; + sqInt entryPoint; sqInt i; sqInt pc; CogMethod *targetMethod; @@ -7359,7 +7365,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -20672,7 +20678,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -20722,7 +20728,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -21007,8 +21013,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -21199,13 +21206,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -24188,10 +24188,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -24519,6 +24516,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -24980,7 +24980,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -25006,7 +25007,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -25047,18 +25048,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -25130,7 +25130,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -25566,6 +25566,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -25677,7 +25678,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -25908,11 +25916,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -25948,13 +25964,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -26026,10 +26050,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -26039,13 +26065,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -26097,7 +26137,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -26163,7 +26203,7 @@ genNSSendnumArgsdepthsendTable(sqInt selectorIndex, sqInt numArgs, sqInt depth, anInstruction = genoperandoperand(MoveCwR, nsSendCache, SendNumArgsReg); CallNewspeakSend(sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); ssPushRegister(ReceiverResultReg); return 0; } @@ -26485,6 +26525,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -26492,7 +26533,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -26519,11 +26567,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -26589,7 +26636,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -26601,9 +26648,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -26705,6 +26752,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -26724,7 +26772,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -26767,7 +26815,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -26942,6 +26997,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -26959,14 +27015,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -27139,6 +27202,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -27162,7 +27226,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -27188,6 +27259,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -27217,7 +27289,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -27229,7 +27301,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -27248,6 +27327,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -27265,7 +27345,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -27322,7 +27409,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -27347,6 +27434,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -27355,7 +27443,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -27392,60 +27487,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -27455,57 +27528,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -27513,16 +27590,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -27581,6 +27659,8 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; AbstractInstruction *anInstruction3; + sqInt i; + sqInt i1; sqInt index; sqInt literal; sqInt literal1; @@ -27590,9 +27670,16 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) assert(needsFrame); ssAllocateCallReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - numArgs, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - numArgs)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= (simStackPtr - numArgs); i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - numArgs) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* The arguments must be pushed to the stack, and hence the receiver @@ -27621,7 +27708,14 @@ marshallAbsentReceiverSendArguments(sqInt numArgs) genoperand(PushR, ReceiverResultReg); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { if (numArgs > 0) { @@ -27657,10 +27751,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -27671,7 +27775,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -27680,7 +27791,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -27751,7 +27869,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -27759,7 +27876,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -27772,38 +27900,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -27814,6 +27945,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfExtBGT2: */ static sqInt NoDbgRegParms needsFrameIfExtBGT2(sqInt stackDelta) @@ -27897,6 +28044,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -27907,6 +28065,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -27926,7 +28085,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -28045,6 +28209,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -28121,7 +28286,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -28179,7 +28349,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -28194,6 +28364,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -28208,12 +28379,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -28239,30 +28418,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -28272,15 +28427,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -28296,15 +28460,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -28315,11 +28491,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -28327,18 +28525,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -28357,18 +28545,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -28377,17 +28582,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -28395,6 +28617,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -28402,8 +28626,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -28413,17 +28653,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -28434,6 +28691,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -28501,13 +28765,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -28525,6 +28782,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -28624,6 +28912,13 @@ v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aM : 0)); } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -28633,18 +28928,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/nsspursrc/vm/cointerp.c b/nsspursrc/vm/cointerp.c index fbc91c30ad..435a824a87 100644 --- a/nsspursrc/vm/cointerp.c +++ b/nsspursrc/vm/cointerp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -535,7 +535,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1507,7 +1506,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2565,7 +2564,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.2320"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.2347"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -19155,24 +19154,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -26318,7 +26299,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -67993,7 +67982,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -74044,7 +74033,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -74061,7 +74058,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -74069,11 +74066,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -74107,7 +74104,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -77638,7 +77643,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -77991,7 +77996,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -78021,18 +78025,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -78083,10 +78090,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -78094,22 +78101,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -78121,18 +78128,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -78395,7 +78402,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/nsspursrc/vm/cointerp.h b/nsspursrc/vm/cointerp.h index 01d76f8b43..19810c7b41 100644 --- a/nsspursrc/vm/cointerp.h +++ b/nsspursrc/vm/cointerp.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ @@ -325,6 +325,7 @@ extern sqInt literalofMethod(sqInt offset, sqInt methodPointer); extern void longPrintOop(sqInt oop); extern sqInt longStoreBytecodeForHeader(sqInt methodHeader); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodClassAssociationOf(sqInt methodPointer); extern sqInt methodClassOf(sqInt methodPointer); extern sqInt methodPrimitiveIndex(void); diff --git a/nsspursrc/vm/gcc3x-cointerp.c b/nsspursrc/vm/gcc3x-cointerp.c index 2caeb32bae..a2943d474c 100644 --- a/nsspursrc/vm/gcc3x-cointerp.c +++ b/nsspursrc/vm/gcc3x-cointerp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -538,7 +538,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1510,7 +1509,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2568,7 +2567,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.2320"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.2347"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -19164,24 +19163,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -26327,7 +26308,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -68002,7 +67991,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -74053,7 +74042,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -74070,7 +74067,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -74078,11 +74075,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -74116,7 +74113,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -77647,7 +77652,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -78000,7 +78005,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -78030,18 +78034,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -78092,10 +78099,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -78103,22 +78110,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -78130,18 +78137,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -78404,7 +78411,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/nsspurstack64src/vm/gcc3x-interp.c b/nsspurstack64src/vm/gcc3x-interp.c index b55c9232b5..9341e7cfb6 100644 --- a/nsspurstack64src/vm/gcc3x-interp.c +++ b/nsspurstack64src/vm/gcc3x-interp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1273,7 +1273,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2341,7 +2341,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.2320"; +const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.2347"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -55254,6 +55254,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -58947,7 +58949,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -65931,6 +65933,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -65985,6 +65989,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -70381,7 +70387,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -70685,7 +70691,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -70716,18 +70721,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -70778,10 +70786,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -70789,22 +70797,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -70816,18 +70824,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -71328,6 +71336,8 @@ primitiveTerminateTo(void) assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -71434,7 +71444,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/nsspurstack64src/vm/interp.c b/nsspurstack64src/vm/interp.c index 70ffcbf243..e81875f3bf 100644 --- a/nsspurstack64src/vm/interp.c +++ b/nsspurstack64src/vm/interp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1270,7 +1270,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2338,7 +2338,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.2320"; +const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.2347"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -55245,6 +55245,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -58938,7 +58940,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -65922,6 +65924,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -65976,6 +65980,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -70372,7 +70378,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -70676,7 +70682,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -70707,18 +70712,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -70769,10 +70777,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -70780,22 +70788,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -70807,18 +70815,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -71319,6 +71327,8 @@ primitiveTerminateTo(void) assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -71425,7 +71435,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/nsspurstacksrc/vm/gcc3x-interp.c b/nsspurstacksrc/vm/gcc3x-interp.c index 6b6fbe0481..0ca72a649d 100644 --- a/nsspurstacksrc/vm/gcc3x-interp.c +++ b/nsspurstacksrc/vm/gcc3x-interp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1252,7 +1252,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2321,7 +2321,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.2320"; +const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.2347"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -53442,6 +53442,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -57149,7 +57151,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -64349,6 +64351,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -64403,6 +64407,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -68910,7 +68916,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -69263,7 +69269,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -69293,18 +69298,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -69355,10 +69363,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -69366,22 +69374,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -69393,18 +69401,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -69886,6 +69894,8 @@ primitiveTerminateTo(void) assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -69992,7 +70002,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/nsspurstacksrc/vm/interp.c b/nsspurstacksrc/vm/interp.c index 47b94b6303..038d16f75a 100644 --- a/nsspurstacksrc/vm/interp.c +++ b/nsspurstacksrc/vm/interp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1249,7 +1249,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2318,7 +2318,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.2320"; +const char *interpreterVersion = "Newspeak Virtual Machine StackInterpreterPrimitives_VMMaker.oscog-eem.2347"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -53433,6 +53433,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -57140,7 +57142,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -64340,6 +64342,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -64394,6 +64398,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -68901,7 +68907,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -69254,7 +69260,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -69284,18 +69289,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -69346,10 +69354,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -69357,22 +69365,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -69384,18 +69392,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -69877,6 +69885,8 @@ primitiveTerminateTo(void) assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -69983,7 +69993,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c b/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c index 9be5f90eda..9dbccda613 100644 --- a/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c +++ b/platforms/win32/plugins/FilePlugin/sqWin32FilePrims.c @@ -277,7 +277,7 @@ sqConnectToFile(SQFile *sqFile, void *file, sqInt writeFlag) * writeFlag indicates whether the file is read-only or writable * and must be compatible with the existing access. */ - sqFile->file = (HANDLE)file; + sqFile->file = (HANDLE)file; AddHandleToTable(win32Files, file); /* setSize(sqFile, 0); */ sqFile->sessionID = thisSession; diff --git a/spur64src/vm/cogit.h b/spur64src/vm/cogit.h index 7957f86f42..8e2b15a75d 100644 --- a/spur64src/vm/cogit.h +++ b/spur64src/vm/cogit.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ diff --git a/spur64src/vm/cogitX64SysV.c b/spur64src/vm/cogitX64SysV.c index 70359e5c99..77b23c3ad8 100644 --- a/spur64src/vm/cogitX64SysV.c +++ b/spur64src/vm/cogitX64SysV.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -340,7 +340,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 3 #define XCHGRR 157 @@ -430,7 +429,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -931,7 +931,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static sqInt NoDbgRegParms availableRegisterOrNoneFor(AbstractInstruction * self_in_availableRegisterOrNoneFor, sqInt liveRegsMask); static sqInt NoDbgRegParms callFullTargetFromReturnAddress(AbstractInstruction * self_in_callFullTargetFromReturnAddress, sqInt callSiteReturnAddress); @@ -1200,7 +1199,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1210,11 +1208,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1228,7 +1228,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1238,14 +1237,16 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1920,7 +1921,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -1944,7 +1944,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2028,6 +2027,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -4166,12 +4166,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -16721,7 +16727,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -16771,7 +16777,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -17049,8 +17055,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -17241,13 +17248,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -22756,11 +22756,7 @@ sizeImmediateGroup1at(AbstractInstruction * self_in_sizeImmediateGroup1at, sqInt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -26254,10 +26250,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -26650,6 +26643,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -27215,7 +27211,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -27241,7 +27238,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -27282,18 +27279,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -27365,7 +27361,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -27545,12 +27541,20 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -27685,7 +27689,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -27979,6 +27983,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -28090,7 +28095,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -28321,11 +28333,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -28361,13 +28381,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -28439,10 +28467,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -28452,13 +28482,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -28532,7 +28576,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -29020,6 +29064,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -29027,7 +29072,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -29054,11 +29106,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -29145,7 +29196,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -29157,9 +29208,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -29258,6 +29309,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -29277,7 +29329,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((((rcvrInt = ((ssValue(1))->constant)))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -29320,7 +29372,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -29495,6 +29554,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -29512,14 +29572,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((((argInt = ((ssTop())->constant)))) & 7) == 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((((ssValue(1))->constant))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -29692,6 +29759,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -29715,7 +29783,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -29741,6 +29816,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -29770,7 +29846,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -29782,7 +29858,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -29814,6 +29897,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -29852,7 +29936,14 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -29871,6 +29962,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -29888,7 +29980,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -29901,6 +30000,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -29912,7 +30012,14 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -29969,7 +30076,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -29994,6 +30101,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -30002,7 +30110,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -30037,60 +30152,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -30100,57 +30193,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -30158,16 +30255,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -30232,10 +30330,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -30246,7 +30354,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -30255,7 +30370,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -30326,7 +30448,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -30334,7 +30455,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -30347,38 +30479,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -30389,6 +30524,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -30464,6 +30615,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -30474,6 +30636,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -30493,7 +30656,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -30612,6 +30780,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -30687,7 +30856,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -30765,7 +30939,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1ULL << requiredReg1) | ((1ULL << requiredReg2) | (1ULL << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1ULL << requiredReg1) | (1ULL << requiredReg2)) | (1ULL << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -30780,6 +30954,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -30794,12 +30969,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -30825,30 +31008,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1ULL << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -30858,15 +31017,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -30882,15 +31050,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -30901,11 +31081,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -30913,18 +31115,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -30943,18 +31135,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -30963,17 +31172,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -30981,6 +31207,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -30988,8 +31216,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -30999,17 +31243,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -31020,6 +31281,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -31087,13 +31355,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -31111,6 +31372,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -31185,6 +31477,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -31194,18 +31493,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spur64src/vm/cogitX64WIN64.c b/spur64src/vm/cogitX64WIN64.c index a460295cd6..aef287dee1 100644 --- a/spur64src/vm/cogitX64WIN64.c +++ b/spur64src/vm/cogitX64WIN64.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -340,7 +340,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 3 #define XCHGRR 157 @@ -430,7 +429,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -931,7 +931,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static sqInt NoDbgRegParms availableRegisterOrNoneFor(AbstractInstruction * self_in_availableRegisterOrNoneFor, sqInt liveRegsMask); static sqInt NoDbgRegParms callFullTargetFromReturnAddress(AbstractInstruction * self_in_callFullTargetFromReturnAddress, sqInt callSiteReturnAddress); @@ -1200,7 +1199,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1210,11 +1208,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1228,7 +1228,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1238,14 +1237,16 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1920,7 +1921,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -1944,7 +1944,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2028,6 +2027,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -4166,12 +4166,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -16729,7 +16735,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -16779,7 +16785,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -17057,8 +17063,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -17249,13 +17256,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -22764,11 +22764,7 @@ sizeImmediateGroup1at(AbstractInstruction * self_in_sizeImmediateGroup1at, sqInt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -26283,10 +26279,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -26679,6 +26672,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -27244,7 +27240,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -27270,7 +27267,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -27311,18 +27308,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -27394,7 +27390,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -27574,12 +27570,20 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -27714,7 +27718,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -28008,6 +28012,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -28119,7 +28124,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -28350,11 +28362,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -28390,13 +28410,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -28468,10 +28496,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -28481,13 +28511,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -28561,7 +28605,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -29049,6 +29093,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -29056,7 +29101,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -29083,11 +29135,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -29174,7 +29225,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -29186,9 +29237,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -29287,6 +29338,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -29306,7 +29358,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((((rcvrInt = ((ssValue(1))->constant)))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -29349,7 +29401,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -29524,6 +29583,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -29541,14 +29601,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((((argInt = ((ssTop())->constant)))) & 7) == 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((((ssValue(1))->constant))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -29721,6 +29788,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -29744,7 +29812,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -29770,6 +29845,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -29799,7 +29875,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -29811,7 +29887,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -29843,6 +29926,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -29881,7 +29965,14 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -29900,6 +29991,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -29917,7 +30009,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -29930,6 +30029,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -29941,7 +30041,14 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -29998,7 +30105,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -30023,6 +30130,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -30031,7 +30139,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -30066,60 +30181,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -30129,57 +30222,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -30187,16 +30284,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -30261,10 +30359,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -30275,7 +30383,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -30284,7 +30399,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -30355,7 +30477,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -30363,7 +30484,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -30376,38 +30508,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -30418,6 +30553,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -30493,6 +30644,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -30503,6 +30665,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -30522,7 +30685,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -30641,6 +30809,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -30716,7 +30885,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -30794,7 +30968,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1ULL << requiredReg1) | ((1ULL << requiredReg2) | (1ULL << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1ULL << requiredReg1) | (1ULL << requiredReg2)) | (1ULL << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -30809,6 +30983,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -30823,12 +30998,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -30854,30 +31037,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1ULL << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -30887,15 +31046,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -30911,15 +31079,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -30930,11 +31110,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -30942,18 +31144,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -30972,18 +31164,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -30992,17 +31201,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -31010,6 +31236,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -31017,8 +31245,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -31028,17 +31272,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -31049,6 +31310,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -31116,13 +31384,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -31140,6 +31401,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -31214,6 +31506,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -31223,18 +31522,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spur64src/vm/cointerp.c b/spur64src/vm/cointerp.c index 59ccb414b0..18bf299623 100644 --- a/spur64src/vm/cointerp.c +++ b/spur64src/vm/cointerp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -522,7 +522,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1499,7 +1498,7 @@ static sqInt NoDbgRegParms lookupMNUInClass(sqInt class); static sqInt NoDbgRegParms lookupOrdinaryNoMNUEtcInClass(sqInt class); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); static void NoDbgRegParms makeContextSnapshotSafe(sqInt ctxt); -extern usqInt makePointwithxValueyValue(sqInt xValue, sqInt yValue); +extern sqInt makePointwithxValueyValue(sqInt xValue, sqInt yValue); static void mapInterpreterOops(void); static sqInt NoDbgRegParms markAndTraceStackPages(sqInt fullGCFlag); static void markAndTraceUntracedReachableStackPages(void); @@ -1507,7 +1506,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2561,7 +2560,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -7100,7 +7099,7 @@ interpret(void) sqInt context; sqInt i; sqInt initialIP; - sqInt newClosure; + usqInt newClosure; usqInt newClosure1; usqInt newObj; sqInt numArgs; @@ -13708,7 +13707,7 @@ interpret(void) sqInt header1; sqInt i; int ignoreContext; - usqInt newClosure; + sqInt newClosure; usqInt newClosure1; usqInt newObj; sqInt numArgs; @@ -13850,7 +13849,7 @@ interpret(void) sqInt context; sqInt i; sqInt initialIP; - sqInt newClosure; + usqInt newClosure; usqInt newClosure1; usqInt newObj; sqInt numArgs; @@ -18677,24 +18676,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -25286,7 +25267,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((sqInt)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -67413,7 +67402,7 @@ makeContextSnapshotSafe(sqInt ctxt) We know both will be integers so no value nor root checking is needed */ /* StackInterpreter>>#makePointwithxValue:yValue: */ -usqInt +sqInt makePointwithxValueyValue(sqInt xValue, sqInt yValue) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt classObj; @@ -67935,7 +67924,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -73827,7 +73816,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -73844,7 +73841,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -73852,11 +73849,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -73890,7 +73887,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -77300,7 +77305,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -77604,7 +77609,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -77635,18 +77639,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -77697,10 +77704,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -77708,22 +77715,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -77735,18 +77742,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -78028,7 +78035,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spur64src/vm/cointerp.h b/spur64src/vm/cointerp.h index 7a23cecd33..1c2f52c151 100644 --- a/spur64src/vm/cointerp.h +++ b/spur64src/vm/cointerp.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ @@ -324,6 +324,7 @@ extern sqInt literalofMethod(sqInt offset, sqInt methodPointer); extern void longPrintOop(sqInt oop); extern sqInt longStoreBytecodeForHeader(sqInt methodHeader); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodClassAssociationOf(sqInt methodPointer); extern sqInt methodClassOf(sqInt methodPointer); extern sqInt methodPrimitiveIndex(void); diff --git a/spur64src/vm/gcc3x-cointerp.c b/spur64src/vm/gcc3x-cointerp.c index 27e2dd5270..8ecaa64c08 100644 --- a/spur64src/vm/gcc3x-cointerp.c +++ b/spur64src/vm/gcc3x-cointerp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -525,7 +525,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1502,7 +1501,7 @@ static sqInt NoDbgRegParms lookupMNUInClass(sqInt class); static sqInt NoDbgRegParms lookupOrdinaryNoMNUEtcInClass(sqInt class); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); static void NoDbgRegParms makeContextSnapshotSafe(sqInt ctxt); -extern usqInt makePointwithxValueyValue(sqInt xValue, sqInt yValue); +extern sqInt makePointwithxValueyValue(sqInt xValue, sqInt yValue); static void mapInterpreterOops(void); static sqInt NoDbgRegParms markAndTraceStackPages(sqInt fullGCFlag); static void markAndTraceUntracedReachableStackPages(void); @@ -1510,7 +1509,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2564,7 +2563,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -7109,7 +7108,7 @@ interpret(void) sqInt context; sqInt i; sqInt initialIP; - sqInt newClosure; + usqInt newClosure; usqInt newClosure1; usqInt newObj; sqInt numArgs; @@ -13717,7 +13716,7 @@ interpret(void) sqInt header1; sqInt i; int ignoreContext; - usqInt newClosure; + sqInt newClosure; usqInt newClosure1; usqInt newObj; sqInt numArgs; @@ -13859,7 +13858,7 @@ interpret(void) sqInt context; sqInt i; sqInt initialIP; - sqInt newClosure; + usqInt newClosure; usqInt newClosure1; usqInt newObj; sqInt numArgs; @@ -18686,24 +18685,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -25295,7 +25276,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((sqInt)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -67422,7 +67411,7 @@ makeContextSnapshotSafe(sqInt ctxt) We know both will be integers so no value nor root checking is needed */ /* StackInterpreter>>#makePointwithxValue:yValue: */ -usqInt +sqInt makePointwithxValueyValue(sqInt xValue, sqInt yValue) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt classObj; @@ -67944,7 +67933,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -73836,7 +73825,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -73853,7 +73850,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -73861,11 +73858,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -73899,7 +73896,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -77309,7 +77314,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -77613,7 +77618,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -77644,18 +77648,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -77706,10 +77713,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -77717,22 +77724,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -77744,18 +77751,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -78037,7 +78044,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurlowcode64src/vm/cogit.h b/spurlowcode64src/vm/cogit.h index 6676dad49f..65b314cae3 100644 --- a/spurlowcode64src/vm/cogit.h +++ b/spurlowcode64src/vm/cogit.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ diff --git a/spurlowcode64src/vm/cogitX64SysV.c b/spurlowcode64src/vm/cogitX64SysV.c index f589c7e17f..8b7ff19c3e 100644 --- a/spurlowcode64src/vm/cogitX64SysV.c +++ b/spurlowcode64src/vm/cogitX64SysV.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -358,7 +358,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 3 #define XCHGRR 157 @@ -451,7 +450,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -622,7 +622,7 @@ static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static CogMethod * NoDbgRegParms fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -1036,7 +1036,6 @@ static CogSimStackNativeEntry * NoDbgRegParms nativeStackPopToReg(CogSimStackNat static CogSimStackNativeEntry * NoDbgRegParms nativeStackPopToRegsecondReg(CogSimStackNativeEntry * self_in_nativeStackPopToRegsecondReg, sqInt reg, sqInt secondReg); static sqInt NoDbgRegParms spillingNeedsScratchRegister(CogSimStackNativeEntry * self_in_spillingNeedsScratchRegister); static sqInt NoDbgRegParms stackSpillSize(CogSimStackNativeEntry * self_in_stackSpillSize); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static sqInt NoDbgRegParms availableRegisterOrNoneFor(AbstractInstruction * self_in_availableRegisterOrNoneFor, sqInt liveRegsMask); static sqInt NoDbgRegParms callFullTargetFromReturnAddress(AbstractInstruction * self_in_callFullTargetFromReturnAddress, sqInt callSiteReturnAddress); @@ -1331,7 +1330,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1343,11 +1341,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1363,7 +1363,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssNativeFlushTo(sqInt index); @@ -1388,14 +1387,16 @@ static sqInt NoDbgRegParms ssPushNativeRegister(sqInt reg); static sqInt NoDbgRegParms ssPushNativeRegistersecondRegister(sqInt reg, sqInt secondReg); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -2072,7 +2073,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -2096,7 +2096,6 @@ static sqInt simNativeSpillBase; static CogSimStackNativeEntry simNativeStack[70]; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2181,6 +2180,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -4335,12 +4335,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -6328,7 +6334,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static sqInt NoDbgRegParms +static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -18436,7 +18442,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -18486,7 +18492,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -18764,8 +18770,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -19477,13 +19484,6 @@ stackSpillSize(CogSimStackNativeEntry * self_in_stackSpillSize) return 0; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -25003,11 +25003,7 @@ sizeImmediateGroup1at(AbstractInstruction * self_in_sizeImmediateGroup1at, sqInt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -28600,11 +28596,20 @@ beginHighLevelCall(sqInt alignment) AbstractInstruction *anInstruction4; AbstractInstruction *anInstruction5; AbstractInstruction *anInstruction6; + sqInt i; sqInt mask; sqInt offset; /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); /* begin MoveR:Aw: */ address1 = stackPointerAddress(); @@ -28711,10 +28716,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -29107,6 +29109,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -29672,7 +29677,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -29720,7 +29726,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simNativeStackSize = simNativeStackSize); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -29765,18 +29771,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -29848,7 +29853,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -30074,12 +30079,21 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -30214,7 +30228,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -30508,6 +30522,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -30619,7 +30634,15 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -30850,11 +30873,20 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -30890,13 +30922,22 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -30968,10 +31009,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -30981,13 +31024,29 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -31035,7 +31094,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt i115; sqInt i116; sqInt i117; - sqInt i118; + sqInt i119; sqInt i12; sqInt i120; sqInt i121; @@ -31048,6 +31107,13 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt i17; sqInt i18; sqInt i19; + sqInt i210; + sqInt i211; + sqInt i212; + sqInt i214; + sqInt i29; + sqInt i41; + sqInt i42; sqInt index1; sqInt index11; sqInt index111; @@ -31058,7 +31124,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt index114; sqInt index115; sqInt index116; - sqInt index117; + sqInt index118; sqInt index119; sqInt index12; sqInt index120; @@ -31107,7 +31173,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt rOopTop14; sqInt rOopTop15; sqInt rOopTop16; - sqInt rOopTop17; + sqInt rOopTop18; sqInt rOopTop19; sqInt rOopTop2; sqInt rOopTop20; @@ -31123,6 +31189,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt rOopTop9; sqInt rResult; sqInt rResult1; + sqInt rResult10; sqInt rResult11; sqInt rResult12; sqInt rResult13; @@ -31134,7 +31201,6 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt rResult5; sqInt rResult6; sqInt rResult8; - sqInt rResult9; sqInt value; sqInt value1; sqInt value10; @@ -31155,36 +31221,44 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) switch (prim) { case 0: /* begin genLowcodeByteSizeOf */ - rOopTop16 = NoReg; - rResult9 = NoReg; + rOopTop19 = NoReg; + rResult10 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop16 = registerOrNone(ssTop()); - index116 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i116 = index116; i116 <= (simStackPtr); i116 += 1) { - if ((registerOrNone(simStackAt(index116))) == rOopTop16) { - goto l51; + rOopTop19 = registerOrNone(ssTop()); + index119 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i119 = index119; i119 <= (simStackPtr); i119 += 1) { + if ((registerOrNone(simStackAt(index119))) == rOopTop19) { + goto l62; } } - l51: ; - rOopTop16 = NoReg; - l50: ; + l62: ; + rOopTop19 = NoReg; + l61: ; } - if (rOopTop16 == NoReg) { - rOopTop16 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop19 == NoReg) { + rOopTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult9 = allocateRegNotConflictingWith(1ULL << rOopTop16); - assert(!(((rOopTop16 == NoReg) - || (rResult9 == NoReg)))); - object15 = rOopTop16; - value8 = rResult9; - popToReg(ssTop(), object15); + rResult10 = allocateRegNotConflictingWith(1ULL << rOopTop19); + assert(!(((rOopTop19 == NoReg) + || (rResult10 == NoReg)))); + object17 = rOopTop19; + value9 = rResult10; + popToReg(ssTop(), object17); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i29 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i29 <= simStackPtr; i29 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i29), frameOffsetOfTemporary(i29 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - genLcByteSizeOfto(object15, value8); + genLcByteSizeOfto(object17, value9); return 0; case 1: @@ -31521,63 +31595,63 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) case 12: /* begin genLowcodeOopToBoolean32 */ - rOopTop17 = NoReg; + rOopTop16 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop17 = registerOrNone(ssTop()); - index117 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i117 = index117; i117 <= (simStackPtr); i117 += 1) { - if ((registerOrNone(simStackAt(index117))) == rOopTop17) { - goto l55; + rOopTop16 = registerOrNone(ssTop()); + index116 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i116 = index116; i116 <= (simStackPtr); i116 += 1) { + if ((registerOrNone(simStackAt(index116))) == rOopTop16) { + goto l52; } } - l55: ; - rOopTop17 = NoReg; - l54: ; + l52: ; + rOopTop16 = NoReg; + l51: ; } - if (rOopTop17 == NoReg) { - rOopTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop16 == NoReg) { + rOopTop16 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rOopTop17 == NoReg))); - object16 = rOopTop17; - popToReg(ssTop(), object16); + assert(!((rOopTop16 == NoReg))); + object15 = rOopTop16; + popToReg(ssTop(), object15); ssPop(1); - annotateobjRef(gSubCwR(falseObject(), object16), falseObject()); - ssPushNativeRegister(object16); + annotateobjRef(gSubCwR(falseObject(), object15), falseObject()); + ssPushNativeRegister(object15); return 0; case 13: /* begin genLowcodeOopToBoolean64 */ /* begin allocateRegistersForLowcodeOopResultInteger: */ - rOopTop19 = NoReg; + rOopTop18 = NoReg; rResult12 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop19 = registerOrNone(ssTop()); - index119 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i118 = index119; i118 <= (simStackPtr); i118 += 1) { - if ((registerOrNone(simStackAt(index119))) == rOopTop19) { - goto l57; + rOopTop18 = registerOrNone(ssTop()); + index118 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i117 = index118; i117 <= (simStackPtr); i117 += 1) { + if ((registerOrNone(simStackAt(index118))) == rOopTop18) { + goto l54; } } - l57: ; - rOopTop19 = NoReg; - l61: ; + l54: ; + rOopTop18 = NoReg; + l58: ; } - if (rOopTop19 == NoReg) { - rOopTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop18 == NoReg) { + rOopTop18 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult12 = allocateRegNotConflictingWith(1ULL << rOopTop19); - assert(!(((rOopTop19 == NoReg) + rResult12 = allocateRegNotConflictingWith(1ULL << rOopTop18); + assert(!(((rOopTop18 == NoReg) || (rResult12 == NoReg)))); - object17 = rOopTop19; - value9 = rResult12; - popToReg(ssTop(), object17); + object16 = rOopTop18; + value8 = rResult12; + popToReg(ssTop(), object16); ssPop(1); - annotateobjRef(gSubCwR(falseObject(), object17), falseObject()); - ssPushNativeRegister(object17); + annotateobjRef(gSubCwR(falseObject(), object16), falseObject()); + ssPushNativeRegister(object16); return 0; case 14: @@ -31609,7 +31683,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object18); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i210 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i210 <= simStackPtr; i210 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i210), frameOffsetOfTemporary(i210 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoFloat32(object18, value10); return 0; @@ -31643,7 +31725,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object19); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i211 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i211 <= simStackPtr; i211 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i211), frameOffsetOfTemporary(i211 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoFloat64(object19, value11); return 0; @@ -31673,7 +31763,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object20); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i212 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i212 <= simStackPtr; i212 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i212), frameOffsetOfTemporary(i212 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToInt32(object20); return 0; @@ -31708,7 +31806,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object21); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i41 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i41 <= simStackPtr; i41 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i41), frameOffsetOfTemporary(i41 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToInt64(object21); return 0; @@ -31800,7 +31906,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object22); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i214 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i214 <= simStackPtr; i214 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i214), frameOffsetOfTemporary(i214 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToUInt32(object22); return 0; @@ -31835,7 +31949,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object23); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i42 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i42 <= simStackPtr; i42 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i42), frameOffsetOfTemporary(i42 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToUInt64(object23); return 0; @@ -31917,6 +32039,13 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) sqInt floatValue; sqInt frTop; sqInt frTop1; + sqInt i; + sqInt i1; + sqInt i11; + sqInt i12; + sqInt i2; + sqInt i4; + sqInt i5; AbstractInstruction * inst; AbstractInstruction * inst1; sqInt object; @@ -32047,7 +32176,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), singleFloatValue); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcFloat32toOop(singleFloatValue, object2); return 0; @@ -32072,7 +32209,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), floatValue); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcFloat64toOop(floatValue, object3); return 0; @@ -32091,7 +32236,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value2); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInt32ToOop(value2); return 0; @@ -32111,7 +32264,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value3); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i11 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i11 <= simStackPtr; i11 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i11), frameOffsetOfTemporary(i11 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInt64ToOop(value3); return 0; @@ -32120,51 +32281,59 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) /* begin genLowcodePointerToOop */ pointerClassLiteral = getLiteral(extA); /* begin allocateRegistersForLowcodeInteger: */ - rTop5 = NoReg; + rTop7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop5 == NoReg))); - pointer = rTop5; - nativePopToReg(ssNativeTop(), pointer); + assert(!((rTop7 == NoReg))); + pointer1 = rTop7; + nativePopToReg(ssNativeTop(), pointer1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 <= simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - genLcPointerToOopclass(pointer, pointerClassLiteral); + genLcPointerToOopclass(pointer1, pointerClassLiteral); extA = 0; return 0; case 7: /* begin genLowcodePointerToOopReinterprer */ - rTop6 = NoReg; + rTop5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop6 == NoReg))); - pointer1 = rTop6; - nativePopToReg(ssNativeTop(), pointer1); + assert(!((rTop5 == NoReg))); + pointer = rTop5; + nativePopToReg(ssNativeTop(), pointer); ssNativePop(1); - ssPushRegister(pointer1); + ssPushRegister(pointer); return 0; case 8: /* begin genLowcodeSmallInt32ToOop */ - rTop7 = NoReg; + rTop6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop7 == NoReg) { - rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop7 == NoReg))); - value4 = rTop7; + assert(!((rTop6 == NoReg))); + value4 = rTop6; nativePopToReg(ssNativeTop(), value4); ssNativePop(1); genConvertIntegerToSmallIntegerInReg(value4); @@ -32185,7 +32354,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value5); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i5 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i5 <= simStackPtr; i5 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i5), frameOffsetOfTemporary(i5 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcUInt32ToOop(value5); return 0; @@ -32209,7 +32386,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value6); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i12 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i12 <= simStackPtr; i12 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i12), frameOffsetOfTemporary(i12 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcUInt64ToOop(value6); return 0; @@ -32643,8 +32828,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt frTop2; sqInt frTop3; sqInt frTop4; + sqInt i; sqInt i1; sqInt i11; + sqInt i12; + sqInt i2; + sqInt i21; sqInt index1; sqInt index11; sqInt indexableSize; @@ -32728,11 +32917,11 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt rResult22; sqInt rResult23; sqInt rResult24; - sqInt rResult25; + sqInt rResult29; sqInt rResult3; sqInt rResult30; - sqInt rResult31; - sqInt rResult33; + sqInt rResult32; + sqInt rResult35; sqInt rResult4; sqInt rResult5; sqInt rResult6; @@ -32742,23 +32931,24 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt rTop; sqInt rTop1; sqInt rTop10; + sqInt rTop11; sqInt rTop110; sqInt rTop111; sqInt rTop12; sqInt rTop13; sqInt rTop14; - sqInt rTop15; sqInt rTop16; + sqInt rTop17; sqInt rTop18; - sqInt rTop19; sqInt rTop2; sqInt rTop20; + sqInt rTop21; sqInt rTop22; sqInt rTop23; sqInt rTop24; sqInt rTop25; - sqInt rTop26; sqInt rTop27; + sqInt rTop28; sqInt rTop29; sqInt rTop3; sqInt rTop30; @@ -32767,7 +32957,6 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt rTop6; sqInt rTop7; sqInt rTop8; - sqInt rTop9; sqInt second; sqInt second1; sqInt second10; @@ -32949,23 +33138,31 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 65: /* begin genLowcodeFree */ - rTop = NoReg; + rTop29 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop = nativeRegisterOrNone(ssNativeTop()); + rTop29 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop == NoReg) { - rTop = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop29 == NoReg) { + rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop == NoReg))); - pointer2 = rTop; - nativePopToReg(ssNativeTop(), pointer2); + assert(!((rTop29 == NoReg))); + pointer8 = rTop29; + nativePopToReg(ssNativeTop(), pointer8); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - if (pointer2 != ReceiverResultReg) { + if (pointer8 != ReceiverResultReg) { /* begin MoveR:R: */ - genoperandoperand(MoveRR, pointer2, ReceiverResultReg); + genoperandoperand(MoveRR, pointer8, ReceiverResultReg); } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceFreeTrampoline); @@ -32974,36 +33171,44 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 66: /* begin genLowcodeInstantiateIndexable32Oop */ - rTop1 = (rOopTop = NoReg); + rTop30 = (rOopTop1 = NoReg); rOopResult = NoReg; - topRegisterMask = 0; + topRegisterMask1 = 0; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop1 = nativeRegisterOrNone(ssNativeTop()); + rTop30 = nativeRegisterOrNone(ssNativeTop()); } if ((registerOrNone(ssTop())) != NoReg) { - rOopTop = registerOrNone(ssTop()); + rOopTop1 = registerOrNone(ssTop()); /* begin registerMaskFor: */ - topRegisterMask = 1ULL << rOopTop; + topRegisterMask1 = 1ULL << rOopTop1; } - if (rTop1 == NoReg) { - rTop1 = allocateRegNotConflictingWith(topRegisterMask); + if (rTop30 == NoReg) { + rTop30 = allocateRegNotConflictingWith(topRegisterMask1); } - if (rOopTop == NoReg) { - rOopTop = allocateRegNotConflictingWith(1ULL << rTop1); + if (rOopTop1 == NoReg) { + rOopTop1 = allocateRegNotConflictingWith(1ULL << rTop30); } - rOopResult = allocateRegNotConflictingWith((1ULL << rTop1) | (1ULL << rOopTop)); - assert(!(((rTop1 == NoReg) - || ((rOopTop == NoReg) + rOopResult = allocateRegNotConflictingWith((1ULL << rTop30) | (1ULL << rOopTop1)); + assert(!(((rTop30 == NoReg) + || ((rOopTop1 == NoReg) || (rOopResult == NoReg))))); - indexableSize = rTop1; - classOop = rOopTop; - object = rOopResult; + indexableSize = rTop30; + classOop = rOopTop1; + object1 = rOopResult; nativePopToReg(ssNativeTop(), indexableSize); ssNativePop(1); popToReg(ssTop(), classOop); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOopindexableSize(classOop, indexableSize); return 0; @@ -33012,34 +33217,42 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInstantiateIndexableOop */ indexableSize1 = extA; /* begin allocateRegistersForLowcodeOopResultOop: */ - rOopTop1 = NoReg; - rResult20 = NoReg; + rOopTop2 = NoReg; + rResult35 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop1 = registerOrNone(ssTop()); + rOopTop2 = registerOrNone(ssTop()); index1 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i1 = index1; i1 <= (simStackPtr); i1 += 1) { - if ((registerOrNone(simStackAt(index1))) == rOopTop1) { - goto l40; + for (i11 = index1; i11 <= (simStackPtr); i11 += 1) { + if ((registerOrNone(simStackAt(index1))) == rOopTop2) { + goto l200; } } - l40: ; - rOopTop1 = NoReg; - l39: ; + l200: ; + rOopTop2 = NoReg; + l199: ; } - if (rOopTop1 == NoReg) { - rOopTop1 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop2 == NoReg) { + rOopTop2 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult20 = allocateRegNotConflictingWith(1ULL << rOopTop1); - assert(!(((rOopTop1 == NoReg) - || (rResult20 == NoReg)))); - classOop1 = rOopTop1; - object1 = rResult20; + rResult35 = allocateRegNotConflictingWith(1ULL << rOopTop2); + assert(!(((rOopTop2 == NoReg) + || (rResult35 == NoReg)))); + classOop1 = rOopTop2; + object2 = rResult35; popToReg(ssTop(), classOop1); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOopconstantIndexableSize(classOop1, indexableSize1); extA = 0; @@ -33047,30 +33260,38 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 68: /* begin genLowcodeInstantiateOop */ - rOopTop2 = NoReg; + rOopTop3 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop2 = registerOrNone(ssTop()); + rOopTop3 = registerOrNone(ssTop()); index11 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i11 = index11; i11 <= (simStackPtr); i11 += 1) { - if ((registerOrNone(simStackAt(index11))) == rOopTop2) { - goto l43; + for (i12 = index11; i12 <= (simStackPtr); i12 += 1) { + if ((registerOrNone(simStackAt(index11))) == rOopTop3) { + goto l203; } } - l43: ; - rOopTop2 = NoReg; - l42: ; + l203: ; + rOopTop3 = NoReg; + l202: ; } - if (rOopTop2 == NoReg) { - rOopTop2 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop3 == NoReg) { + rOopTop3 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rOopTop2 == NoReg))); - classOop2 = rOopTop2; + assert(!((rOopTop3 == NoReg))); + classOop2 = rOopTop3; popToReg(ssTop(), classOop2); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i21 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i21 <= simStackPtr; i21 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i21), frameOffsetOfTemporary(i21 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOop(classOop2); return 0; @@ -33078,9 +33299,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 69: /* begin genLowcodeInt32Equal */ topRegistersMask1 = 0; - rTop2 = (rNext = NoReg); + rTop = (rNext = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop2 = nativeRegisterOrNone(ssNativeTop()); + rTop = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33092,15 +33313,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask1 = 1ULL << reg; } } - if (rTop2 == NoReg) { - rTop2 = allocateRegNotConflictingWith(topRegistersMask1); + if (rTop == NoReg) { + rTop = allocateRegNotConflictingWith(topRegistersMask1); } if (rNext == NoReg) { - rNext = allocateRegNotConflictingWith(1ULL << rTop2); + rNext = allocateRegNotConflictingWith(1ULL << rTop); } - assert(!(((rTop2 == NoReg) + assert(!(((rTop == NoReg) || (rNext == NoReg)))); - second = rTop2; + second = rTop; first = rNext; nativePopToReg(ssNativeTop(), second); ssNativePop(1); @@ -33124,9 +33345,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 70: /* begin genLowcodeInt32Great */ topRegistersMask2 = 0; - rTop3 = (rNext1 = NoReg); + rTop1 = (rNext1 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop3 = nativeRegisterOrNone(ssNativeTop()); + rTop1 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33138,15 +33359,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask2 = 1ULL << reg1; } } - if (rTop3 == NoReg) { - rTop3 = allocateRegNotConflictingWith(topRegistersMask2); + if (rTop1 == NoReg) { + rTop1 = allocateRegNotConflictingWith(topRegistersMask2); } if (rNext1 == NoReg) { - rNext1 = allocateRegNotConflictingWith(1ULL << rTop3); + rNext1 = allocateRegNotConflictingWith(1ULL << rTop1); } - assert(!(((rTop3 == NoReg) + assert(!(((rTop1 == NoReg) || (rNext1 == NoReg)))); - second1 = rTop3; + second1 = rTop1; first1 = rNext1; nativePopToReg(ssNativeTop(), second1); ssNativePop(1); @@ -33170,9 +33391,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 71: /* begin genLowcodeInt32GreatEqual */ topRegistersMask3 = 0; - rTop4 = (rNext2 = NoReg); + rTop2 = (rNext2 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop4 = nativeRegisterOrNone(ssNativeTop()); + rTop2 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33184,15 +33405,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask3 = 1ULL << reg2; } } - if (rTop4 == NoReg) { - rTop4 = allocateRegNotConflictingWith(topRegistersMask3); + if (rTop2 == NoReg) { + rTop2 = allocateRegNotConflictingWith(topRegistersMask3); } if (rNext2 == NoReg) { - rNext2 = allocateRegNotConflictingWith(1ULL << rTop4); + rNext2 = allocateRegNotConflictingWith(1ULL << rTop2); } - assert(!(((rTop4 == NoReg) + assert(!(((rTop2 == NoReg) || (rNext2 == NoReg)))); - second2 = rTop4; + second2 = rTop2; first2 = rNext2; nativePopToReg(ssNativeTop(), second2); ssNativePop(1); @@ -33216,9 +33437,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 72: /* begin genLowcodeInt32Less */ topRegistersMask4 = 0; - rTop5 = (rNext3 = NoReg); + rTop3 = (rNext3 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop3 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33230,15 +33451,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask4 = 1ULL << reg3; } } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(topRegistersMask4); + if (rTop3 == NoReg) { + rTop3 = allocateRegNotConflictingWith(topRegistersMask4); } if (rNext3 == NoReg) { - rNext3 = allocateRegNotConflictingWith(1ULL << rTop5); + rNext3 = allocateRegNotConflictingWith(1ULL << rTop3); } - assert(!(((rTop5 == NoReg) + assert(!(((rTop3 == NoReg) || (rNext3 == NoReg)))); - second3 = rTop5; + second3 = rTop3; first3 = rNext3; nativePopToReg(ssNativeTop(), second3); ssNativePop(1); @@ -33262,9 +33483,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 73: /* begin genLowcodeInt32LessEqual */ topRegistersMask5 = 0; - rTop6 = (rNext4 = NoReg); + rTop4 = (rNext4 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop4 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33276,15 +33497,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask5 = 1ULL << reg4; } } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(topRegistersMask5); + if (rTop4 == NoReg) { + rTop4 = allocateRegNotConflictingWith(topRegistersMask5); } if (rNext4 == NoReg) { - rNext4 = allocateRegNotConflictingWith(1ULL << rTop6); + rNext4 = allocateRegNotConflictingWith(1ULL << rTop4); } - assert(!(((rTop6 == NoReg) + assert(!(((rTop4 == NoReg) || (rNext4 == NoReg)))); - second4 = rTop6; + second4 = rTop4; first4 = rNext4; nativePopToReg(ssNativeTop(), second4); ssNativePop(1); @@ -33308,9 +33529,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 74: /* begin genLowcodeInt32NotEqual */ topRegistersMask6 = 0; - rTop7 = (rNext5 = NoReg); + rTop5 = (rNext5 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33322,15 +33543,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask6 = 1ULL << reg5; } } - if (rTop7 == NoReg) { - rTop7 = allocateRegNotConflictingWith(topRegistersMask6); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(topRegistersMask6); } if (rNext5 == NoReg) { - rNext5 = allocateRegNotConflictingWith(1ULL << rTop7); + rNext5 = allocateRegNotConflictingWith(1ULL << rTop5); } - assert(!(((rTop7 == NoReg) + assert(!(((rTop5 == NoReg) || (rNext5 == NoReg)))); - second5 = rTop7; + second5 = rTop5; first5 = rNext5; nativePopToReg(ssNativeTop(), second5); ssNativePop(1); @@ -33353,18 +33574,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 75: /* begin genLowcodeInt32ToFloat32 */ - rTop8 = NoReg; + rTop6 = NoReg; frResult4 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop8 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop8 == NoReg) { - rTop8 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult4 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop8 == NoReg) + assert(!(((rTop6 == NoReg) || (frResult4 == NoReg)))); - value12 = rTop8; + value12 = rTop6; result = frResult4; nativePopToReg(ssNativeTop(), value12); ssNativePop(1); @@ -33375,18 +33596,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 76: /* begin genLowcodeInt32ToFloat64 */ - rTop9 = NoReg; + rTop7 = NoReg; frResult5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop9 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop9 == NoReg) { - rTop9 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult5 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop9 == NoReg) + assert(!(((rTop7 == NoReg) || (frResult5 == NoReg)))); - value13 = rTop9; + value13 = rTop7; result1 = frResult5; nativePopToReg(ssNativeTop(), value13); ssNativePop(1); @@ -33397,15 +33618,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 77: /* begin genLowcodeInt32ToPointer */ - rTop10 = NoReg; + rTop8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop10 = nativeRegisterOrNone(ssNativeTop()); + rTop8 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop10 == NoReg) { - rTop10 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop8 == NoReg) { + rTop8 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop10 == NoReg))); - value14 = rTop10; + assert(!((rTop8 == NoReg))); + value14 = rTop8; nativePopToReg(ssNativeTop(), value14); ssNativePop(1); ssPushNativeRegister(value14); @@ -33415,9 +33636,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInt64Equal */ /* begin allocateRegistersForLowcodeInteger2: */ topRegistersMask7 = 0; - rTop12 = (rNext11 = NoReg); + rTop11 = (rNext11 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop12 = nativeRegisterOrNone(ssNativeTop()); + rTop11 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext11 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33429,15 +33650,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask7 = 1ULL << reg6; } } - if (rTop12 == NoReg) { - rTop12 = allocateRegNotConflictingWith(topRegistersMask7); + if (rTop11 == NoReg) { + rTop11 = allocateRegNotConflictingWith(topRegistersMask7); } if (rNext11 == NoReg) { - rNext11 = allocateRegNotConflictingWith(1ULL << rTop12); + rNext11 = allocateRegNotConflictingWith(1ULL << rTop11); } - assert(!(((rTop12 == NoReg) + assert(!(((rTop11 == NoReg) || (rNext11 == NoReg)))); - second6 = rTop12; + second6 = rTop11; first6 = rNext11; nativePopToReg(ssNativeTop(), second6); ssNativePop(1); @@ -33461,10 +33682,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 79: /* begin genLowcodeInt64Great */ topRegistersMask8 = 0; - rTop13 = (rNext7 = NoReg); - rResult21 = NoReg; + rTop10 = (rNext7 = NoReg); + rResult20 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop13 = nativeRegisterOrNone(ssNativeTop()); + rTop10 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext7 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33476,19 +33697,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask8 = 1ULL << reg7; } } - if (rTop13 == NoReg) { - rTop13 = allocateRegNotConflictingWith(topRegistersMask8); + if (rTop10 == NoReg) { + rTop10 = allocateRegNotConflictingWith(topRegistersMask8); } if (rNext7 == NoReg) { - rNext7 = allocateRegNotConflictingWith(1ULL << rTop13); + rNext7 = allocateRegNotConflictingWith(1ULL << rTop10); } - assert(!(((rTop13 == NoReg) + assert(!(((rTop10 == NoReg) || (rNext7 == NoReg)))); - rResult21 = allocateFloatRegNotConflictingWith((1ULL << rTop13) | (1ULL << rNext7)); - assert(!((rResult21 == NoReg))); - second7 = rTop13; + rResult20 = allocateFloatRegNotConflictingWith((1ULL << rTop10) | (1ULL << rNext7)); + assert(!((rResult20 == NoReg))); + second7 = rTop10; first7 = rNext7; - value15 = rResult21; + value15 = rResult20; nativePopToReg(ssNativeTop(), second7); ssNativePop(1); nativePopToReg(ssNativeTop(), first7); @@ -33499,10 +33720,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 80: /* begin genLowcodeInt64GreatEqual */ topRegistersMask9 = 0; - rTop14 = (rNext8 = NoReg); - rResult22 = NoReg; + rTop12 = (rNext8 = NoReg); + rResult21 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop14 = nativeRegisterOrNone(ssNativeTop()); + rTop12 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33514,19 +33735,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask9 = 1ULL << reg8; } } - if (rTop14 == NoReg) { - rTop14 = allocateRegNotConflictingWith(topRegistersMask9); + if (rTop12 == NoReg) { + rTop12 = allocateRegNotConflictingWith(topRegistersMask9); } if (rNext8 == NoReg) { - rNext8 = allocateRegNotConflictingWith(1ULL << rTop14); + rNext8 = allocateRegNotConflictingWith(1ULL << rTop12); } - assert(!(((rTop14 == NoReg) + assert(!(((rTop12 == NoReg) || (rNext8 == NoReg)))); - rResult22 = allocateFloatRegNotConflictingWith((1ULL << rTop14) | (1ULL << rNext8)); - assert(!((rResult22 == NoReg))); - second8 = rTop14; + rResult21 = allocateFloatRegNotConflictingWith((1ULL << rTop12) | (1ULL << rNext8)); + assert(!((rResult21 == NoReg))); + second8 = rTop12; first8 = rNext8; - value16 = rResult22; + value16 = rResult21; nativePopToReg(ssNativeTop(), second8); ssNativePop(1); nativePopToReg(ssNativeTop(), first8); @@ -33537,10 +33758,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 81: /* begin genLowcodeInt64Less */ topRegistersMask10 = 0; - rTop15 = (rNext9 = NoReg); - rResult23 = NoReg; + rTop13 = (rNext9 = NoReg); + rResult22 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop15 = nativeRegisterOrNone(ssNativeTop()); + rTop13 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33552,19 +33773,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask10 = 1ULL << reg9; } } - if (rTop15 == NoReg) { - rTop15 = allocateRegNotConflictingWith(topRegistersMask10); + if (rTop13 == NoReg) { + rTop13 = allocateRegNotConflictingWith(topRegistersMask10); } if (rNext9 == NoReg) { - rNext9 = allocateRegNotConflictingWith(1ULL << rTop15); + rNext9 = allocateRegNotConflictingWith(1ULL << rTop13); } - assert(!(((rTop15 == NoReg) + assert(!(((rTop13 == NoReg) || (rNext9 == NoReg)))); - rResult23 = allocateFloatRegNotConflictingWith((1ULL << rTop15) | (1ULL << rNext9)); - assert(!((rResult23 == NoReg))); - second9 = rTop15; + rResult22 = allocateFloatRegNotConflictingWith((1ULL << rTop13) | (1ULL << rNext9)); + assert(!((rResult22 == NoReg))); + second9 = rTop13; first9 = rNext9; - value17 = rResult23; + value17 = rResult22; nativePopToReg(ssNativeTop(), second9); ssNativePop(1); nativePopToReg(ssNativeTop(), first9); @@ -33575,10 +33796,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 82: /* begin genLowcodeInt64LessEqual */ topRegistersMask11 = 0; - rTop16 = (rNext10 = NoReg); - rResult24 = NoReg; + rTop14 = (rNext10 = NoReg); + rResult23 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop16 = nativeRegisterOrNone(ssNativeTop()); + rTop14 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33590,19 +33811,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask11 = 1ULL << reg10; } } - if (rTop16 == NoReg) { - rTop16 = allocateRegNotConflictingWith(topRegistersMask11); + if (rTop14 == NoReg) { + rTop14 = allocateRegNotConflictingWith(topRegistersMask11); } if (rNext10 == NoReg) { - rNext10 = allocateRegNotConflictingWith(1ULL << rTop16); + rNext10 = allocateRegNotConflictingWith(1ULL << rTop14); } - assert(!(((rTop16 == NoReg) + assert(!(((rTop14 == NoReg) || (rNext10 == NoReg)))); - rResult24 = allocateFloatRegNotConflictingWith((1ULL << rTop16) | (1ULL << rNext10)); - assert(!((rResult24 == NoReg))); - second10 = rTop16; + rResult23 = allocateFloatRegNotConflictingWith((1ULL << rTop14) | (1ULL << rNext10)); + assert(!((rResult23 == NoReg))); + second10 = rTop14; first10 = rNext10; - value18 = rResult24; + value18 = rResult23; nativePopToReg(ssNativeTop(), second10); ssNativePop(1); nativePopToReg(ssNativeTop(), first10); @@ -33614,9 +33835,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInt64NotEqual */ /* begin allocateRegistersForLowcodeInteger2: */ topRegistersMask12 = 0; - rTop18 = (rNext13 = NoReg); + rTop16 = (rNext13 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop18 = nativeRegisterOrNone(ssNativeTop()); + rTop16 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext13 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33628,15 +33849,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask12 = 1ULL << reg11; } } - if (rTop18 == NoReg) { - rTop18 = allocateRegNotConflictingWith(topRegistersMask12); + if (rTop16 == NoReg) { + rTop16 = allocateRegNotConflictingWith(topRegistersMask12); } if (rNext13 == NoReg) { - rNext13 = allocateRegNotConflictingWith(1ULL << rTop18); + rNext13 = allocateRegNotConflictingWith(1ULL << rTop16); } - assert(!(((rTop18 == NoReg) + assert(!(((rTop16 == NoReg) || (rNext13 == NoReg)))); - second11 = rTop18; + second11 = rTop16; first11 = rNext13; nativePopToReg(ssNativeTop(), second11); ssNativePop(1); @@ -33659,18 +33880,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 84: /* begin genLowcodeInt64ToFloat32 */ - rTop19 = NoReg; + rTop17 = NoReg; frResult6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop19 = nativeRegisterOrNone(ssNativeTop()); + rTop17 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop19 == NoReg) { - rTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop17 == NoReg) { + rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult6 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop19 == NoReg) + assert(!(((rTop17 == NoReg) || (frResult6 == NoReg)))); - value19 = rTop19; + value19 = rTop17; result2 = frResult6; nativePopToReg(ssNativeTop(), value19); ssNativePop(1); @@ -33679,18 +33900,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 85: /* begin genLowcodeInt64ToFloat64 */ - rTop20 = NoReg; + rTop18 = NoReg; frResult7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop20 = nativeRegisterOrNone(ssNativeTop()); + rTop18 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop20 == NoReg) { - rTop20 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop18 == NoReg) { + rTop18 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult7 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop20 == NoReg) + assert(!(((rTop18 == NoReg) || (frResult7 == NoReg)))); - value20 = rTop20; + value20 = rTop18; result3 = frResult7; nativePopToReg(ssNativeTop(), value20); ssNativePop(1); @@ -33717,9 +33938,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 87: /* begin genLowcodeLeftShift32 */ topRegistersMask14 = 0; - rTop22 = (rNext15 = NoReg); + rTop20 = (rNext15 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop22 = nativeRegisterOrNone(ssNativeTop()); + rTop20 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33731,15 +33952,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask14 = 1ULL << reg13; } } - if (rTop22 == NoReg) { - rTop22 = allocateRegNotConflictingWith(topRegistersMask14); + if (rTop20 == NoReg) { + rTop20 = allocateRegNotConflictingWith(topRegistersMask14); } if (rNext15 == NoReg) { - rNext15 = allocateRegNotConflictingWith(1ULL << rTop22); + rNext15 = allocateRegNotConflictingWith(1ULL << rTop20); } - assert(!(((rTop22 == NoReg) + assert(!(((rTop20 == NoReg) || (rNext15 == NoReg)))); - shiftAmount = rTop22; + shiftAmount = rTop20; value22 = rNext15; nativePopToReg(ssNativeTop(), shiftAmount); ssNativePop(1); @@ -33753,10 +33974,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 88: /* begin genLowcodeLeftShift64 */ topRegistersMask15 = 0; - rTop23 = (rNext16 = NoReg); - rResult25 = NoReg; + rTop21 = (rNext16 = NoReg); + rResult24 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop23 = nativeRegisterOrNone(ssNativeTop()); + rTop21 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext16 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33768,19 +33989,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask15 = 1ULL << reg14; } } - if (rTop23 == NoReg) { - rTop23 = allocateRegNotConflictingWith(topRegistersMask15); + if (rTop21 == NoReg) { + rTop21 = allocateRegNotConflictingWith(topRegistersMask15); } if (rNext16 == NoReg) { - rNext16 = allocateRegNotConflictingWith(1ULL << rTop23); + rNext16 = allocateRegNotConflictingWith(1ULL << rTop21); } - assert(!(((rTop23 == NoReg) + assert(!(((rTop21 == NoReg) || (rNext16 == NoReg)))); - rResult25 = allocateFloatRegNotConflictingWith((1ULL << rTop23) | (1ULL << rNext16)); - assert(!((rResult25 == NoReg))); - shiftAmount1 = rTop23; + rResult24 = allocateFloatRegNotConflictingWith((1ULL << rTop21) | (1ULL << rNext16)); + assert(!((rResult24 == NoReg))); + shiftAmount1 = rTop21; value23 = rNext16; - result4 = rResult25; + result4 = rResult24; nativePopToReg(ssNativeTop(), shiftAmount1); ssNativePop(1); nativePopToReg(ssNativeTop(), value23); @@ -33974,67 +34195,67 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 101: /* begin genLowcodeLoadFloat32FromMemory */ - rTop24 = NoReg; + rTop22 = NoReg; frResult8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop24 = nativeRegisterOrNone(ssNativeTop()); + rTop22 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop24 == NoReg) { - rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop22 == NoReg) { + rTop22 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult8 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop24 == NoReg) + assert(!(((rTop22 == NoReg) || (frResult8 == NoReg)))); - pointer3 = rTop24; + pointer2 = rTop22; value26 = frResult8; - nativePopToReg(ssNativeTop(), pointer3); + nativePopToReg(ssNativeTop(), pointer2); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction33 = genoperandoperandoperand(MoveM32rRs, 0, pointer3, value26); + anInstruction33 = genoperandoperandoperand(MoveM32rRs, 0, pointer2, value26); ssPushNativeRegisterSingleFloat(value26); return 0; case 102: /* begin genLowcodeLoadFloat64FromMemory */ - rTop25 = NoReg; + rTop23 = NoReg; frResult9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop25 = nativeRegisterOrNone(ssNativeTop()); + rTop23 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop25 == NoReg) { - rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop23 == NoReg) { + rTop23 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult9 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop25 == NoReg) + assert(!(((rTop23 == NoReg) || (frResult9 == NoReg)))); - pointer4 = rTop25; + pointer3 = rTop23; value27 = frResult9; - nativePopToReg(ssNativeTop(), pointer4); + nativePopToReg(ssNativeTop(), pointer3); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction34 = genoperandoperandoperand(MoveM64rRd, 0, pointer4, value27); + anInstruction34 = genoperandoperandoperand(MoveM64rRd, 0, pointer3, value27); ssPushNativeRegisterDoubleFloat(value27); return 0; case 103: /* begin genLowcodeLoadInt16FromMemory */ - rTop26 = NoReg; - rResult30 = NoReg; + rTop24 = NoReg; + rResult29 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop26 = nativeRegisterOrNone(ssNativeTop()); + rTop24 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop26 == NoReg) { - rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop24 == NoReg) { + rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult30 = allocateRegNotConflictingWith(1ULL << rTop26); - assert(!(((rTop26 == NoReg) - || (rResult30 == NoReg)))); - pointer5 = rTop26; - value28 = rResult30; - nativePopToReg(ssNativeTop(), pointer5); + rResult29 = allocateRegNotConflictingWith(1ULL << rTop24); + assert(!(((rTop24 == NoReg) + || (rResult29 == NoReg)))); + pointer4 = rTop24; + value28 = rResult29; + nativePopToReg(ssNativeTop(), pointer4); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction35 = genoperandoperandoperand(MoveM16rR, 0, pointer5, value28); + anInstruction35 = genoperandoperandoperand(MoveM16rR, 0, pointer4, value28); /* begin SignExtend16R:R: */ genoperandoperand(SignExtend16RR, value28, value28); ssPushNativeRegister(value28); @@ -34042,23 +34263,23 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 104: /* begin genLowcodeLoadInt32FromMemory */ - rTop27 = NoReg; - rResult31 = NoReg; + rTop25 = NoReg; + rResult30 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop27 = nativeRegisterOrNone(ssNativeTop()); + rTop25 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop27 == NoReg) { - rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop25 == NoReg) { + rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult31 = allocateRegNotConflictingWith(1ULL << rTop27); - assert(!(((rTop27 == NoReg) - || (rResult31 == NoReg)))); - pointer6 = rTop27; - value29 = rResult31; - nativePopToReg(ssNativeTop(), pointer6); + rResult30 = allocateRegNotConflictingWith(1ULL << rTop25); + assert(!(((rTop25 == NoReg) + || (rResult30 == NoReg)))); + pointer5 = rTop25; + value29 = rResult30; + nativePopToReg(ssNativeTop(), pointer5); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction36 = genoperandoperandoperand(MoveM32rR, 0, pointer6, value29); + anInstruction36 = genoperandoperandoperand(MoveM32rR, 0, pointer5, value29); ssPushNativeRegister(value29); return 0; @@ -34076,35 +34297,35 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) rResult112 = allocateRegNotConflictingWith(1ULL << rTop111); assert(!(((rTop111 == NoReg) || (rResult112 == NoReg)))); - pointer7 = rTop111; + pointer6 = rTop111; value30 = rResult112; - nativePopToReg(ssNativeTop(), pointer7); + nativePopToReg(ssNativeTop(), pointer6); ssNativePop(1); assert(BytesPerWord == 8); /* begin gen:quickConstant:operand:operand: */ - anInstruction210 = genoperandoperandoperand(MoveMwrR, 0, pointer7, value30); + anInstruction210 = genoperandoperandoperand(MoveMwrR, 0, pointer6, value30); ssPushNativeRegister(value30); return 0; case 106: /* begin genLowcodeLoadInt8FromMemory */ - rTop29 = NoReg; - rResult33 = NoReg; + rTop27 = NoReg; + rResult32 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop29 = nativeRegisterOrNone(ssNativeTop()); + rTop27 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop29 == NoReg) { - rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop27 == NoReg) { + rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult33 = allocateRegNotConflictingWith(1ULL << rTop29); - assert(!(((rTop29 == NoReg) - || (rResult33 == NoReg)))); - pointer8 = rTop29; - value31 = rResult33; - nativePopToReg(ssNativeTop(), pointer8); + rResult32 = allocateRegNotConflictingWith(1ULL << rTop27); + assert(!(((rTop27 == NoReg) + || (rResult32 == NoReg)))); + pointer7 = rTop27; + value31 = rResult32; + nativePopToReg(ssNativeTop(), pointer7); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction38 = genoperandoperandoperand(MoveM8rR, 0, pointer8, value31); + anInstruction38 = genoperandoperandoperand(MoveM8rR, 0, pointer7, value31); /* begin SignExtend8R:R: */ genoperandoperand(SignExtend8RR, value31, value31); ssPushNativeRegister(value31); @@ -34296,31 +34517,31 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 119: /* begin genLowcodeLoadObjectAt */ - rTop30 = (rOopTop3 = NoReg); - topRegisterMask1 = 0; + rTop28 = (rOopTop = NoReg); + topRegisterMask = 0; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop30 = nativeRegisterOrNone(ssNativeTop()); + rTop28 = nativeRegisterOrNone(ssNativeTop()); } if ((registerOrNone(ssTop())) != NoReg) { - rOopTop3 = registerOrNone(ssTop()); + rOopTop = registerOrNone(ssTop()); /* begin registerMaskFor: */ - topRegisterMask1 = 1ULL << rOopTop3; + topRegisterMask = 1ULL << rOopTop; } - if (rTop30 == NoReg) { - rTop30 = allocateRegNotConflictingWith(topRegisterMask1); + if (rTop28 == NoReg) { + rTop28 = allocateRegNotConflictingWith(topRegisterMask); } - if (rOopTop3 == NoReg) { - rOopTop3 = allocateRegNotConflictingWith(1ULL << rTop30); + if (rOopTop == NoReg) { + rOopTop = allocateRegNotConflictingWith(1ULL << rTop28); } - assert(!(((rTop30 == NoReg) - || (rOopTop3 == NoReg)))); - fieldIndex = rTop30; - object2 = rOopTop3; + assert(!(((rTop28 == NoReg) + || (rOopTop == NoReg)))); + fieldIndex = rTop28; + object = rOopTop; nativePopToReg(ssNativeTop(), fieldIndex); ssNativePop(1); - popToReg(ssTop(), object2); + popToReg(ssTop(), object); ssPop(1); - genLcLoadObjectat(object2, fieldIndex); + genLcLoadObjectat(object, fieldIndex); return 0; default: @@ -34342,24 +34563,24 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) AbstractInstruction *abstractInstruction11; AbstractInstruction *abstractInstruction12; AbstractInstruction *abstractInstruction2; - AbstractInstruction *abstractInstruction4; + AbstractInstruction *abstractInstruction3; sqInt address; sqInt address1; sqInt alignedSize; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; - AbstractInstruction *anInstruction10; AbstractInstruction *anInstruction110; AbstractInstruction *anInstruction12; - AbstractInstruction *anInstruction13; + AbstractInstruction *anInstruction14; + AbstractInstruction *anInstruction15; AbstractInstruction *anInstruction16; AbstractInstruction *anInstruction17; AbstractInstruction *anInstruction18; AbstractInstruction *anInstruction19; AbstractInstruction *anInstruction2; - AbstractInstruction *anInstruction20; AbstractInstruction *anInstruction21; AbstractInstruction *anInstruction22; + AbstractInstruction *anInstruction23; AbstractInstruction *anInstruction31; AbstractInstruction *anInstruction4; AbstractInstruction *anInstruction41; @@ -34390,11 +34611,17 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt frTop; sqInt frTop1; sqInt i1; + sqInt i11; + sqInt i2; + sqInt i3; + sqInt i5; + sqInt i6; + sqInt i7; sqInt index1; - sqInt nativeValueIndex; - sqInt nativeValueIndex1; - sqInt nextRegisterMask; - sqInt nextRegisterMask1; + sqInt nativeValueIndex2; + sqInt nativeValueIndex3; + sqInt nextRegisterMask2; + sqInt nextRegisterMask3; sqInt object; sqInt offset; sqInt offset1; @@ -34413,17 +34640,17 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt pointer7; sqInt pointer8; sqInt pointerResult; - sqInt pointerValue9; + sqInt pointerValue7; sqInt quickConstant; + sqInt reg; sqInt reg1; sqInt reg10; sqInt reg12; sqInt reg14; - sqInt reg15; sqInt reg16; sqInt reg2; - sqInt reg3; - sqInt reg4; + sqInt reg5; + sqInt reg6; sqInt reg7; sqInt reg8; sqInt reg9; @@ -34435,19 +34662,19 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt result; sqInt result1; sqInt result2; + sqInt rNext; sqInt rNext1; - sqInt rNext10; sqInt rNext11; + sqInt rNext12; sqInt rNext13; sqInt rNext14; sqInt rNext15; - sqInt rNext2; - sqInt rNext3; sqInt rNext4; - sqInt rNext5; + sqInt rNext6; sqInt rNext8; - sqInt rNextNext; - sqInt rNextNext1; + sqInt rNext9; + sqInt rNextNext2; + sqInt rNextNext3; sqInt rOopTop; sqInt rResult; sqInt rResult1; @@ -34457,35 +34684,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt rResult2; sqInt rResult4; sqInt rResult5; - sqInt rResult7; + sqInt rResult6; sqInt rResult8; sqInt rTop; sqInt rTop1; - sqInt rTop10; sqInt rTop11; sqInt rTop110; sqInt rTop111; - sqInt rTop112; sqInt rTop12; sqInt rTop13; sqInt rTop14; - sqInt rTop16; + sqInt rTop15; sqInt rTop17; + sqInt rTop18; sqInt rTop19; sqInt rTop2; - sqInt rTop20; + sqInt rTop21; sqInt rTop22; sqInt rTop23; sqInt rTop25; sqInt rTop26; sqInt rTop27; - sqInt rTop29; + sqInt rTop28; sqInt rTop30; sqInt rTop31; + sqInt rTop32; sqInt rTop4; sqInt rTop5; + sqInt rTop6; sqInt rTop7; - sqInt rTop8; sqInt rTop9; sqInt second; sqInt second1; @@ -34503,13 +34730,13 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt source; sqInt source1; sqInt source2; + sqInt topRegistersMask; sqInt topRegistersMask1; sqInt topRegistersMask10; sqInt topRegistersMask11; - sqInt topRegistersMask12; sqInt topRegistersMask13; - sqInt topRegistersMask2; - sqInt topRegistersMask3; + sqInt topRegistersMask4; + sqInt topRegistersMask5; sqInt topRegistersMask6; sqInt topRegistersMask7; sqInt topRegistersMask8; @@ -34720,7 +34947,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 0x7F: /* begin genLowcodeLockRegisters */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); return 0; @@ -34731,123 +34966,139 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 129: /* begin genLowcodeMalloc32 */ - rTop5 = NoReg; - rResult5 = NoReg; + rTop28 = NoReg; + rResult8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop28 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop28 == NoReg) { + rTop28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult5 = allocateRegNotConflictingWith(1ULL << rTop5); - assert(!(((rTop5 == NoReg) - || (rResult5 == NoReg)))); - size1 = rTop5; - pointer5 = rResult5; + rResult8 = allocateRegNotConflictingWith(1ULL << rTop28); + assert(!(((rTop28 == NoReg) + || (rResult8 == NoReg)))); + size1 = rTop28; + pointer7 = rResult8; nativePopToReg(ssNativeTop(), size1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 <= simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); if (size1 != ReceiverResultReg) { /* begin MoveR:R: */ genoperandoperand(MoveRR, size1, ReceiverResultReg); } /* begin CallRT: */ - abstractInstruction2 = genoperand(Call, ceMallocTrampoline); - (abstractInstruction2->annotation = IsRelativeCall); + abstractInstruction3 = genoperand(Call, ceMallocTrampoline); + (abstractInstruction3->annotation = IsRelativeCall); /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, pointer5); - ssPushNativeRegister(pointer5); + genoperandoperand(MoveRR, TempReg, pointer7); + ssPushNativeRegister(pointer7); return 0; case 130: /* begin genLowcodeMalloc64 */ /* begin allocateRegistersForLowcodeIntegerResultInteger: */ - rTop12 = NoReg; - rResult12 = NoReg; + rTop111 = NoReg; + rResult13 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop12 = nativeRegisterOrNone(ssNativeTop()); + rTop111 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop12 == NoReg) { - rTop12 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop111 == NoReg) { + rTop111 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult12 = allocateRegNotConflictingWith(1ULL << rTop12); - assert(!(((rTop12 == NoReg) - || (rResult12 == NoReg)))); - size2 = rTop12; - pointer6 = rResult12; + rResult13 = allocateRegNotConflictingWith(1ULL << rTop111); + assert(!(((rTop111 == NoReg) + || (rResult13 == NoReg)))); + size2 = rTop111; + pointer8 = rResult13; nativePopToReg(ssNativeTop(), size2); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i11 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i11 <= simStackPtr; i11 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i11), frameOffsetOfTemporary(i11 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); if (size2 != ReceiverResultReg) { /* begin MoveR:R: */ genoperandoperand(MoveRR, size2, ReceiverResultReg); } /* begin CallRT: */ - abstractInstruction11 = genoperand(Call, ceMallocTrampoline); - (abstractInstruction11->annotation = IsRelativeCall); + abstractInstruction12 = genoperand(Call, ceMallocTrampoline); + (abstractInstruction12->annotation = IsRelativeCall); /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, pointer6); - ssPushNativeRegister(pointer6); + genoperandoperand(MoveRR, TempReg, pointer8); + ssPushNativeRegister(pointer8); return 0; case 131: /* begin genLowcodeMemcpy32 */ - rTop7 = (rNext1 = (rNextNext = NoReg)); - nativeValueIndex = 1; + rTop30 = (rNext13 = (rNextNext2 = NoReg)); + nativeValueIndex2 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop30 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext13 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext1 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNextNext = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex)); + if (rNext13 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNext13 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNextNext2 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2)); } - nativeValueIndex += 1; + nativeValueIndex2 += 1; } } - if (rNextNext == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + if (rNextNext2 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNextNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); } } - if (rTop7 == NoReg) { - nextRegisterMask = 0; - if (rNext1 != NoReg) { + if (rTop30 == NoReg) { + nextRegisterMask2 = 0; + if (rNext13 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1ULL << rNext1; + nextRegisterMask2 = 1ULL << rNext13; } - if (rNextNext != NoReg) { - nextRegisterMask = nextRegisterMask | (1ULL << rNextNext); + if (rNextNext2 != NoReg) { + nextRegisterMask2 = nextRegisterMask2 | (1ULL << rNextNext2); } - rTop7 = allocateRegNotConflictingWith(nextRegisterMask); + rTop30 = allocateRegNotConflictingWith(nextRegisterMask2); } - if (rNext1 == NoReg) { + if (rNext13 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1ULL << rTop7; - if (rNextNext != NoReg) { - nextRegisterMask = nextRegisterMask | (1ULL << rNextNext); + nextRegisterMask2 = 1ULL << rTop30; + if (rNextNext2 != NoReg) { + nextRegisterMask2 = nextRegisterMask2 | (1ULL << rNextNext2); } - rNext1 = allocateRegNotConflictingWith(nextRegisterMask); + rNext13 = allocateRegNotConflictingWith(nextRegisterMask2); } - if (rNextNext == NoReg) { + if (rNextNext2 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask = (1ULL << rTop7) | (1ULL << rNext1); - rNextNext = allocateRegNotConflictingWith(nextRegisterMask); + nextRegisterMask2 = (1ULL << rTop30) | (1ULL << rNext13); + rNextNext2 = allocateRegNotConflictingWith(nextRegisterMask2); } - assert(!(((rTop7 == NoReg) - || ((rNext1 == NoReg) - || (rNextNext == NoReg))))); - size3 = rTop7; - source = rNext1; - dest = rNextNext; + assert(!(((rTop30 == NoReg) + || ((rNext13 == NoReg) + || (rNextNext2 == NoReg))))); + size3 = rTop30; + source = rNext13; + dest = rNextNext2; nativePopToReg(ssNativeTop(), size3); ssNativePop(1); nativePopToReg(ssNativeTop(), source); @@ -34855,65 +35106,73 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) nativePopToReg(ssNativeTop(), dest); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i5 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i5 <= simStackPtr; i5 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i5), frameOffsetOfTemporary(i5 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytosize(backEnd, source, dest, size3); return 0; case 132: /* begin genLowcodeMemcpy64 */ - rTop8 = (rNext2 = (rNextNext1 = NoReg)); - nativeValueIndex1 = 1; + rTop31 = (rNext14 = (rNextNext3 = NoReg)); + nativeValueIndex3 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop8 = nativeRegisterOrNone(ssNativeTop()); + rTop31 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext2 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNextNext1 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1)); + if (rNext14 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNext14 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNextNext3 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3)); } - nativeValueIndex1 += 1; + nativeValueIndex3 += 1; } } - if (rNextNext1 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNextNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); + if (rNextNext3 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNextNext3 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); } } - if (rTop8 == NoReg) { - nextRegisterMask1 = 0; - if (rNext2 != NoReg) { + if (rTop31 == NoReg) { + nextRegisterMask3 = 0; + if (rNext14 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1ULL << rNext2; + nextRegisterMask3 = 1ULL << rNext14; } - if (rNextNext1 != NoReg) { - nextRegisterMask1 = nextRegisterMask1 | (1ULL << rNextNext1); + if (rNextNext3 != NoReg) { + nextRegisterMask3 = nextRegisterMask3 | (1ULL << rNextNext3); } - rTop8 = allocateRegNotConflictingWith(nextRegisterMask1); + rTop31 = allocateRegNotConflictingWith(nextRegisterMask3); } - if (rNext2 == NoReg) { + if (rNext14 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1ULL << rTop8; - if (rNextNext1 != NoReg) { - nextRegisterMask1 = nextRegisterMask1 | (1ULL << rNextNext1); + nextRegisterMask3 = 1ULL << rTop31; + if (rNextNext3 != NoReg) { + nextRegisterMask3 = nextRegisterMask3 | (1ULL << rNextNext3); } - rNext2 = allocateRegNotConflictingWith(nextRegisterMask1); + rNext14 = allocateRegNotConflictingWith(nextRegisterMask3); } - if (rNextNext1 == NoReg) { + if (rNextNext3 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask1 = (1ULL << rTop8) | (1ULL << rNext2); - rNextNext1 = allocateRegNotConflictingWith(nextRegisterMask1); + nextRegisterMask3 = (1ULL << rTop31) | (1ULL << rNext14); + rNextNext3 = allocateRegNotConflictingWith(nextRegisterMask3); } - assert(!(((rTop8 == NoReg) - || ((rNext2 == NoReg) - || (rNextNext1 == NoReg))))); - size4 = rTop8; - source1 = rNext2; - dest1 = rNextNext1; + assert(!(((rTop31 == NoReg) + || ((rNext14 == NoReg) + || (rNextNext3 == NoReg))))); + size4 = rTop31; + source1 = rNext14; + dest1 = rNextNext3; nativePopToReg(ssNativeTop(), size4); ssNativePop(1); nativePopToReg(ssNativeTop(), source1); @@ -34921,7 +35180,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) nativePopToReg(ssNativeTop(), dest1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i6 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i6 <= simStackPtr; i6 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i6), frameOffsetOfTemporary(i6 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytosize(backEnd, source1, dest1, sizeLow1); return 0; @@ -34930,44 +35197,52 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodeMemcpyFixed */ size5 = extA; /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask1 = 0; - rTop9 = (rNext3 = NoReg); + topRegistersMask13 = 0; + rTop32 = (rNext15 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop9 = nativeRegisterOrNone(ssNativeTop()); + rTop32 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext3 == NoReg) { + if (rNext15 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg2 = (rNext3 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask1 = 1ULL << reg2; + reg16 = (rNext15 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask13 = 1ULL << reg16; } } - if (rTop9 == NoReg) { - rTop9 = allocateRegNotConflictingWith(topRegistersMask1); + if (rTop32 == NoReg) { + rTop32 = allocateRegNotConflictingWith(topRegistersMask13); } - if (rNext3 == NoReg) { - rNext3 = allocateRegNotConflictingWith(1ULL << rTop9); + if (rNext15 == NoReg) { + rNext15 = allocateRegNotConflictingWith(1ULL << rTop32); } - assert(!(((rTop9 == NoReg) - || (rNext3 == NoReg)))); - source2 = rTop9; - dest2 = rNext3; + assert(!(((rTop32 == NoReg) + || (rNext15 == NoReg)))); + source2 = rTop32; + dest2 = rNext15; nativePopToReg(ssNativeTop(), source2); ssNativePop(1); nativePopToReg(ssNativeTop(), dest2); ssNativePop(1); if (size5 == BytesPerWord) { /* begin checkQuickConstant:forInstruction: */ - anInstruction10 = genoperandoperandoperand(MoveMwrR, 0, source2, TempReg); + anInstruction23 = genoperandoperandoperand(MoveMwrR, 0, source2, TempReg); /* begin checkQuickConstant:forInstruction: */ - anInstruction13 = genoperandoperandoperand(MoveRMwr, TempReg, 0, dest2); + anInstruction110 = genoperandoperandoperand(MoveRMwr, TempReg, 0, dest2); } else { /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i7 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i7 <= simStackPtr; i7 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i7), frameOffsetOfTemporary(i7 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytoconstantSize(backEnd, source2, dest2, size5); } @@ -35016,31 +35291,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 139: /* begin genLowcodeMul32 */ - topRegistersMask2 = 0; - rTop10 = (rNext4 = NoReg); + topRegistersMask = 0; + rTop5 = (rNext = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop10 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext4 == NoReg) { + if (rNext == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg3 = (rNext4 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask2 = 1ULL << reg3; + reg = (rNext = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask = 1ULL << reg; } } - if (rTop10 == NoReg) { - rTop10 = allocateRegNotConflictingWith(topRegistersMask2); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(topRegistersMask); } - if (rNext4 == NoReg) { - rNext4 = allocateRegNotConflictingWith(1ULL << rTop10); + if (rNext == NoReg) { + rNext = allocateRegNotConflictingWith(1ULL << rTop5); } - assert(!(((rTop10 == NoReg) - || (rNext4 == NoReg)))); - second = rTop10; - first = rNext4; + assert(!(((rTop5 == NoReg) + || (rNext == NoReg)))); + second = rTop5; + first = rNext; nativePopToReg(ssNativeTop(), second); ssNativePop(1); nativePopToReg(ssNativeTop(), first); @@ -35052,35 +35327,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 140: /* begin genLowcodeMul64 */ - topRegistersMask3 = 0; - rTop13 = (rNext5 = NoReg); - rResult7 = NoReg; + topRegistersMask1 = 0; + rTop6 = (rNext1 = NoReg); + rResult5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop13 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext5 == NoReg) { + if (rNext1 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg4 = (rNext5 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask3 = 1ULL << reg4; + reg2 = (rNext1 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask1 = 1ULL << reg2; } } - if (rTop13 == NoReg) { - rTop13 = allocateRegNotConflictingWith(topRegistersMask3); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(topRegistersMask1); } - if (rNext5 == NoReg) { - rNext5 = allocateRegNotConflictingWith(1ULL << rTop13); + if (rNext1 == NoReg) { + rNext1 = allocateRegNotConflictingWith(1ULL << rTop6); } - assert(!(((rTop13 == NoReg) - || (rNext5 == NoReg)))); - rResult7 = allocateFloatRegNotConflictingWith((1ULL << rTop13) | (1ULL << rNext5)); - assert(!((rResult7 == NoReg))); - second1 = rTop13; - first1 = rNext5; - result = rResult7; + assert(!(((rTop6 == NoReg) + || (rNext1 == NoReg)))); + rResult5 = allocateFloatRegNotConflictingWith((1ULL << rTop6) | (1ULL << rNext1)); + assert(!((rResult5 == NoReg))); + second1 = rTop6; + first1 = rNext1; + result = rResult5; nativePopToReg(ssNativeTop(), second1); ssNativePop(1); nativePopToReg(ssNativeTop(), first1); @@ -35090,15 +35365,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 141: /* begin genLowcodeNeg32 */ - rTop14 = NoReg; + rTop7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop14 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop14 == NoReg) { - rTop14 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop14 == NoReg))); - value4 = rTop14; + assert(!((rTop7 == NoReg))); + value4 = rTop7; nativePopToReg(ssNativeTop(), value4); ssNativePop(1); /* begin NegateR: */ @@ -35109,15 +35384,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 142: /* begin genLowcodeNeg64 */ /* begin allocateRegistersForLowcodeInteger: */ - rTop16 = NoReg; + rTop12 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop16 = nativeRegisterOrNone(ssNativeTop()); + rTop12 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop16 == NoReg) { - rTop16 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop12 == NoReg) { + rTop12 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop16 == NoReg))); - value5 = rTop16; + assert(!((rTop12 == NoReg))); + value5 = rTop12; nativePopToReg(ssNativeTop(), value5); ssNativePop(1); /* begin NegateR: */ @@ -35127,15 +35402,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 143: /* begin genLowcodeNot32 */ - rTop17 = NoReg; + rTop9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop17 = nativeRegisterOrNone(ssNativeTop()); + rTop9 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop17 == NoReg) { - rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop9 == NoReg) { + rTop9 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop17 == NoReg))); - value6 = rTop17; + assert(!((rTop9 == NoReg))); + value6 = rTop9; nativePopToReg(ssNativeTop(), value6); ssNativePop(1); /* begin NotR: */ @@ -35146,15 +35421,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 144: /* begin genLowcodeNot64 */ /* begin allocateRegistersForLowcodeInteger: */ - rTop19 = NoReg; + rTop13 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop19 = nativeRegisterOrNone(ssNativeTop()); + rTop13 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop19 == NoReg) { - rTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop13 == NoReg) { + rTop13 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop19 == NoReg))); - value7 = rTop19; + assert(!((rTop13 == NoReg))); + value7 = rTop13; nativePopToReg(ssNativeTop(), value7); ssNativePop(1); /* begin NotR: */ @@ -35164,35 +35439,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 145: /* begin genLowcodeOr32 */ - topRegistersMask6 = 0; - rTop20 = (rNext8 = NoReg); - rResult8 = NoReg; + topRegistersMask4 = 0; + rTop14 = (rNext4 = NoReg); + rResult6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop20 = nativeRegisterOrNone(ssNativeTop()); + rTop14 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext8 == NoReg) { + if (rNext4 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg7 = (rNext8 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask6 = 1ULL << reg7; + reg5 = (rNext4 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask4 = 1ULL << reg5; } } - if (rTop20 == NoReg) { - rTop20 = allocateRegNotConflictingWith(topRegistersMask6); + if (rTop14 == NoReg) { + rTop14 = allocateRegNotConflictingWith(topRegistersMask4); } - if (rNext8 == NoReg) { - rNext8 = allocateRegNotConflictingWith(1ULL << rTop20); + if (rNext4 == NoReg) { + rNext4 = allocateRegNotConflictingWith(1ULL << rTop14); } - assert(!(((rTop20 == NoReg) - || (rNext8 == NoReg)))); - rResult8 = allocateFloatRegNotConflictingWith((1ULL << rTop20) | (1ULL << rNext8)); - assert(!((rResult8 == NoReg))); - second2 = rTop20; - first2 = rNext8; - result1 = rResult8; + assert(!(((rTop14 == NoReg) + || (rNext4 == NoReg)))); + rResult6 = allocateFloatRegNotConflictingWith((1ULL << rTop14) | (1ULL << rNext4)); + assert(!((rResult6 == NoReg))); + second2 = rTop14; + first2 = rNext4; + result1 = rResult6; nativePopToReg(ssNativeTop(), second2); ssNativePop(1); nativePopToReg(ssNativeTop(), first2); @@ -35205,10 +35480,10 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 146: /* begin genLowcodeOr64 */ /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask7 = 0; - rTop110 = (rNext11 = NoReg); + topRegistersMask5 = 0; + rTop15 = (rNext11 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop110 = nativeRegisterOrNone(ssNativeTop()); + rTop15 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext11 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -35216,19 +35491,19 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) if (rNext11 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg8 = (rNext11 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask7 = 1ULL << reg8; + reg6 = (rNext11 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask5 = 1ULL << reg6; } } - if (rTop110 == NoReg) { - rTop110 = allocateRegNotConflictingWith(topRegistersMask7); + if (rTop15 == NoReg) { + rTop15 = allocateRegNotConflictingWith(topRegistersMask5); } if (rNext11 == NoReg) { - rNext11 = allocateRegNotConflictingWith(1ULL << rTop110); + rNext11 = allocateRegNotConflictingWith(1ULL << rTop15); } - assert(!(((rTop110 == NoReg) + assert(!(((rTop15 == NoReg) || (rNext11 == NoReg)))); - second3 = rTop110; + second3 = rTop15; first3 = rNext11; nativePopToReg(ssNativeTop(), second3); ssNativePop(1); @@ -35243,7 +35518,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodePerformCallout */ callSwitchToCStack(); /* begin checkLiteral:forInstruction: */ - anInstruction16 = genoperandoperand(MoveCwR, extA, TempReg); + anInstruction14 = genoperandoperand(MoveCwR, extA, TempReg); /* begin CallRT: */ abstractInstruction = genoperand(Call, ceFFICalloutTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -35259,11 +35534,11 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) ssNativePop(1); callSwitchToCStack(); /* begin CallRT: */ - abstractInstruction4 = genoperand(Call, ceFFICalloutTrampoline); - (abstractInstruction4->annotation = IsRelativeCall); + abstractInstruction2 = genoperand(Call, ceFFICalloutTrampoline); + (abstractInstruction2->annotation = IsRelativeCall); /* begin annotateBytecode: */ - abstractInstruction12 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); - (abstractInstruction12->annotation = HasBytecodePC); + abstractInstruction11 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); + (abstractInstruction11->annotation = HasBytecodePC); return 0; case 149: @@ -35309,19 +35584,19 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodePointerAddConstantOffset */ offset4 = extB; /* begin allocateRegistersForLowcodeInteger: */ - rTop22 = NoReg; + rTop17 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop22 = nativeRegisterOrNone(ssNativeTop()); + rTop17 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop22 == NoReg) { - rTop22 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop17 == NoReg) { + rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop22 == NoReg))); - base = rTop22; + assert(!((rTop17 == NoReg))); + base = rTop17; nativePopToReg(ssNativeTop(), base); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction17 = genoperandoperand(AddCqR, offset4, base); + anInstruction15 = genoperandoperand(AddCqR, offset4, base); ssPushNativeRegister(base); extB = 0; numExtB = 0; @@ -35329,31 +35604,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 163: /* begin genLowcodePointerAddOffset32 */ - topRegistersMask8 = 0; - rTop23 = (rNext10 = NoReg); + topRegistersMask6 = 0; + rTop18 = (rNext6 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop23 = nativeRegisterOrNone(ssNativeTop()); + rTop18 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext6 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext10 == NoReg) { + if (rNext6 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg9 = (rNext10 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask8 = 1ULL << reg9; + reg7 = (rNext6 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask6 = 1ULL << reg7; } } - if (rTop23 == NoReg) { - rTop23 = allocateRegNotConflictingWith(topRegistersMask8); + if (rTop18 == NoReg) { + rTop18 = allocateRegNotConflictingWith(topRegistersMask6); } - if (rNext10 == NoReg) { - rNext10 = allocateRegNotConflictingWith(1ULL << rTop23); + if (rNext6 == NoReg) { + rNext6 = allocateRegNotConflictingWith(1ULL << rTop18); } - assert(!(((rTop23 == NoReg) - || (rNext10 == NoReg)))); - offset5 = rTop23; - base1 = rNext10; + assert(!(((rTop18 == NoReg) + || (rNext6 == NoReg)))); + offset5 = rTop18; + base1 = rNext6; nativePopToReg(ssNativeTop(), offset5); ssNativePop(1); nativePopToReg(ssNativeTop(), base1); @@ -35366,31 +35641,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 164: /* begin genLowcodePointerAddOffset64 */ /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask9 = 0; - rTop111 = (rNext13 = NoReg); + topRegistersMask7 = 0; + rTop19 = (rNext12 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop111 = nativeRegisterOrNone(ssNativeTop()); + rTop19 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext13 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext12 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext13 == NoReg) { + if (rNext12 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg10 = (rNext13 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask9 = 1ULL << reg10; + reg8 = (rNext12 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask7 = 1ULL << reg8; } } - if (rTop111 == NoReg) { - rTop111 = allocateRegNotConflictingWith(topRegistersMask9); + if (rTop19 == NoReg) { + rTop19 = allocateRegNotConflictingWith(topRegistersMask7); } - if (rNext13 == NoReg) { - rNext13 = allocateRegNotConflictingWith(1ULL << rTop111); + if (rNext12 == NoReg) { + rNext12 = allocateRegNotConflictingWith(1ULL << rTop19); } - assert(!(((rTop111 == NoReg) - || (rNext13 == NoReg)))); - offset6 = rTop111; - base2 = rNext13; + assert(!(((rTop19 == NoReg) + || (rNext12 == NoReg)))); + offset6 = rTop19; + base2 = rNext12; nativePopToReg(ssNativeTop(), offset6); ssNativePop(1); nativePopToReg(ssNativeTop(), base2); @@ -35402,31 +35677,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 165: /* begin genLowcodePointerEqual */ - topRegistersMask10 = 0; - rTop25 = (rNext14 = NoReg); + topRegistersMask8 = 0; + rTop21 = (rNext8 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop25 = nativeRegisterOrNone(ssNativeTop()); + rTop21 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext14 == NoReg) { + if (rNext8 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg15 = (rNext14 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask10 = 1ULL << reg15; + reg9 = (rNext8 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask8 = 1ULL << reg9; } } - if (rTop25 == NoReg) { - rTop25 = allocateRegNotConflictingWith(topRegistersMask10); + if (rTop21 == NoReg) { + rTop21 = allocateRegNotConflictingWith(topRegistersMask8); } - if (rNext14 == NoReg) { - rNext14 = allocateRegNotConflictingWith(1ULL << rTop25); + if (rNext8 == NoReg) { + rNext8 = allocateRegNotConflictingWith(1ULL << rTop21); } - assert(!(((rTop25 == NoReg) - || (rNext14 == NoReg)))); - second4 = rTop25; - first4 = rNext14; + assert(!(((rTop21 == NoReg) + || (rNext8 == NoReg)))); + second4 = rTop21; + first4 = rNext8; nativePopToReg(ssNativeTop(), second4); ssNativePop(1); nativePopToReg(ssNativeTop(), first4); @@ -35436,43 +35711,43 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin JumpNonZero: */ falseJump = genConditionalBranchoperand(JumpNonZero, ((sqInt)0)); /* begin checkQuickConstant:forInstruction: */ - anInstruction19 = genoperandoperand(MoveCqR, 1, first4); + anInstruction17 = genoperandoperand(MoveCqR, 1, first4); /* begin Jump: */ contJump = genoperand(Jump, ((sqInt)0)); jmpTarget(falseJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); /* begin checkQuickConstant:forInstruction: */ - anInstruction18 = genoperandoperand(MoveCqR, 0, first4); + anInstruction16 = genoperandoperand(MoveCqR, 0, first4); jmpTarget(contJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); ssPushNativeRegister(first4); return 0; case 166: /* begin genLowcodePointerNotEqual */ - topRegistersMask11 = 0; - rTop26 = (rNext15 = NoReg); + topRegistersMask9 = 0; + rTop22 = (rNext9 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop26 = nativeRegisterOrNone(ssNativeTop()); + rTop22 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext15 == NoReg) { + if (rNext9 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg16 = (rNext15 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask11 = 1ULL << reg16; + reg10 = (rNext9 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask9 = 1ULL << reg10; } } - if (rTop26 == NoReg) { - rTop26 = allocateRegNotConflictingWith(topRegistersMask11); + if (rTop22 == NoReg) { + rTop22 = allocateRegNotConflictingWith(topRegistersMask9); } - if (rNext15 == NoReg) { - rNext15 = allocateRegNotConflictingWith(1ULL << rTop26); + if (rNext9 == NoReg) { + rNext9 = allocateRegNotConflictingWith(1ULL << rTop22); } - assert(!(((rTop26 == NoReg) - || (rNext15 == NoReg)))); - second5 = rTop26; - first5 = rNext15; + assert(!(((rTop22 == NoReg) + || (rNext9 == NoReg)))); + second5 = rTop22; + first5 = rNext9; nativePopToReg(ssNativeTop(), second5); ssNativePop(1); nativePopToReg(ssNativeTop(), first5); @@ -35482,62 +35757,62 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin JumpZero: */ falseJump1 = genConditionalBranchoperand(JumpZero, ((sqInt)0)); /* begin checkQuickConstant:forInstruction: */ - anInstruction20 = genoperandoperand(MoveCqR, 1, first5); + anInstruction19 = genoperandoperand(MoveCqR, 1, first5); /* begin Jump: */ contJump1 = genoperand(Jump, ((sqInt)0)); jmpTarget(falseJump1, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); /* begin checkQuickConstant:forInstruction: */ - anInstruction110 = genoperandoperand(MoveCqR, 0, first5); + anInstruction18 = genoperandoperand(MoveCqR, 0, first5); jmpTarget(contJump1, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); ssPushNativeRegister(first5); return 0; case 167: /* begin genLowcodePointerToInt32 */ - rTop27 = NoReg; + rTop23 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop27 = nativeRegisterOrNone(ssNativeTop()); + rTop23 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop27 == NoReg) { - rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop23 == NoReg) { + rTop23 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop27 == NoReg))); - pointer7 = rTop27; - nativePopToReg(ssNativeTop(), pointer7); + assert(!((rTop23 == NoReg))); + pointer5 = rTop23; + nativePopToReg(ssNativeTop(), pointer5); ssNativePop(1); - ssPushNativeRegister(pointer7); + ssPushNativeRegister(pointer5); return 0; case 168: /* begin genLowcodePointerToInt64 */ /* begin allocateRegistersForLowcodeIntegerResultInteger: */ - rTop112 = NoReg; - rResult13 = NoReg; + rTop110 = NoReg; + rResult12 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop112 = nativeRegisterOrNone(ssNativeTop()); + rTop110 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop112 == NoReg) { - rTop112 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop110 == NoReg) { + rTop110 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult13 = allocateRegNotConflictingWith(1ULL << rTop112); - assert(!(((rTop112 == NoReg) - || (rResult13 == NoReg)))); - pointer8 = rTop112; - result2 = rResult13; - nativePopToReg(ssNativeTop(), pointer8); + rResult12 = allocateRegNotConflictingWith(1ULL << rTop110); + assert(!(((rTop110 == NoReg) + || (rResult12 == NoReg)))); + pointer6 = rTop110; + result2 = rResult12; + nativePopToReg(ssNativeTop(), pointer6); ssNativePop(1); - ssPushNativeRegister(pointer8); + ssPushNativeRegister(pointer6); return 0; case 169: /* begin genLowcodePopFloat32 */ - topRegistersMask12 = 0; + topRegistersMask10 = 0; frTop = NoReg; if ((nativeFloatRegisterOrNone(ssNativeTop())) != NoReg) { frTop = nativeFloatRegisterOrNone(ssNativeTop()); } if (frTop == NoReg) { - frTop = allocateFloatRegNotConflictingWith(topRegistersMask12); + frTop = allocateFloatRegNotConflictingWith(topRegistersMask10); } assert(!((frTop == NoReg))); value8 = frTop; @@ -35547,13 +35822,13 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 170: /* begin genLowcodePopFloat64 */ - topRegistersMask13 = 0; + topRegistersMask11 = 0; frTop1 = NoReg; if ((nativeFloatRegisterOrNone(ssNativeTop())) != NoReg) { frTop1 = nativeFloatRegisterOrNone(ssNativeTop()); } if (frTop1 == NoReg) { - frTop1 = allocateFloatRegNotConflictingWith(topRegistersMask13); + frTop1 = allocateFloatRegNotConflictingWith(topRegistersMask11); } assert(!((frTop1 == NoReg))); value9 = frTop1; @@ -35563,30 +35838,30 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 171: /* begin genLowcodePopInt32 */ - rTop29 = NoReg; + rTop25 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop29 = nativeRegisterOrNone(ssNativeTop()); + rTop25 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop29 == NoReg) { - rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop25 == NoReg) { + rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop29 == NoReg))); - value10 = rTop29; + assert(!((rTop25 == NoReg))); + value10 = rTop25; nativePopToReg(ssNativeTop(), value10); ssNativePop(1); return 0; case 172: /* begin genLowcodePopInt64 */ - rTop30 = NoReg; + rTop26 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop30 = nativeRegisterOrNone(ssNativeTop()); + rTop26 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop30 == NoReg) { - rTop30 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop26 == NoReg) { + rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop30 == NoReg))); - value11 = rTop30; + assert(!((rTop26 == NoReg))); + value11 = rTop26; nativePopToReg(ssNativeTop(), value11); ssNativePop(1); return 0; @@ -35599,16 +35874,16 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 174: /* begin genLowcodePopPointer */ - rTop31 = NoReg; + rTop27 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop31 = nativeRegisterOrNone(ssNativeTop()); + rTop27 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop31 == NoReg) { - rTop31 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop27 == NoReg) { + rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop31 == NoReg))); - pointerValue9 = rTop31; - nativePopToReg(ssNativeTop(), pointerValue9); + assert(!((rTop27 == NoReg))); + pointerValue7 = rTop27; + nativePopToReg(ssNativeTop(), pointerValue7); ssNativePop(1); return 0; @@ -39928,7 +40203,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -40416,6 +40691,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -40423,7 +40699,15 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -40450,11 +40734,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -40541,7 +40824,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -40553,9 +40836,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -40654,6 +40937,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -40673,7 +40957,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((((rcvrInt = ((ssValue(1))->constant)))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -40716,7 +41000,15 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -40891,6 +41183,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -40908,14 +41201,22 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((((argInt = ((ssTop())->constant)))) & 7) == 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((((ssValue(1))->constant))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -41088,6 +41389,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -41111,7 +41413,15 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -41137,6 +41447,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -41165,8 +41476,87 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI /* begin annotateBytecode: */ abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); - /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + /* begin putSelfInReceiverResultReg */ + storeToReg(simSelf(), ReceiverResultReg); + /* begin Jump: */ + immutabilityFailure = genoperand(Jump, ((sqInt)0)); + jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + } +# endif /* IMMUTABILITY */ + ssPop(1); + ssAllocateCallRegand(ClassReg, SendNumArgsReg); + ssPush(1); + genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); + ssStoreAndReplacePoptoReg(popBoolean, ClassReg); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } + /* begin checkQuickConstant:forInstruction: */ + anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); + /* begin CallRT: */ + abstractInstruction = genoperand(Call, ceStoreContextInstVarTrampoline); + (abstractInstruction->annotation = IsRelativeCall); + +# if IMMUTABILITY + if (needsImmCheck) { + jmpTarget(immutabilityFailure, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + } +# endif /* IMMUTABILITY */ + return 0; +} + + +/* The reason we need a frame here is that assigning to an inst var of a + context may + involve wholesale reorganization of stack pages, and the only way to + preserve the + execution state of an activation in that case is if it has a frame. */ + + /* StackToRegisterMappingCogit>>#genStorePop:MaybeContextRemoteInstVar:ofObjectAt:needsStoreCheck:needsImmutabilityCheck: */ +static sqInt NoDbgRegParms +genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) +{ + AbstractInstruction *abstractInstruction; + AbstractInstruction *abstractInstruction1; + AbstractInstruction *abstractInstruction2; + AbstractInstruction *abstractInstruction3; + AbstractInstruction *anInstruction; + AbstractInstruction *anInstruction1; + sqInt i; + AbstractInstruction *immutabilityFailure; + AbstractInstruction *mutableJump; + + assert(needsFrame); + genLoadTempin(objectIndex, ReceiverResultReg); + /* begin genGenericStorePop:MaybeContextSlotIndex:needsStoreCheck:needsRestoreRcvr:needsImmutabilityCheck: */ + assert(needsFrame); + +# if IMMUTABILITY + if (needsImmCheck) { + mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); + /* begin genStoreTrampolineCall: */ + if (slotIndex >= (NumStoreTrampolines - 1)) { + /* begin checkQuickConstant:forInstruction: */ + anInstruction = genoperandoperand(MoveCqR, slotIndex, TempReg); + /* begin CallRT: */ + abstractInstruction3 = genoperand(Call, ceStoreTrampolines[NumStoreTrampolines - 1]); + (abstractInstruction3->annotation = IsRelativeCall); + } + else { + /* begin CallRT: */ + abstractInstruction1 = genoperand(Call, ceStoreTrampolines[slotIndex]); + (abstractInstruction1->annotation = IsRelativeCall); + } + /* begin annotateBytecode: */ + abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); + (abstractInstruction2->annotation = HasBytecodePC); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -41178,77 +41568,15 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); - /* begin checkQuickConstant:forInstruction: */ - anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); - /* begin CallRT: */ - abstractInstruction = genoperand(Call, ceStoreContextInstVarTrampoline); - (abstractInstruction->annotation = IsRelativeCall); - -# if IMMUTABILITY - if (needsImmCheck) { - jmpTarget(immutabilityFailure, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); - } -# endif /* IMMUTABILITY */ - return 0; -} - - -/* The reason we need a frame here is that assigning to an inst var of a - context may - involve wholesale reorganization of stack pages, and the only way to - preserve the - execution state of an activation in that case is if it has a frame. */ - - /* StackToRegisterMappingCogit>>#genStorePop:MaybeContextRemoteInstVar:ofObjectAt:needsStoreCheck:needsImmutabilityCheck: */ -static sqInt NoDbgRegParms -genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) -{ - AbstractInstruction *abstractInstruction; - AbstractInstruction *abstractInstruction1; - AbstractInstruction *abstractInstruction2; - AbstractInstruction *abstractInstruction3; - AbstractInstruction *anInstruction; - AbstractInstruction *anInstruction1; - AbstractInstruction *immutabilityFailure; - AbstractInstruction *mutableJump; - - assert(needsFrame); - genLoadTempin(objectIndex, ReceiverResultReg); - /* begin genGenericStorePop:MaybeContextSlotIndex:needsStoreCheck:needsRestoreRcvr:needsImmutabilityCheck: */ - assert(needsFrame); - -# if IMMUTABILITY - if (needsImmCheck) { - mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); - /* begin genStoreTrampolineCall: */ - if (slotIndex >= (NumStoreTrampolines - 1)) { - /* begin checkQuickConstant:forInstruction: */ - anInstruction = genoperandoperand(MoveCqR, slotIndex, TempReg); - /* begin CallRT: */ - abstractInstruction3 = genoperand(Call, ceStoreTrampolines[NumStoreTrampolines - 1]); - (abstractInstruction3->annotation = IsRelativeCall); - } - else { - /* begin CallRT: */ - abstractInstruction1 = genoperand(Call, ceStoreTrampolines[slotIndex]); - (abstractInstruction1->annotation = IsRelativeCall); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); } - /* begin annotateBytecode: */ - abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); - (abstractInstruction2->annotation = HasBytecodePC); - /* begin Jump: */ - immutabilityFailure = genoperand(Jump, ((sqInt)0)); - jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + simSpillBase = simStackPtr + 1; } -# endif /* IMMUTABILITY */ - ssPop(1); - ssAllocateCallRegand(ClassReg, SendNumArgsReg); - ssPush(1); - genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); - ssStoreAndReplacePoptoReg(popBoolean, ClassReg); - /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -41267,6 +41595,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -41284,7 +41613,15 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -41297,6 +41634,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -41308,7 +41646,15 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -41365,7 +41711,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -41390,6 +41736,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -41398,7 +41745,15 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -41436,64 +41791,40 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - (fixup->simNativeStackPtr) = UnknownSimStackPtrFlag; - (fixup->simNativeStackSize) = 0; -} - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -41503,32 +41834,36 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; } @@ -41537,25 +41872,25 @@ initSimStackForFramelessBlock(sqInt startpc) static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -41563,16 +41898,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; } @@ -41682,10 +42018,21 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -41696,7 +42043,15 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -41705,7 +42060,15 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -41776,7 +42139,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -41784,7 +42146,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; + sqInt i1; + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -41797,14 +42170,11 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); simNativeStackPtr = (fixup->simNativeStackPtr); simNativeStackSize = (fixup->simNativeStackSize); } @@ -41812,10 +42182,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); (fixup->simNativeStackPtr = simNativeStackPtr); (fixup->simNativeStackSize = simNativeStackSize); @@ -41825,18 +42203,17 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) assert(simNativeStackPtr == ((fixup->simNativeStackPtr))); assert(simNativeStackSize == ((fixup->simNativeStackSize))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } - for (i = 0; i <= simNativeStackPtr; i += 1) { - ensureIsMarkedAsSpilled(simNativeStackAt(i)); + simSpillBase = simStackPtr + 1; + for (i1 = 0; i1 <= simNativeStackPtr; i1 += 1) { + ensureIsMarkedAsSpilled(simNativeStackAt(i1)); } simNativeSpillBase = simNativeStackPtr + 1; return 0; @@ -41849,6 +42226,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -41924,6 +42317,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -41934,6 +42338,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -41954,7 +42359,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -42074,6 +42484,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -42150,7 +42561,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -42228,7 +42644,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1ULL << requiredReg1) | ((1ULL << requiredReg2) | (1ULL << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1ULL << requiredReg1) | (1ULL << requiredReg2)) | (1ULL << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredFloatRegMask:upThrough:upThroughNative: */ @@ -42236,6 +42652,7 @@ static void NoDbgRegParms ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -42253,6 +42670,7 @@ ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, s lastRequired = i; } } + assert(lastRequiredNative == simNativeStackPtr); for (i = (((simNativeSpillBase < 0) ? 0 : simNativeSpillBase)); i <= nativeStackPtr; i += 1) { liveRegs = liveRegs | (nativeRegisterMask(simNativeStackAt(i))); if ((0 /* floatRegisterMask */ & requiredRegsMask) != 0) { @@ -42262,7 +42680,16 @@ ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, s if (!((liveRegs & requiredRegsMask) == 0)) { /* Some live, must spill */ - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(((liveFloatRegisters()) & requiredRegsMask) == 0); } } @@ -42286,6 +42713,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -42300,10 +42728,11 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } + assert(nativeStackPtr == simNativeStackPtr); for (i = (((simNativeSpillBase < 0) ? 0 : simNativeSpillBase)); i <= nativeStackPtr; i += 1) { liveRegs = liveRegs | (nativeRegisterMask(simNativeStackAt(i))); if ((nativeRegisterMask(simNativeStackAt(i))) & requiredRegsMask) { @@ -42311,7 +42740,16 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -42337,31 +42775,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1ULL << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - ssNativeFlushTo(nativeIndex); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -42371,16 +42784,26 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; ssNativeFlushTo(simNativeStackPtr); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -42396,16 +42819,29 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; ssNativeFlushTo(simNativeStackPtr); + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -42520,11 +42956,33 @@ ssPopNativeSize(sqInt popSize) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -42532,18 +42990,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -42562,18 +43010,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -42582,17 +43047,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -42600,6 +43082,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -42607,8 +43091,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -42817,17 +43317,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -42838,6 +43355,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -42905,13 +43429,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -42929,6 +43446,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -43003,6 +43551,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -43012,18 +43567,27 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spurlowcode64src/vm/cogitX64WIN64.c b/spurlowcode64src/vm/cogitX64WIN64.c index 36329d5fad..489784504e 100644 --- a/spurlowcode64src/vm/cogitX64WIN64.c +++ b/spurlowcode64src/vm/cogitX64WIN64.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -358,7 +358,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 3 #define XCHGRR 157 @@ -451,7 +450,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -622,7 +622,7 @@ static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static CogMethod * NoDbgRegParms fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -701,7 +701,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -1036,7 +1036,6 @@ static CogSimStackNativeEntry * NoDbgRegParms nativeStackPopToReg(CogSimStackNat static CogSimStackNativeEntry * NoDbgRegParms nativeStackPopToRegsecondReg(CogSimStackNativeEntry * self_in_nativeStackPopToRegsecondReg, sqInt reg, sqInt secondReg); static sqInt NoDbgRegParms spillingNeedsScratchRegister(CogSimStackNativeEntry * self_in_spillingNeedsScratchRegister); static sqInt NoDbgRegParms stackSpillSize(CogSimStackNativeEntry * self_in_stackSpillSize); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static sqInt NoDbgRegParms availableRegisterOrNoneFor(AbstractInstruction * self_in_availableRegisterOrNoneFor, sqInt liveRegsMask); static sqInt NoDbgRegParms callFullTargetFromReturnAddress(AbstractInstruction * self_in_callFullTargetFromReturnAddress, sqInt callSiteReturnAddress); @@ -1331,7 +1330,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1343,11 +1341,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1363,7 +1363,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssNativeFlushTo(sqInt index); @@ -1388,14 +1387,16 @@ static sqInt NoDbgRegParms ssPushNativeRegister(sqInt reg); static sqInt NoDbgRegParms ssPushNativeRegistersecondRegister(sqInt reg, sqInt secondReg); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -2072,7 +2073,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -2096,7 +2096,6 @@ static sqInt simNativeSpillBase; static CogSimStackNativeEntry simNativeStack[70]; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2181,6 +2180,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -2946,7 +2946,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -4335,12 +4335,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -6360,7 +6366,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -8261,7 +8267,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -18468,7 +18474,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -18518,7 +18524,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -18796,8 +18802,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -19509,13 +19516,6 @@ stackSpillSize(CogSimStackNativeEntry * self_in_stackSpillSize) return 0; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -25035,11 +25035,7 @@ sizeImmediateGroup1at(AbstractInstruction * self_in_sizeImmediateGroup1at, sqInt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -28653,11 +28649,20 @@ beginHighLevelCall(sqInt alignment) AbstractInstruction *anInstruction4; AbstractInstruction *anInstruction5; AbstractInstruction *anInstruction6; + sqInt i; sqInt mask; sqInt offset; /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); /* begin MoveR:Aw: */ address1 = stackPointerAddress(); @@ -28764,10 +28769,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -29160,6 +29162,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -29725,7 +29730,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -29773,7 +29779,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simNativeStackSize = simNativeStackSize); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -29818,18 +29824,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -29901,7 +29906,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -30127,12 +30132,21 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -30267,7 +30281,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -30561,6 +30575,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -30672,7 +30687,15 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -30903,11 +30926,20 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -30943,13 +30975,22 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -31021,10 +31062,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -31034,13 +31077,29 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -31088,7 +31147,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt i115; sqInt i116; sqInt i117; - sqInt i118; + sqInt i119; sqInt i12; sqInt i120; sqInt i121; @@ -31101,6 +31160,13 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt i17; sqInt i18; sqInt i19; + sqInt i210; + sqInt i211; + sqInt i212; + sqInt i214; + sqInt i29; + sqInt i41; + sqInt i42; sqInt index1; sqInt index11; sqInt index111; @@ -31111,7 +31177,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt index114; sqInt index115; sqInt index116; - sqInt index117; + sqInt index118; sqInt index119; sqInt index12; sqInt index120; @@ -31160,7 +31226,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt rOopTop14; sqInt rOopTop15; sqInt rOopTop16; - sqInt rOopTop17; + sqInt rOopTop18; sqInt rOopTop19; sqInt rOopTop2; sqInt rOopTop20; @@ -31176,6 +31242,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt rOopTop9; sqInt rResult; sqInt rResult1; + sqInt rResult10; sqInt rResult11; sqInt rResult12; sqInt rResult13; @@ -31187,7 +31254,6 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt rResult5; sqInt rResult6; sqInt rResult8; - sqInt rResult9; sqInt value; sqInt value1; sqInt value10; @@ -31208,36 +31274,44 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) switch (prim) { case 0: /* begin genLowcodeByteSizeOf */ - rOopTop16 = NoReg; - rResult9 = NoReg; + rOopTop19 = NoReg; + rResult10 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop16 = registerOrNone(ssTop()); - index116 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i116 = index116; i116 <= (simStackPtr); i116 += 1) { - if ((registerOrNone(simStackAt(index116))) == rOopTop16) { - goto l51; + rOopTop19 = registerOrNone(ssTop()); + index119 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i119 = index119; i119 <= (simStackPtr); i119 += 1) { + if ((registerOrNone(simStackAt(index119))) == rOopTop19) { + goto l62; } } - l51: ; - rOopTop16 = NoReg; - l50: ; + l62: ; + rOopTop19 = NoReg; + l61: ; } - if (rOopTop16 == NoReg) { - rOopTop16 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop19 == NoReg) { + rOopTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult9 = allocateRegNotConflictingWith(1ULL << rOopTop16); - assert(!(((rOopTop16 == NoReg) - || (rResult9 == NoReg)))); - object15 = rOopTop16; - value8 = rResult9; - popToReg(ssTop(), object15); + rResult10 = allocateRegNotConflictingWith(1ULL << rOopTop19); + assert(!(((rOopTop19 == NoReg) + || (rResult10 == NoReg)))); + object17 = rOopTop19; + value9 = rResult10; + popToReg(ssTop(), object17); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i29 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i29 <= simStackPtr; i29 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i29), frameOffsetOfTemporary(i29 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - genLcByteSizeOfto(object15, value8); + genLcByteSizeOfto(object17, value9); return 0; case 1: @@ -31574,63 +31648,63 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) case 12: /* begin genLowcodeOopToBoolean32 */ - rOopTop17 = NoReg; + rOopTop16 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop17 = registerOrNone(ssTop()); - index117 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i117 = index117; i117 <= (simStackPtr); i117 += 1) { - if ((registerOrNone(simStackAt(index117))) == rOopTop17) { - goto l55; + rOopTop16 = registerOrNone(ssTop()); + index116 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i116 = index116; i116 <= (simStackPtr); i116 += 1) { + if ((registerOrNone(simStackAt(index116))) == rOopTop16) { + goto l52; } } - l55: ; - rOopTop17 = NoReg; - l54: ; + l52: ; + rOopTop16 = NoReg; + l51: ; } - if (rOopTop17 == NoReg) { - rOopTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop16 == NoReg) { + rOopTop16 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rOopTop17 == NoReg))); - object16 = rOopTop17; - popToReg(ssTop(), object16); + assert(!((rOopTop16 == NoReg))); + object15 = rOopTop16; + popToReg(ssTop(), object15); ssPop(1); - annotateobjRef(gSubCwR(falseObject(), object16), falseObject()); - ssPushNativeRegister(object16); + annotateobjRef(gSubCwR(falseObject(), object15), falseObject()); + ssPushNativeRegister(object15); return 0; case 13: /* begin genLowcodeOopToBoolean64 */ /* begin allocateRegistersForLowcodeOopResultInteger: */ - rOopTop19 = NoReg; + rOopTop18 = NoReg; rResult12 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop19 = registerOrNone(ssTop()); - index119 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i118 = index119; i118 <= (simStackPtr); i118 += 1) { - if ((registerOrNone(simStackAt(index119))) == rOopTop19) { - goto l57; + rOopTop18 = registerOrNone(ssTop()); + index118 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i117 = index118; i117 <= (simStackPtr); i117 += 1) { + if ((registerOrNone(simStackAt(index118))) == rOopTop18) { + goto l54; } } - l57: ; - rOopTop19 = NoReg; - l61: ; + l54: ; + rOopTop18 = NoReg; + l58: ; } - if (rOopTop19 == NoReg) { - rOopTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop18 == NoReg) { + rOopTop18 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult12 = allocateRegNotConflictingWith(1ULL << rOopTop19); - assert(!(((rOopTop19 == NoReg) + rResult12 = allocateRegNotConflictingWith(1ULL << rOopTop18); + assert(!(((rOopTop18 == NoReg) || (rResult12 == NoReg)))); - object17 = rOopTop19; - value9 = rResult12; - popToReg(ssTop(), object17); + object16 = rOopTop18; + value8 = rResult12; + popToReg(ssTop(), object16); ssPop(1); - annotateobjRef(gSubCwR(falseObject(), object17), falseObject()); - ssPushNativeRegister(object17); + annotateobjRef(gSubCwR(falseObject(), object16), falseObject()); + ssPushNativeRegister(object16); return 0; case 14: @@ -31662,7 +31736,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object18); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i210 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i210 <= simStackPtr; i210 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i210), frameOffsetOfTemporary(i210 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoFloat32(object18, value10); return 0; @@ -31696,7 +31778,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object19); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i211 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i211 <= simStackPtr; i211 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i211), frameOffsetOfTemporary(i211 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoFloat64(object19, value11); return 0; @@ -31726,7 +31816,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object20); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i212 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i212 <= simStackPtr; i212 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i212), frameOffsetOfTemporary(i212 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToInt32(object20); return 0; @@ -31761,7 +31859,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object21); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i41 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i41 <= simStackPtr; i41 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i41), frameOffsetOfTemporary(i41 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToInt64(object21); return 0; @@ -31853,7 +31959,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object22); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i214 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i214 <= simStackPtr; i214 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i214), frameOffsetOfTemporary(i214 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToUInt32(object22); return 0; @@ -31888,7 +32002,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object23); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i42 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i42 <= simStackPtr; i42 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i42), frameOffsetOfTemporary(i42 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToUInt64(object23); return 0; @@ -31970,6 +32092,13 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) sqInt floatValue; sqInt frTop; sqInt frTop1; + sqInt i; + sqInt i1; + sqInt i11; + sqInt i12; + sqInt i2; + sqInt i4; + sqInt i5; AbstractInstruction * inst; AbstractInstruction * inst1; sqInt object; @@ -32100,7 +32229,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), singleFloatValue); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcFloat32toOop(singleFloatValue, object2); return 0; @@ -32125,7 +32262,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), floatValue); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcFloat64toOop(floatValue, object3); return 0; @@ -32144,7 +32289,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value2); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInt32ToOop(value2); return 0; @@ -32164,7 +32317,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value3); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i11 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i11 <= simStackPtr; i11 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i11), frameOffsetOfTemporary(i11 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInt64ToOop(value3); return 0; @@ -32173,51 +32334,59 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) /* begin genLowcodePointerToOop */ pointerClassLiteral = getLiteral(extA); /* begin allocateRegistersForLowcodeInteger: */ - rTop5 = NoReg; + rTop7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop5 == NoReg))); - pointer = rTop5; - nativePopToReg(ssNativeTop(), pointer); + assert(!((rTop7 == NoReg))); + pointer1 = rTop7; + nativePopToReg(ssNativeTop(), pointer1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 <= simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - genLcPointerToOopclass(pointer, pointerClassLiteral); + genLcPointerToOopclass(pointer1, pointerClassLiteral); extA = 0; return 0; case 7: /* begin genLowcodePointerToOopReinterprer */ - rTop6 = NoReg; + rTop5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop6 == NoReg))); - pointer1 = rTop6; - nativePopToReg(ssNativeTop(), pointer1); + assert(!((rTop5 == NoReg))); + pointer = rTop5; + nativePopToReg(ssNativeTop(), pointer); ssNativePop(1); - ssPushRegister(pointer1); + ssPushRegister(pointer); return 0; case 8: /* begin genLowcodeSmallInt32ToOop */ - rTop7 = NoReg; + rTop6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop7 == NoReg) { - rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop7 == NoReg))); - value4 = rTop7; + assert(!((rTop6 == NoReg))); + value4 = rTop6; nativePopToReg(ssNativeTop(), value4); ssNativePop(1); genConvertIntegerToSmallIntegerInReg(value4); @@ -32238,7 +32407,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value5); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i5 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i5 <= simStackPtr; i5 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i5), frameOffsetOfTemporary(i5 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcUInt32ToOop(value5); return 0; @@ -32262,7 +32439,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value6); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i12 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i12 <= simStackPtr; i12 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i12), frameOffsetOfTemporary(i12 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcUInt64ToOop(value6); return 0; @@ -32696,8 +32881,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt frTop2; sqInt frTop3; sqInt frTop4; + sqInt i; sqInt i1; sqInt i11; + sqInt i12; + sqInt i2; + sqInt i21; sqInt index1; sqInt index11; sqInt indexableSize; @@ -32781,11 +32970,11 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt rResult22; sqInt rResult23; sqInt rResult24; - sqInt rResult25; + sqInt rResult29; sqInt rResult3; sqInt rResult30; - sqInt rResult31; - sqInt rResult33; + sqInt rResult32; + sqInt rResult35; sqInt rResult4; sqInt rResult5; sqInt rResult6; @@ -32795,23 +32984,24 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt rTop; sqInt rTop1; sqInt rTop10; + sqInt rTop11; sqInt rTop110; sqInt rTop111; sqInt rTop12; sqInt rTop13; sqInt rTop14; - sqInt rTop15; sqInt rTop16; + sqInt rTop17; sqInt rTop18; - sqInt rTop19; sqInt rTop2; sqInt rTop20; + sqInt rTop21; sqInt rTop22; sqInt rTop23; sqInt rTop24; sqInt rTop25; - sqInt rTop26; sqInt rTop27; + sqInt rTop28; sqInt rTop29; sqInt rTop3; sqInt rTop30; @@ -32820,7 +33010,6 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt rTop6; sqInt rTop7; sqInt rTop8; - sqInt rTop9; sqInt second; sqInt second1; sqInt second10; @@ -33002,23 +33191,31 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 65: /* begin genLowcodeFree */ - rTop = NoReg; + rTop29 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop = nativeRegisterOrNone(ssNativeTop()); + rTop29 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop == NoReg) { - rTop = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop29 == NoReg) { + rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop == NoReg))); - pointer2 = rTop; - nativePopToReg(ssNativeTop(), pointer2); + assert(!((rTop29 == NoReg))); + pointer8 = rTop29; + nativePopToReg(ssNativeTop(), pointer8); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - if (pointer2 != ReceiverResultReg) { + if (pointer8 != ReceiverResultReg) { /* begin MoveR:R: */ - genoperandoperand(MoveRR, pointer2, ReceiverResultReg); + genoperandoperand(MoveRR, pointer8, ReceiverResultReg); } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceFreeTrampoline); @@ -33027,36 +33224,44 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 66: /* begin genLowcodeInstantiateIndexable32Oop */ - rTop1 = (rOopTop = NoReg); + rTop30 = (rOopTop1 = NoReg); rOopResult = NoReg; - topRegisterMask = 0; + topRegisterMask1 = 0; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop1 = nativeRegisterOrNone(ssNativeTop()); + rTop30 = nativeRegisterOrNone(ssNativeTop()); } if ((registerOrNone(ssTop())) != NoReg) { - rOopTop = registerOrNone(ssTop()); + rOopTop1 = registerOrNone(ssTop()); /* begin registerMaskFor: */ - topRegisterMask = 1ULL << rOopTop; + topRegisterMask1 = 1ULL << rOopTop1; } - if (rTop1 == NoReg) { - rTop1 = allocateRegNotConflictingWith(topRegisterMask); + if (rTop30 == NoReg) { + rTop30 = allocateRegNotConflictingWith(topRegisterMask1); } - if (rOopTop == NoReg) { - rOopTop = allocateRegNotConflictingWith(1ULL << rTop1); + if (rOopTop1 == NoReg) { + rOopTop1 = allocateRegNotConflictingWith(1ULL << rTop30); } - rOopResult = allocateRegNotConflictingWith((1ULL << rTop1) | (1ULL << rOopTop)); - assert(!(((rTop1 == NoReg) - || ((rOopTop == NoReg) + rOopResult = allocateRegNotConflictingWith((1ULL << rTop30) | (1ULL << rOopTop1)); + assert(!(((rTop30 == NoReg) + || ((rOopTop1 == NoReg) || (rOopResult == NoReg))))); - indexableSize = rTop1; - classOop = rOopTop; - object = rOopResult; + indexableSize = rTop30; + classOop = rOopTop1; + object1 = rOopResult; nativePopToReg(ssNativeTop(), indexableSize); ssNativePop(1); popToReg(ssTop(), classOop); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOopindexableSize(classOop, indexableSize); return 0; @@ -33065,34 +33270,42 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInstantiateIndexableOop */ indexableSize1 = extA; /* begin allocateRegistersForLowcodeOopResultOop: */ - rOopTop1 = NoReg; - rResult20 = NoReg; + rOopTop2 = NoReg; + rResult35 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop1 = registerOrNone(ssTop()); + rOopTop2 = registerOrNone(ssTop()); index1 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i1 = index1; i1 <= (simStackPtr); i1 += 1) { - if ((registerOrNone(simStackAt(index1))) == rOopTop1) { - goto l40; + for (i11 = index1; i11 <= (simStackPtr); i11 += 1) { + if ((registerOrNone(simStackAt(index1))) == rOopTop2) { + goto l200; } } - l40: ; - rOopTop1 = NoReg; - l39: ; + l200: ; + rOopTop2 = NoReg; + l199: ; } - if (rOopTop1 == NoReg) { - rOopTop1 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop2 == NoReg) { + rOopTop2 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult20 = allocateRegNotConflictingWith(1ULL << rOopTop1); - assert(!(((rOopTop1 == NoReg) - || (rResult20 == NoReg)))); - classOop1 = rOopTop1; - object1 = rResult20; + rResult35 = allocateRegNotConflictingWith(1ULL << rOopTop2); + assert(!(((rOopTop2 == NoReg) + || (rResult35 == NoReg)))); + classOop1 = rOopTop2; + object2 = rResult35; popToReg(ssTop(), classOop1); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOopconstantIndexableSize(classOop1, indexableSize1); extA = 0; @@ -33100,30 +33313,38 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 68: /* begin genLowcodeInstantiateOop */ - rOopTop2 = NoReg; + rOopTop3 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop2 = registerOrNone(ssTop()); + rOopTop3 = registerOrNone(ssTop()); index11 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i11 = index11; i11 <= (simStackPtr); i11 += 1) { - if ((registerOrNone(simStackAt(index11))) == rOopTop2) { - goto l43; + for (i12 = index11; i12 <= (simStackPtr); i12 += 1) { + if ((registerOrNone(simStackAt(index11))) == rOopTop3) { + goto l203; } } - l43: ; - rOopTop2 = NoReg; - l42: ; + l203: ; + rOopTop3 = NoReg; + l202: ; } - if (rOopTop2 == NoReg) { - rOopTop2 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop3 == NoReg) { + rOopTop3 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rOopTop2 == NoReg))); - classOop2 = rOopTop2; + assert(!((rOopTop3 == NoReg))); + classOop2 = rOopTop3; popToReg(ssTop(), classOop2); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i21 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i21 <= simStackPtr; i21 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i21), frameOffsetOfTemporary(i21 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOop(classOop2); return 0; @@ -33131,9 +33352,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 69: /* begin genLowcodeInt32Equal */ topRegistersMask1 = 0; - rTop2 = (rNext = NoReg); + rTop = (rNext = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop2 = nativeRegisterOrNone(ssNativeTop()); + rTop = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33145,15 +33366,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask1 = 1ULL << reg; } } - if (rTop2 == NoReg) { - rTop2 = allocateRegNotConflictingWith(topRegistersMask1); + if (rTop == NoReg) { + rTop = allocateRegNotConflictingWith(topRegistersMask1); } if (rNext == NoReg) { - rNext = allocateRegNotConflictingWith(1ULL << rTop2); + rNext = allocateRegNotConflictingWith(1ULL << rTop); } - assert(!(((rTop2 == NoReg) + assert(!(((rTop == NoReg) || (rNext == NoReg)))); - second = rTop2; + second = rTop; first = rNext; nativePopToReg(ssNativeTop(), second); ssNativePop(1); @@ -33177,9 +33398,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 70: /* begin genLowcodeInt32Great */ topRegistersMask2 = 0; - rTop3 = (rNext1 = NoReg); + rTop1 = (rNext1 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop3 = nativeRegisterOrNone(ssNativeTop()); + rTop1 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33191,15 +33412,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask2 = 1ULL << reg1; } } - if (rTop3 == NoReg) { - rTop3 = allocateRegNotConflictingWith(topRegistersMask2); + if (rTop1 == NoReg) { + rTop1 = allocateRegNotConflictingWith(topRegistersMask2); } if (rNext1 == NoReg) { - rNext1 = allocateRegNotConflictingWith(1ULL << rTop3); + rNext1 = allocateRegNotConflictingWith(1ULL << rTop1); } - assert(!(((rTop3 == NoReg) + assert(!(((rTop1 == NoReg) || (rNext1 == NoReg)))); - second1 = rTop3; + second1 = rTop1; first1 = rNext1; nativePopToReg(ssNativeTop(), second1); ssNativePop(1); @@ -33223,9 +33444,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 71: /* begin genLowcodeInt32GreatEqual */ topRegistersMask3 = 0; - rTop4 = (rNext2 = NoReg); + rTop2 = (rNext2 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop4 = nativeRegisterOrNone(ssNativeTop()); + rTop2 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33237,15 +33458,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask3 = 1ULL << reg2; } } - if (rTop4 == NoReg) { - rTop4 = allocateRegNotConflictingWith(topRegistersMask3); + if (rTop2 == NoReg) { + rTop2 = allocateRegNotConflictingWith(topRegistersMask3); } if (rNext2 == NoReg) { - rNext2 = allocateRegNotConflictingWith(1ULL << rTop4); + rNext2 = allocateRegNotConflictingWith(1ULL << rTop2); } - assert(!(((rTop4 == NoReg) + assert(!(((rTop2 == NoReg) || (rNext2 == NoReg)))); - second2 = rTop4; + second2 = rTop2; first2 = rNext2; nativePopToReg(ssNativeTop(), second2); ssNativePop(1); @@ -33269,9 +33490,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 72: /* begin genLowcodeInt32Less */ topRegistersMask4 = 0; - rTop5 = (rNext3 = NoReg); + rTop3 = (rNext3 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop3 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33283,15 +33504,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask4 = 1ULL << reg3; } } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(topRegistersMask4); + if (rTop3 == NoReg) { + rTop3 = allocateRegNotConflictingWith(topRegistersMask4); } if (rNext3 == NoReg) { - rNext3 = allocateRegNotConflictingWith(1ULL << rTop5); + rNext3 = allocateRegNotConflictingWith(1ULL << rTop3); } - assert(!(((rTop5 == NoReg) + assert(!(((rTop3 == NoReg) || (rNext3 == NoReg)))); - second3 = rTop5; + second3 = rTop3; first3 = rNext3; nativePopToReg(ssNativeTop(), second3); ssNativePop(1); @@ -33315,9 +33536,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 73: /* begin genLowcodeInt32LessEqual */ topRegistersMask5 = 0; - rTop6 = (rNext4 = NoReg); + rTop4 = (rNext4 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop4 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33329,15 +33550,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask5 = 1ULL << reg4; } } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(topRegistersMask5); + if (rTop4 == NoReg) { + rTop4 = allocateRegNotConflictingWith(topRegistersMask5); } if (rNext4 == NoReg) { - rNext4 = allocateRegNotConflictingWith(1ULL << rTop6); + rNext4 = allocateRegNotConflictingWith(1ULL << rTop4); } - assert(!(((rTop6 == NoReg) + assert(!(((rTop4 == NoReg) || (rNext4 == NoReg)))); - second4 = rTop6; + second4 = rTop4; first4 = rNext4; nativePopToReg(ssNativeTop(), second4); ssNativePop(1); @@ -33361,9 +33582,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 74: /* begin genLowcodeInt32NotEqual */ topRegistersMask6 = 0; - rTop7 = (rNext5 = NoReg); + rTop5 = (rNext5 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33375,15 +33596,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask6 = 1ULL << reg5; } } - if (rTop7 == NoReg) { - rTop7 = allocateRegNotConflictingWith(topRegistersMask6); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(topRegistersMask6); } if (rNext5 == NoReg) { - rNext5 = allocateRegNotConflictingWith(1ULL << rTop7); + rNext5 = allocateRegNotConflictingWith(1ULL << rTop5); } - assert(!(((rTop7 == NoReg) + assert(!(((rTop5 == NoReg) || (rNext5 == NoReg)))); - second5 = rTop7; + second5 = rTop5; first5 = rNext5; nativePopToReg(ssNativeTop(), second5); ssNativePop(1); @@ -33406,18 +33627,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 75: /* begin genLowcodeInt32ToFloat32 */ - rTop8 = NoReg; + rTop6 = NoReg; frResult4 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop8 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop8 == NoReg) { - rTop8 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult4 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop8 == NoReg) + assert(!(((rTop6 == NoReg) || (frResult4 == NoReg)))); - value12 = rTop8; + value12 = rTop6; result = frResult4; nativePopToReg(ssNativeTop(), value12); ssNativePop(1); @@ -33428,18 +33649,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 76: /* begin genLowcodeInt32ToFloat64 */ - rTop9 = NoReg; + rTop7 = NoReg; frResult5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop9 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop9 == NoReg) { - rTop9 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult5 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop9 == NoReg) + assert(!(((rTop7 == NoReg) || (frResult5 == NoReg)))); - value13 = rTop9; + value13 = rTop7; result1 = frResult5; nativePopToReg(ssNativeTop(), value13); ssNativePop(1); @@ -33450,15 +33671,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 77: /* begin genLowcodeInt32ToPointer */ - rTop10 = NoReg; + rTop8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop10 = nativeRegisterOrNone(ssNativeTop()); + rTop8 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop10 == NoReg) { - rTop10 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop8 == NoReg) { + rTop8 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop10 == NoReg))); - value14 = rTop10; + assert(!((rTop8 == NoReg))); + value14 = rTop8; nativePopToReg(ssNativeTop(), value14); ssNativePop(1); ssPushNativeRegister(value14); @@ -33468,9 +33689,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInt64Equal */ /* begin allocateRegistersForLowcodeInteger2: */ topRegistersMask7 = 0; - rTop12 = (rNext11 = NoReg); + rTop11 = (rNext11 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop12 = nativeRegisterOrNone(ssNativeTop()); + rTop11 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext11 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33482,15 +33703,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask7 = 1ULL << reg6; } } - if (rTop12 == NoReg) { - rTop12 = allocateRegNotConflictingWith(topRegistersMask7); + if (rTop11 == NoReg) { + rTop11 = allocateRegNotConflictingWith(topRegistersMask7); } if (rNext11 == NoReg) { - rNext11 = allocateRegNotConflictingWith(1ULL << rTop12); + rNext11 = allocateRegNotConflictingWith(1ULL << rTop11); } - assert(!(((rTop12 == NoReg) + assert(!(((rTop11 == NoReg) || (rNext11 == NoReg)))); - second6 = rTop12; + second6 = rTop11; first6 = rNext11; nativePopToReg(ssNativeTop(), second6); ssNativePop(1); @@ -33514,10 +33735,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 79: /* begin genLowcodeInt64Great */ topRegistersMask8 = 0; - rTop13 = (rNext7 = NoReg); - rResult21 = NoReg; + rTop10 = (rNext7 = NoReg); + rResult20 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop13 = nativeRegisterOrNone(ssNativeTop()); + rTop10 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext7 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33529,19 +33750,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask8 = 1ULL << reg7; } } - if (rTop13 == NoReg) { - rTop13 = allocateRegNotConflictingWith(topRegistersMask8); + if (rTop10 == NoReg) { + rTop10 = allocateRegNotConflictingWith(topRegistersMask8); } if (rNext7 == NoReg) { - rNext7 = allocateRegNotConflictingWith(1ULL << rTop13); + rNext7 = allocateRegNotConflictingWith(1ULL << rTop10); } - assert(!(((rTop13 == NoReg) + assert(!(((rTop10 == NoReg) || (rNext7 == NoReg)))); - rResult21 = allocateFloatRegNotConflictingWith((1ULL << rTop13) | (1ULL << rNext7)); - assert(!((rResult21 == NoReg))); - second7 = rTop13; + rResult20 = allocateFloatRegNotConflictingWith((1ULL << rTop10) | (1ULL << rNext7)); + assert(!((rResult20 == NoReg))); + second7 = rTop10; first7 = rNext7; - value15 = rResult21; + value15 = rResult20; nativePopToReg(ssNativeTop(), second7); ssNativePop(1); nativePopToReg(ssNativeTop(), first7); @@ -33552,10 +33773,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 80: /* begin genLowcodeInt64GreatEqual */ topRegistersMask9 = 0; - rTop14 = (rNext8 = NoReg); - rResult22 = NoReg; + rTop12 = (rNext8 = NoReg); + rResult21 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop14 = nativeRegisterOrNone(ssNativeTop()); + rTop12 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33567,19 +33788,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask9 = 1ULL << reg8; } } - if (rTop14 == NoReg) { - rTop14 = allocateRegNotConflictingWith(topRegistersMask9); + if (rTop12 == NoReg) { + rTop12 = allocateRegNotConflictingWith(topRegistersMask9); } if (rNext8 == NoReg) { - rNext8 = allocateRegNotConflictingWith(1ULL << rTop14); + rNext8 = allocateRegNotConflictingWith(1ULL << rTop12); } - assert(!(((rTop14 == NoReg) + assert(!(((rTop12 == NoReg) || (rNext8 == NoReg)))); - rResult22 = allocateFloatRegNotConflictingWith((1ULL << rTop14) | (1ULL << rNext8)); - assert(!((rResult22 == NoReg))); - second8 = rTop14; + rResult21 = allocateFloatRegNotConflictingWith((1ULL << rTop12) | (1ULL << rNext8)); + assert(!((rResult21 == NoReg))); + second8 = rTop12; first8 = rNext8; - value16 = rResult22; + value16 = rResult21; nativePopToReg(ssNativeTop(), second8); ssNativePop(1); nativePopToReg(ssNativeTop(), first8); @@ -33590,10 +33811,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 81: /* begin genLowcodeInt64Less */ topRegistersMask10 = 0; - rTop15 = (rNext9 = NoReg); - rResult23 = NoReg; + rTop13 = (rNext9 = NoReg); + rResult22 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop15 = nativeRegisterOrNone(ssNativeTop()); + rTop13 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33605,19 +33826,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask10 = 1ULL << reg9; } } - if (rTop15 == NoReg) { - rTop15 = allocateRegNotConflictingWith(topRegistersMask10); + if (rTop13 == NoReg) { + rTop13 = allocateRegNotConflictingWith(topRegistersMask10); } if (rNext9 == NoReg) { - rNext9 = allocateRegNotConflictingWith(1ULL << rTop15); + rNext9 = allocateRegNotConflictingWith(1ULL << rTop13); } - assert(!(((rTop15 == NoReg) + assert(!(((rTop13 == NoReg) || (rNext9 == NoReg)))); - rResult23 = allocateFloatRegNotConflictingWith((1ULL << rTop15) | (1ULL << rNext9)); - assert(!((rResult23 == NoReg))); - second9 = rTop15; + rResult22 = allocateFloatRegNotConflictingWith((1ULL << rTop13) | (1ULL << rNext9)); + assert(!((rResult22 == NoReg))); + second9 = rTop13; first9 = rNext9; - value17 = rResult23; + value17 = rResult22; nativePopToReg(ssNativeTop(), second9); ssNativePop(1); nativePopToReg(ssNativeTop(), first9); @@ -33628,10 +33849,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 82: /* begin genLowcodeInt64LessEqual */ topRegistersMask11 = 0; - rTop16 = (rNext10 = NoReg); - rResult24 = NoReg; + rTop14 = (rNext10 = NoReg); + rResult23 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop16 = nativeRegisterOrNone(ssNativeTop()); + rTop14 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33643,19 +33864,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask11 = 1ULL << reg10; } } - if (rTop16 == NoReg) { - rTop16 = allocateRegNotConflictingWith(topRegistersMask11); + if (rTop14 == NoReg) { + rTop14 = allocateRegNotConflictingWith(topRegistersMask11); } if (rNext10 == NoReg) { - rNext10 = allocateRegNotConflictingWith(1ULL << rTop16); + rNext10 = allocateRegNotConflictingWith(1ULL << rTop14); } - assert(!(((rTop16 == NoReg) + assert(!(((rTop14 == NoReg) || (rNext10 == NoReg)))); - rResult24 = allocateFloatRegNotConflictingWith((1ULL << rTop16) | (1ULL << rNext10)); - assert(!((rResult24 == NoReg))); - second10 = rTop16; + rResult23 = allocateFloatRegNotConflictingWith((1ULL << rTop14) | (1ULL << rNext10)); + assert(!((rResult23 == NoReg))); + second10 = rTop14; first10 = rNext10; - value18 = rResult24; + value18 = rResult23; nativePopToReg(ssNativeTop(), second10); ssNativePop(1); nativePopToReg(ssNativeTop(), first10); @@ -33667,9 +33888,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInt64NotEqual */ /* begin allocateRegistersForLowcodeInteger2: */ topRegistersMask12 = 0; - rTop18 = (rNext13 = NoReg); + rTop16 = (rNext13 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop18 = nativeRegisterOrNone(ssNativeTop()); + rTop16 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext13 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33681,15 +33902,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask12 = 1ULL << reg11; } } - if (rTop18 == NoReg) { - rTop18 = allocateRegNotConflictingWith(topRegistersMask12); + if (rTop16 == NoReg) { + rTop16 = allocateRegNotConflictingWith(topRegistersMask12); } if (rNext13 == NoReg) { - rNext13 = allocateRegNotConflictingWith(1ULL << rTop18); + rNext13 = allocateRegNotConflictingWith(1ULL << rTop16); } - assert(!(((rTop18 == NoReg) + assert(!(((rTop16 == NoReg) || (rNext13 == NoReg)))); - second11 = rTop18; + second11 = rTop16; first11 = rNext13; nativePopToReg(ssNativeTop(), second11); ssNativePop(1); @@ -33712,18 +33933,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 84: /* begin genLowcodeInt64ToFloat32 */ - rTop19 = NoReg; + rTop17 = NoReg; frResult6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop19 = nativeRegisterOrNone(ssNativeTop()); + rTop17 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop19 == NoReg) { - rTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop17 == NoReg) { + rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult6 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop19 == NoReg) + assert(!(((rTop17 == NoReg) || (frResult6 == NoReg)))); - value19 = rTop19; + value19 = rTop17; result2 = frResult6; nativePopToReg(ssNativeTop(), value19); ssNativePop(1); @@ -33732,18 +33953,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 85: /* begin genLowcodeInt64ToFloat64 */ - rTop20 = NoReg; + rTop18 = NoReg; frResult7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop20 = nativeRegisterOrNone(ssNativeTop()); + rTop18 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop20 == NoReg) { - rTop20 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop18 == NoReg) { + rTop18 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult7 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop20 == NoReg) + assert(!(((rTop18 == NoReg) || (frResult7 == NoReg)))); - value20 = rTop20; + value20 = rTop18; result3 = frResult7; nativePopToReg(ssNativeTop(), value20); ssNativePop(1); @@ -33770,9 +33991,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 87: /* begin genLowcodeLeftShift32 */ topRegistersMask14 = 0; - rTop22 = (rNext15 = NoReg); + rTop20 = (rNext15 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop22 = nativeRegisterOrNone(ssNativeTop()); + rTop20 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33784,15 +34005,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask14 = 1ULL << reg13; } } - if (rTop22 == NoReg) { - rTop22 = allocateRegNotConflictingWith(topRegistersMask14); + if (rTop20 == NoReg) { + rTop20 = allocateRegNotConflictingWith(topRegistersMask14); } if (rNext15 == NoReg) { - rNext15 = allocateRegNotConflictingWith(1ULL << rTop22); + rNext15 = allocateRegNotConflictingWith(1ULL << rTop20); } - assert(!(((rTop22 == NoReg) + assert(!(((rTop20 == NoReg) || (rNext15 == NoReg)))); - shiftAmount = rTop22; + shiftAmount = rTop20; value22 = rNext15; nativePopToReg(ssNativeTop(), shiftAmount); ssNativePop(1); @@ -33806,10 +34027,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 88: /* begin genLowcodeLeftShift64 */ topRegistersMask15 = 0; - rTop23 = (rNext16 = NoReg); - rResult25 = NoReg; + rTop21 = (rNext16 = NoReg); + rResult24 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop23 = nativeRegisterOrNone(ssNativeTop()); + rTop21 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext16 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33821,19 +34042,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask15 = 1ULL << reg14; } } - if (rTop23 == NoReg) { - rTop23 = allocateRegNotConflictingWith(topRegistersMask15); + if (rTop21 == NoReg) { + rTop21 = allocateRegNotConflictingWith(topRegistersMask15); } if (rNext16 == NoReg) { - rNext16 = allocateRegNotConflictingWith(1ULL << rTop23); + rNext16 = allocateRegNotConflictingWith(1ULL << rTop21); } - assert(!(((rTop23 == NoReg) + assert(!(((rTop21 == NoReg) || (rNext16 == NoReg)))); - rResult25 = allocateFloatRegNotConflictingWith((1ULL << rTop23) | (1ULL << rNext16)); - assert(!((rResult25 == NoReg))); - shiftAmount1 = rTop23; + rResult24 = allocateFloatRegNotConflictingWith((1ULL << rTop21) | (1ULL << rNext16)); + assert(!((rResult24 == NoReg))); + shiftAmount1 = rTop21; value23 = rNext16; - result4 = rResult25; + result4 = rResult24; nativePopToReg(ssNativeTop(), shiftAmount1); ssNativePop(1); nativePopToReg(ssNativeTop(), value23); @@ -34027,67 +34248,67 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 101: /* begin genLowcodeLoadFloat32FromMemory */ - rTop24 = NoReg; + rTop22 = NoReg; frResult8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop24 = nativeRegisterOrNone(ssNativeTop()); + rTop22 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop24 == NoReg) { - rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop22 == NoReg) { + rTop22 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult8 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop24 == NoReg) + assert(!(((rTop22 == NoReg) || (frResult8 == NoReg)))); - pointer3 = rTop24; + pointer2 = rTop22; value26 = frResult8; - nativePopToReg(ssNativeTop(), pointer3); + nativePopToReg(ssNativeTop(), pointer2); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction33 = genoperandoperandoperand(MoveM32rRs, 0, pointer3, value26); + anInstruction33 = genoperandoperandoperand(MoveM32rRs, 0, pointer2, value26); ssPushNativeRegisterSingleFloat(value26); return 0; case 102: /* begin genLowcodeLoadFloat64FromMemory */ - rTop25 = NoReg; + rTop23 = NoReg; frResult9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop25 = nativeRegisterOrNone(ssNativeTop()); + rTop23 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop25 == NoReg) { - rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop23 == NoReg) { + rTop23 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult9 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop25 == NoReg) + assert(!(((rTop23 == NoReg) || (frResult9 == NoReg)))); - pointer4 = rTop25; + pointer3 = rTop23; value27 = frResult9; - nativePopToReg(ssNativeTop(), pointer4); + nativePopToReg(ssNativeTop(), pointer3); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction34 = genoperandoperandoperand(MoveM64rRd, 0, pointer4, value27); + anInstruction34 = genoperandoperandoperand(MoveM64rRd, 0, pointer3, value27); ssPushNativeRegisterDoubleFloat(value27); return 0; case 103: /* begin genLowcodeLoadInt16FromMemory */ - rTop26 = NoReg; - rResult30 = NoReg; + rTop24 = NoReg; + rResult29 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop26 = nativeRegisterOrNone(ssNativeTop()); + rTop24 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop26 == NoReg) { - rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop24 == NoReg) { + rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult30 = allocateRegNotConflictingWith(1ULL << rTop26); - assert(!(((rTop26 == NoReg) - || (rResult30 == NoReg)))); - pointer5 = rTop26; - value28 = rResult30; - nativePopToReg(ssNativeTop(), pointer5); + rResult29 = allocateRegNotConflictingWith(1ULL << rTop24); + assert(!(((rTop24 == NoReg) + || (rResult29 == NoReg)))); + pointer4 = rTop24; + value28 = rResult29; + nativePopToReg(ssNativeTop(), pointer4); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction35 = genoperandoperandoperand(MoveM16rR, 0, pointer5, value28); + anInstruction35 = genoperandoperandoperand(MoveM16rR, 0, pointer4, value28); /* begin SignExtend16R:R: */ genoperandoperand(SignExtend16RR, value28, value28); ssPushNativeRegister(value28); @@ -34095,23 +34316,23 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 104: /* begin genLowcodeLoadInt32FromMemory */ - rTop27 = NoReg; - rResult31 = NoReg; + rTop25 = NoReg; + rResult30 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop27 = nativeRegisterOrNone(ssNativeTop()); + rTop25 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop27 == NoReg) { - rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop25 == NoReg) { + rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult31 = allocateRegNotConflictingWith(1ULL << rTop27); - assert(!(((rTop27 == NoReg) - || (rResult31 == NoReg)))); - pointer6 = rTop27; - value29 = rResult31; - nativePopToReg(ssNativeTop(), pointer6); + rResult30 = allocateRegNotConflictingWith(1ULL << rTop25); + assert(!(((rTop25 == NoReg) + || (rResult30 == NoReg)))); + pointer5 = rTop25; + value29 = rResult30; + nativePopToReg(ssNativeTop(), pointer5); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction36 = genoperandoperandoperand(MoveM32rR, 0, pointer6, value29); + anInstruction36 = genoperandoperandoperand(MoveM32rR, 0, pointer5, value29); ssPushNativeRegister(value29); return 0; @@ -34129,35 +34350,35 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) rResult112 = allocateRegNotConflictingWith(1ULL << rTop111); assert(!(((rTop111 == NoReg) || (rResult112 == NoReg)))); - pointer7 = rTop111; + pointer6 = rTop111; value30 = rResult112; - nativePopToReg(ssNativeTop(), pointer7); + nativePopToReg(ssNativeTop(), pointer6); ssNativePop(1); assert(BytesPerWord == 8); /* begin gen:quickConstant:operand:operand: */ - anInstruction210 = genoperandoperandoperand(MoveMwrR, 0, pointer7, value30); + anInstruction210 = genoperandoperandoperand(MoveMwrR, 0, pointer6, value30); ssPushNativeRegister(value30); return 0; case 106: /* begin genLowcodeLoadInt8FromMemory */ - rTop29 = NoReg; - rResult33 = NoReg; + rTop27 = NoReg; + rResult32 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop29 = nativeRegisterOrNone(ssNativeTop()); + rTop27 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop29 == NoReg) { - rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop27 == NoReg) { + rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult33 = allocateRegNotConflictingWith(1ULL << rTop29); - assert(!(((rTop29 == NoReg) - || (rResult33 == NoReg)))); - pointer8 = rTop29; - value31 = rResult33; - nativePopToReg(ssNativeTop(), pointer8); + rResult32 = allocateRegNotConflictingWith(1ULL << rTop27); + assert(!(((rTop27 == NoReg) + || (rResult32 == NoReg)))); + pointer7 = rTop27; + value31 = rResult32; + nativePopToReg(ssNativeTop(), pointer7); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction38 = genoperandoperandoperand(MoveM8rR, 0, pointer8, value31); + anInstruction38 = genoperandoperandoperand(MoveM8rR, 0, pointer7, value31); /* begin SignExtend8R:R: */ genoperandoperand(SignExtend8RR, value31, value31); ssPushNativeRegister(value31); @@ -34349,31 +34570,31 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 119: /* begin genLowcodeLoadObjectAt */ - rTop30 = (rOopTop3 = NoReg); - topRegisterMask1 = 0; + rTop28 = (rOopTop = NoReg); + topRegisterMask = 0; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop30 = nativeRegisterOrNone(ssNativeTop()); + rTop28 = nativeRegisterOrNone(ssNativeTop()); } if ((registerOrNone(ssTop())) != NoReg) { - rOopTop3 = registerOrNone(ssTop()); + rOopTop = registerOrNone(ssTop()); /* begin registerMaskFor: */ - topRegisterMask1 = 1ULL << rOopTop3; + topRegisterMask = 1ULL << rOopTop; } - if (rTop30 == NoReg) { - rTop30 = allocateRegNotConflictingWith(topRegisterMask1); + if (rTop28 == NoReg) { + rTop28 = allocateRegNotConflictingWith(topRegisterMask); } - if (rOopTop3 == NoReg) { - rOopTop3 = allocateRegNotConflictingWith(1ULL << rTop30); + if (rOopTop == NoReg) { + rOopTop = allocateRegNotConflictingWith(1ULL << rTop28); } - assert(!(((rTop30 == NoReg) - || (rOopTop3 == NoReg)))); - fieldIndex = rTop30; - object2 = rOopTop3; + assert(!(((rTop28 == NoReg) + || (rOopTop == NoReg)))); + fieldIndex = rTop28; + object = rOopTop; nativePopToReg(ssNativeTop(), fieldIndex); ssNativePop(1); - popToReg(ssTop(), object2); + popToReg(ssTop(), object); ssPop(1); - genLcLoadObjectat(object2, fieldIndex); + genLcLoadObjectat(object, fieldIndex); return 0; default: @@ -34395,24 +34616,24 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) AbstractInstruction *abstractInstruction11; AbstractInstruction *abstractInstruction12; AbstractInstruction *abstractInstruction2; - AbstractInstruction *abstractInstruction4; + AbstractInstruction *abstractInstruction3; sqInt address; sqInt address1; sqInt alignedSize; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; - AbstractInstruction *anInstruction10; AbstractInstruction *anInstruction110; AbstractInstruction *anInstruction12; - AbstractInstruction *anInstruction13; + AbstractInstruction *anInstruction14; + AbstractInstruction *anInstruction15; AbstractInstruction *anInstruction16; AbstractInstruction *anInstruction17; AbstractInstruction *anInstruction18; AbstractInstruction *anInstruction19; AbstractInstruction *anInstruction2; - AbstractInstruction *anInstruction20; AbstractInstruction *anInstruction21; AbstractInstruction *anInstruction22; + AbstractInstruction *anInstruction23; AbstractInstruction *anInstruction31; AbstractInstruction *anInstruction4; AbstractInstruction *anInstruction41; @@ -34443,11 +34664,17 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt frTop; sqInt frTop1; sqInt i1; + sqInt i11; + sqInt i2; + sqInt i3; + sqInt i5; + sqInt i6; + sqInt i7; sqInt index1; - sqInt nativeValueIndex; - sqInt nativeValueIndex1; - sqInt nextRegisterMask; - sqInt nextRegisterMask1; + sqInt nativeValueIndex2; + sqInt nativeValueIndex3; + sqInt nextRegisterMask2; + sqInt nextRegisterMask3; sqInt object; sqInt offset; sqInt offset1; @@ -34466,17 +34693,17 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt pointer7; sqInt pointer8; sqInt pointerResult; - sqInt pointerValue9; + sqInt pointerValue7; sqInt quickConstant; + sqInt reg; sqInt reg1; sqInt reg10; sqInt reg12; sqInt reg14; - sqInt reg15; sqInt reg16; sqInt reg2; - sqInt reg3; - sqInt reg4; + sqInt reg5; + sqInt reg6; sqInt reg7; sqInt reg8; sqInt reg9; @@ -34488,19 +34715,19 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt result; sqInt result1; sqInt result2; + sqInt rNext; sqInt rNext1; - sqInt rNext10; sqInt rNext11; + sqInt rNext12; sqInt rNext13; sqInt rNext14; sqInt rNext15; - sqInt rNext2; - sqInt rNext3; sqInt rNext4; - sqInt rNext5; + sqInt rNext6; sqInt rNext8; - sqInt rNextNext; - sqInt rNextNext1; + sqInt rNext9; + sqInt rNextNext2; + sqInt rNextNext3; sqInt rOopTop; sqInt rResult; sqInt rResult1; @@ -34510,35 +34737,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt rResult2; sqInt rResult4; sqInt rResult5; - sqInt rResult7; + sqInt rResult6; sqInt rResult8; sqInt rTop; sqInt rTop1; - sqInt rTop10; sqInt rTop11; sqInt rTop110; sqInt rTop111; - sqInt rTop112; sqInt rTop12; sqInt rTop13; sqInt rTop14; - sqInt rTop16; + sqInt rTop15; sqInt rTop17; + sqInt rTop18; sqInt rTop19; sqInt rTop2; - sqInt rTop20; + sqInt rTop21; sqInt rTop22; sqInt rTop23; sqInt rTop25; sqInt rTop26; sqInt rTop27; - sqInt rTop29; + sqInt rTop28; sqInt rTop30; sqInt rTop31; + sqInt rTop32; sqInt rTop4; sqInt rTop5; + sqInt rTop6; sqInt rTop7; - sqInt rTop8; sqInt rTop9; sqInt second; sqInt second1; @@ -34556,13 +34783,13 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt source; sqInt source1; sqInt source2; + sqInt topRegistersMask; sqInt topRegistersMask1; sqInt topRegistersMask10; sqInt topRegistersMask11; - sqInt topRegistersMask12; sqInt topRegistersMask13; - sqInt topRegistersMask2; - sqInt topRegistersMask3; + sqInt topRegistersMask4; + sqInt topRegistersMask5; sqInt topRegistersMask6; sqInt topRegistersMask7; sqInt topRegistersMask8; @@ -34773,7 +35000,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 0x7F: /* begin genLowcodeLockRegisters */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); return 0; @@ -34784,123 +35019,139 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 129: /* begin genLowcodeMalloc32 */ - rTop5 = NoReg; - rResult5 = NoReg; + rTop28 = NoReg; + rResult8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop28 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop28 == NoReg) { + rTop28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult5 = allocateRegNotConflictingWith(1ULL << rTop5); - assert(!(((rTop5 == NoReg) - || (rResult5 == NoReg)))); - size1 = rTop5; - pointer5 = rResult5; + rResult8 = allocateRegNotConflictingWith(1ULL << rTop28); + assert(!(((rTop28 == NoReg) + || (rResult8 == NoReg)))); + size1 = rTop28; + pointer7 = rResult8; nativePopToReg(ssNativeTop(), size1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 <= simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); if (size1 != ReceiverResultReg) { /* begin MoveR:R: */ genoperandoperand(MoveRR, size1, ReceiverResultReg); } /* begin CallRT: */ - abstractInstruction2 = genoperand(Call, ceMallocTrampoline); - (abstractInstruction2->annotation = IsRelativeCall); + abstractInstruction3 = genoperand(Call, ceMallocTrampoline); + (abstractInstruction3->annotation = IsRelativeCall); /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, pointer5); - ssPushNativeRegister(pointer5); + genoperandoperand(MoveRR, TempReg, pointer7); + ssPushNativeRegister(pointer7); return 0; case 130: /* begin genLowcodeMalloc64 */ /* begin allocateRegistersForLowcodeIntegerResultInteger: */ - rTop12 = NoReg; - rResult12 = NoReg; + rTop111 = NoReg; + rResult13 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop12 = nativeRegisterOrNone(ssNativeTop()); + rTop111 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop12 == NoReg) { - rTop12 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop111 == NoReg) { + rTop111 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult12 = allocateRegNotConflictingWith(1ULL << rTop12); - assert(!(((rTop12 == NoReg) - || (rResult12 == NoReg)))); - size2 = rTop12; - pointer6 = rResult12; + rResult13 = allocateRegNotConflictingWith(1ULL << rTop111); + assert(!(((rTop111 == NoReg) + || (rResult13 == NoReg)))); + size2 = rTop111; + pointer8 = rResult13; nativePopToReg(ssNativeTop(), size2); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i11 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i11 <= simStackPtr; i11 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i11), frameOffsetOfTemporary(i11 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); if (size2 != ReceiverResultReg) { /* begin MoveR:R: */ genoperandoperand(MoveRR, size2, ReceiverResultReg); } /* begin CallRT: */ - abstractInstruction11 = genoperand(Call, ceMallocTrampoline); - (abstractInstruction11->annotation = IsRelativeCall); + abstractInstruction12 = genoperand(Call, ceMallocTrampoline); + (abstractInstruction12->annotation = IsRelativeCall); /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, pointer6); - ssPushNativeRegister(pointer6); + genoperandoperand(MoveRR, TempReg, pointer8); + ssPushNativeRegister(pointer8); return 0; case 131: /* begin genLowcodeMemcpy32 */ - rTop7 = (rNext1 = (rNextNext = NoReg)); - nativeValueIndex = 1; + rTop30 = (rNext13 = (rNextNext2 = NoReg)); + nativeValueIndex2 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop30 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext13 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext1 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNextNext = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex)); + if (rNext13 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNext13 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNextNext2 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2)); } - nativeValueIndex += 1; + nativeValueIndex2 += 1; } } - if (rNextNext == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + if (rNextNext2 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNextNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); } } - if (rTop7 == NoReg) { - nextRegisterMask = 0; - if (rNext1 != NoReg) { + if (rTop30 == NoReg) { + nextRegisterMask2 = 0; + if (rNext13 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1ULL << rNext1; + nextRegisterMask2 = 1ULL << rNext13; } - if (rNextNext != NoReg) { - nextRegisterMask = nextRegisterMask | (1ULL << rNextNext); + if (rNextNext2 != NoReg) { + nextRegisterMask2 = nextRegisterMask2 | (1ULL << rNextNext2); } - rTop7 = allocateRegNotConflictingWith(nextRegisterMask); + rTop30 = allocateRegNotConflictingWith(nextRegisterMask2); } - if (rNext1 == NoReg) { + if (rNext13 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1ULL << rTop7; - if (rNextNext != NoReg) { - nextRegisterMask = nextRegisterMask | (1ULL << rNextNext); + nextRegisterMask2 = 1ULL << rTop30; + if (rNextNext2 != NoReg) { + nextRegisterMask2 = nextRegisterMask2 | (1ULL << rNextNext2); } - rNext1 = allocateRegNotConflictingWith(nextRegisterMask); + rNext13 = allocateRegNotConflictingWith(nextRegisterMask2); } - if (rNextNext == NoReg) { + if (rNextNext2 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask = (1ULL << rTop7) | (1ULL << rNext1); - rNextNext = allocateRegNotConflictingWith(nextRegisterMask); + nextRegisterMask2 = (1ULL << rTop30) | (1ULL << rNext13); + rNextNext2 = allocateRegNotConflictingWith(nextRegisterMask2); } - assert(!(((rTop7 == NoReg) - || ((rNext1 == NoReg) - || (rNextNext == NoReg))))); - size3 = rTop7; - source = rNext1; - dest = rNextNext; + assert(!(((rTop30 == NoReg) + || ((rNext13 == NoReg) + || (rNextNext2 == NoReg))))); + size3 = rTop30; + source = rNext13; + dest = rNextNext2; nativePopToReg(ssNativeTop(), size3); ssNativePop(1); nativePopToReg(ssNativeTop(), source); @@ -34908,65 +35159,73 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) nativePopToReg(ssNativeTop(), dest); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i5 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i5 <= simStackPtr; i5 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i5), frameOffsetOfTemporary(i5 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytosize(backEnd, source, dest, size3); return 0; case 132: /* begin genLowcodeMemcpy64 */ - rTop8 = (rNext2 = (rNextNext1 = NoReg)); - nativeValueIndex1 = 1; + rTop31 = (rNext14 = (rNextNext3 = NoReg)); + nativeValueIndex3 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop8 = nativeRegisterOrNone(ssNativeTop()); + rTop31 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext2 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNextNext1 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1)); + if (rNext14 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNext14 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNextNext3 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3)); } - nativeValueIndex1 += 1; + nativeValueIndex3 += 1; } } - if (rNextNext1 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNextNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); + if (rNextNext3 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNextNext3 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); } } - if (rTop8 == NoReg) { - nextRegisterMask1 = 0; - if (rNext2 != NoReg) { + if (rTop31 == NoReg) { + nextRegisterMask3 = 0; + if (rNext14 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1ULL << rNext2; + nextRegisterMask3 = 1ULL << rNext14; } - if (rNextNext1 != NoReg) { - nextRegisterMask1 = nextRegisterMask1 | (1ULL << rNextNext1); + if (rNextNext3 != NoReg) { + nextRegisterMask3 = nextRegisterMask3 | (1ULL << rNextNext3); } - rTop8 = allocateRegNotConflictingWith(nextRegisterMask1); + rTop31 = allocateRegNotConflictingWith(nextRegisterMask3); } - if (rNext2 == NoReg) { + if (rNext14 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1ULL << rTop8; - if (rNextNext1 != NoReg) { - nextRegisterMask1 = nextRegisterMask1 | (1ULL << rNextNext1); + nextRegisterMask3 = 1ULL << rTop31; + if (rNextNext3 != NoReg) { + nextRegisterMask3 = nextRegisterMask3 | (1ULL << rNextNext3); } - rNext2 = allocateRegNotConflictingWith(nextRegisterMask1); + rNext14 = allocateRegNotConflictingWith(nextRegisterMask3); } - if (rNextNext1 == NoReg) { + if (rNextNext3 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask1 = (1ULL << rTop8) | (1ULL << rNext2); - rNextNext1 = allocateRegNotConflictingWith(nextRegisterMask1); + nextRegisterMask3 = (1ULL << rTop31) | (1ULL << rNext14); + rNextNext3 = allocateRegNotConflictingWith(nextRegisterMask3); } - assert(!(((rTop8 == NoReg) - || ((rNext2 == NoReg) - || (rNextNext1 == NoReg))))); - size4 = rTop8; - source1 = rNext2; - dest1 = rNextNext1; + assert(!(((rTop31 == NoReg) + || ((rNext14 == NoReg) + || (rNextNext3 == NoReg))))); + size4 = rTop31; + source1 = rNext14; + dest1 = rNextNext3; nativePopToReg(ssNativeTop(), size4); ssNativePop(1); nativePopToReg(ssNativeTop(), source1); @@ -34974,7 +35233,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) nativePopToReg(ssNativeTop(), dest1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i6 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i6 <= simStackPtr; i6 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i6), frameOffsetOfTemporary(i6 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytosize(backEnd, source1, dest1, sizeLow1); return 0; @@ -34983,44 +35250,52 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodeMemcpyFixed */ size5 = extA; /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask1 = 0; - rTop9 = (rNext3 = NoReg); + topRegistersMask13 = 0; + rTop32 = (rNext15 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop9 = nativeRegisterOrNone(ssNativeTop()); + rTop32 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext3 == NoReg) { + if (rNext15 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg2 = (rNext3 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask1 = 1ULL << reg2; + reg16 = (rNext15 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask13 = 1ULL << reg16; } } - if (rTop9 == NoReg) { - rTop9 = allocateRegNotConflictingWith(topRegistersMask1); + if (rTop32 == NoReg) { + rTop32 = allocateRegNotConflictingWith(topRegistersMask13); } - if (rNext3 == NoReg) { - rNext3 = allocateRegNotConflictingWith(1ULL << rTop9); + if (rNext15 == NoReg) { + rNext15 = allocateRegNotConflictingWith(1ULL << rTop32); } - assert(!(((rTop9 == NoReg) - || (rNext3 == NoReg)))); - source2 = rTop9; - dest2 = rNext3; + assert(!(((rTop32 == NoReg) + || (rNext15 == NoReg)))); + source2 = rTop32; + dest2 = rNext15; nativePopToReg(ssNativeTop(), source2); ssNativePop(1); nativePopToReg(ssNativeTop(), dest2); ssNativePop(1); if (size5 == BytesPerWord) { /* begin checkQuickConstant:forInstruction: */ - anInstruction10 = genoperandoperandoperand(MoveMwrR, 0, source2, TempReg); + anInstruction23 = genoperandoperandoperand(MoveMwrR, 0, source2, TempReg); /* begin checkQuickConstant:forInstruction: */ - anInstruction13 = genoperandoperandoperand(MoveRMwr, TempReg, 0, dest2); + anInstruction110 = genoperandoperandoperand(MoveRMwr, TempReg, 0, dest2); } else { /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i7 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i7 <= simStackPtr; i7 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i7), frameOffsetOfTemporary(i7 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytoconstantSize(backEnd, source2, dest2, size5); } @@ -35069,31 +35344,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 139: /* begin genLowcodeMul32 */ - topRegistersMask2 = 0; - rTop10 = (rNext4 = NoReg); + topRegistersMask = 0; + rTop5 = (rNext = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop10 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext4 == NoReg) { + if (rNext == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg3 = (rNext4 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask2 = 1ULL << reg3; + reg = (rNext = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask = 1ULL << reg; } } - if (rTop10 == NoReg) { - rTop10 = allocateRegNotConflictingWith(topRegistersMask2); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(topRegistersMask); } - if (rNext4 == NoReg) { - rNext4 = allocateRegNotConflictingWith(1ULL << rTop10); + if (rNext == NoReg) { + rNext = allocateRegNotConflictingWith(1ULL << rTop5); } - assert(!(((rTop10 == NoReg) - || (rNext4 == NoReg)))); - second = rTop10; - first = rNext4; + assert(!(((rTop5 == NoReg) + || (rNext == NoReg)))); + second = rTop5; + first = rNext; nativePopToReg(ssNativeTop(), second); ssNativePop(1); nativePopToReg(ssNativeTop(), first); @@ -35105,35 +35380,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 140: /* begin genLowcodeMul64 */ - topRegistersMask3 = 0; - rTop13 = (rNext5 = NoReg); - rResult7 = NoReg; + topRegistersMask1 = 0; + rTop6 = (rNext1 = NoReg); + rResult5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop13 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext5 == NoReg) { + if (rNext1 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg4 = (rNext5 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask3 = 1ULL << reg4; + reg2 = (rNext1 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask1 = 1ULL << reg2; } } - if (rTop13 == NoReg) { - rTop13 = allocateRegNotConflictingWith(topRegistersMask3); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(topRegistersMask1); } - if (rNext5 == NoReg) { - rNext5 = allocateRegNotConflictingWith(1ULL << rTop13); + if (rNext1 == NoReg) { + rNext1 = allocateRegNotConflictingWith(1ULL << rTop6); } - assert(!(((rTop13 == NoReg) - || (rNext5 == NoReg)))); - rResult7 = allocateFloatRegNotConflictingWith((1ULL << rTop13) | (1ULL << rNext5)); - assert(!((rResult7 == NoReg))); - second1 = rTop13; - first1 = rNext5; - result = rResult7; + assert(!(((rTop6 == NoReg) + || (rNext1 == NoReg)))); + rResult5 = allocateFloatRegNotConflictingWith((1ULL << rTop6) | (1ULL << rNext1)); + assert(!((rResult5 == NoReg))); + second1 = rTop6; + first1 = rNext1; + result = rResult5; nativePopToReg(ssNativeTop(), second1); ssNativePop(1); nativePopToReg(ssNativeTop(), first1); @@ -35143,15 +35418,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 141: /* begin genLowcodeNeg32 */ - rTop14 = NoReg; + rTop7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop14 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop14 == NoReg) { - rTop14 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop14 == NoReg))); - value4 = rTop14; + assert(!((rTop7 == NoReg))); + value4 = rTop7; nativePopToReg(ssNativeTop(), value4); ssNativePop(1); /* begin NegateR: */ @@ -35162,15 +35437,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 142: /* begin genLowcodeNeg64 */ /* begin allocateRegistersForLowcodeInteger: */ - rTop16 = NoReg; + rTop12 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop16 = nativeRegisterOrNone(ssNativeTop()); + rTop12 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop16 == NoReg) { - rTop16 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop12 == NoReg) { + rTop12 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop16 == NoReg))); - value5 = rTop16; + assert(!((rTop12 == NoReg))); + value5 = rTop12; nativePopToReg(ssNativeTop(), value5); ssNativePop(1); /* begin NegateR: */ @@ -35180,15 +35455,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 143: /* begin genLowcodeNot32 */ - rTop17 = NoReg; + rTop9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop17 = nativeRegisterOrNone(ssNativeTop()); + rTop9 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop17 == NoReg) { - rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop9 == NoReg) { + rTop9 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop17 == NoReg))); - value6 = rTop17; + assert(!((rTop9 == NoReg))); + value6 = rTop9; nativePopToReg(ssNativeTop(), value6); ssNativePop(1); /* begin NotR: */ @@ -35199,15 +35474,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 144: /* begin genLowcodeNot64 */ /* begin allocateRegistersForLowcodeInteger: */ - rTop19 = NoReg; + rTop13 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop19 = nativeRegisterOrNone(ssNativeTop()); + rTop13 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop19 == NoReg) { - rTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop13 == NoReg) { + rTop13 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop19 == NoReg))); - value7 = rTop19; + assert(!((rTop13 == NoReg))); + value7 = rTop13; nativePopToReg(ssNativeTop(), value7); ssNativePop(1); /* begin NotR: */ @@ -35217,35 +35492,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 145: /* begin genLowcodeOr32 */ - topRegistersMask6 = 0; - rTop20 = (rNext8 = NoReg); - rResult8 = NoReg; + topRegistersMask4 = 0; + rTop14 = (rNext4 = NoReg); + rResult6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop20 = nativeRegisterOrNone(ssNativeTop()); + rTop14 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext8 == NoReg) { + if (rNext4 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg7 = (rNext8 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask6 = 1ULL << reg7; + reg5 = (rNext4 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask4 = 1ULL << reg5; } } - if (rTop20 == NoReg) { - rTop20 = allocateRegNotConflictingWith(topRegistersMask6); + if (rTop14 == NoReg) { + rTop14 = allocateRegNotConflictingWith(topRegistersMask4); } - if (rNext8 == NoReg) { - rNext8 = allocateRegNotConflictingWith(1ULL << rTop20); + if (rNext4 == NoReg) { + rNext4 = allocateRegNotConflictingWith(1ULL << rTop14); } - assert(!(((rTop20 == NoReg) - || (rNext8 == NoReg)))); - rResult8 = allocateFloatRegNotConflictingWith((1ULL << rTop20) | (1ULL << rNext8)); - assert(!((rResult8 == NoReg))); - second2 = rTop20; - first2 = rNext8; - result1 = rResult8; + assert(!(((rTop14 == NoReg) + || (rNext4 == NoReg)))); + rResult6 = allocateFloatRegNotConflictingWith((1ULL << rTop14) | (1ULL << rNext4)); + assert(!((rResult6 == NoReg))); + second2 = rTop14; + first2 = rNext4; + result1 = rResult6; nativePopToReg(ssNativeTop(), second2); ssNativePop(1); nativePopToReg(ssNativeTop(), first2); @@ -35258,10 +35533,10 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 146: /* begin genLowcodeOr64 */ /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask7 = 0; - rTop110 = (rNext11 = NoReg); + topRegistersMask5 = 0; + rTop15 = (rNext11 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop110 = nativeRegisterOrNone(ssNativeTop()); + rTop15 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext11 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -35269,19 +35544,19 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) if (rNext11 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg8 = (rNext11 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask7 = 1ULL << reg8; + reg6 = (rNext11 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask5 = 1ULL << reg6; } } - if (rTop110 == NoReg) { - rTop110 = allocateRegNotConflictingWith(topRegistersMask7); + if (rTop15 == NoReg) { + rTop15 = allocateRegNotConflictingWith(topRegistersMask5); } if (rNext11 == NoReg) { - rNext11 = allocateRegNotConflictingWith(1ULL << rTop110); + rNext11 = allocateRegNotConflictingWith(1ULL << rTop15); } - assert(!(((rTop110 == NoReg) + assert(!(((rTop15 == NoReg) || (rNext11 == NoReg)))); - second3 = rTop110; + second3 = rTop15; first3 = rNext11; nativePopToReg(ssNativeTop(), second3); ssNativePop(1); @@ -35296,7 +35571,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodePerformCallout */ callSwitchToCStack(); /* begin checkLiteral:forInstruction: */ - anInstruction16 = genoperandoperand(MoveCwR, extA, TempReg); + anInstruction14 = genoperandoperand(MoveCwR, extA, TempReg); /* begin CallRT: */ abstractInstruction = genoperand(Call, ceFFICalloutTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -35312,11 +35587,11 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) ssNativePop(1); callSwitchToCStack(); /* begin CallRT: */ - abstractInstruction4 = genoperand(Call, ceFFICalloutTrampoline); - (abstractInstruction4->annotation = IsRelativeCall); + abstractInstruction2 = genoperand(Call, ceFFICalloutTrampoline); + (abstractInstruction2->annotation = IsRelativeCall); /* begin annotateBytecode: */ - abstractInstruction12 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); - (abstractInstruction12->annotation = HasBytecodePC); + abstractInstruction11 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); + (abstractInstruction11->annotation = HasBytecodePC); return 0; case 149: @@ -35362,19 +35637,19 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodePointerAddConstantOffset */ offset4 = extB; /* begin allocateRegistersForLowcodeInteger: */ - rTop22 = NoReg; + rTop17 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop22 = nativeRegisterOrNone(ssNativeTop()); + rTop17 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop22 == NoReg) { - rTop22 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop17 == NoReg) { + rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop22 == NoReg))); - base = rTop22; + assert(!((rTop17 == NoReg))); + base = rTop17; nativePopToReg(ssNativeTop(), base); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction17 = genoperandoperand(AddCqR, offset4, base); + anInstruction15 = genoperandoperand(AddCqR, offset4, base); ssPushNativeRegister(base); extB = 0; numExtB = 0; @@ -35382,31 +35657,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 163: /* begin genLowcodePointerAddOffset32 */ - topRegistersMask8 = 0; - rTop23 = (rNext10 = NoReg); + topRegistersMask6 = 0; + rTop18 = (rNext6 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop23 = nativeRegisterOrNone(ssNativeTop()); + rTop18 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext6 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext10 == NoReg) { + if (rNext6 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg9 = (rNext10 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask8 = 1ULL << reg9; + reg7 = (rNext6 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask6 = 1ULL << reg7; } } - if (rTop23 == NoReg) { - rTop23 = allocateRegNotConflictingWith(topRegistersMask8); + if (rTop18 == NoReg) { + rTop18 = allocateRegNotConflictingWith(topRegistersMask6); } - if (rNext10 == NoReg) { - rNext10 = allocateRegNotConflictingWith(1ULL << rTop23); + if (rNext6 == NoReg) { + rNext6 = allocateRegNotConflictingWith(1ULL << rTop18); } - assert(!(((rTop23 == NoReg) - || (rNext10 == NoReg)))); - offset5 = rTop23; - base1 = rNext10; + assert(!(((rTop18 == NoReg) + || (rNext6 == NoReg)))); + offset5 = rTop18; + base1 = rNext6; nativePopToReg(ssNativeTop(), offset5); ssNativePop(1); nativePopToReg(ssNativeTop(), base1); @@ -35419,31 +35694,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 164: /* begin genLowcodePointerAddOffset64 */ /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask9 = 0; - rTop111 = (rNext13 = NoReg); + topRegistersMask7 = 0; + rTop19 = (rNext12 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop111 = nativeRegisterOrNone(ssNativeTop()); + rTop19 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext13 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext12 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext13 == NoReg) { + if (rNext12 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg10 = (rNext13 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask9 = 1ULL << reg10; + reg8 = (rNext12 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask7 = 1ULL << reg8; } } - if (rTop111 == NoReg) { - rTop111 = allocateRegNotConflictingWith(topRegistersMask9); + if (rTop19 == NoReg) { + rTop19 = allocateRegNotConflictingWith(topRegistersMask7); } - if (rNext13 == NoReg) { - rNext13 = allocateRegNotConflictingWith(1ULL << rTop111); + if (rNext12 == NoReg) { + rNext12 = allocateRegNotConflictingWith(1ULL << rTop19); } - assert(!(((rTop111 == NoReg) - || (rNext13 == NoReg)))); - offset6 = rTop111; - base2 = rNext13; + assert(!(((rTop19 == NoReg) + || (rNext12 == NoReg)))); + offset6 = rTop19; + base2 = rNext12; nativePopToReg(ssNativeTop(), offset6); ssNativePop(1); nativePopToReg(ssNativeTop(), base2); @@ -35455,31 +35730,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 165: /* begin genLowcodePointerEqual */ - topRegistersMask10 = 0; - rTop25 = (rNext14 = NoReg); + topRegistersMask8 = 0; + rTop21 = (rNext8 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop25 = nativeRegisterOrNone(ssNativeTop()); + rTop21 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext14 == NoReg) { + if (rNext8 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg15 = (rNext14 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask10 = 1ULL << reg15; + reg9 = (rNext8 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask8 = 1ULL << reg9; } } - if (rTop25 == NoReg) { - rTop25 = allocateRegNotConflictingWith(topRegistersMask10); + if (rTop21 == NoReg) { + rTop21 = allocateRegNotConflictingWith(topRegistersMask8); } - if (rNext14 == NoReg) { - rNext14 = allocateRegNotConflictingWith(1ULL << rTop25); + if (rNext8 == NoReg) { + rNext8 = allocateRegNotConflictingWith(1ULL << rTop21); } - assert(!(((rTop25 == NoReg) - || (rNext14 == NoReg)))); - second4 = rTop25; - first4 = rNext14; + assert(!(((rTop21 == NoReg) + || (rNext8 == NoReg)))); + second4 = rTop21; + first4 = rNext8; nativePopToReg(ssNativeTop(), second4); ssNativePop(1); nativePopToReg(ssNativeTop(), first4); @@ -35489,43 +35764,43 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin JumpNonZero: */ falseJump = genConditionalBranchoperand(JumpNonZero, ((sqInt)0)); /* begin checkQuickConstant:forInstruction: */ - anInstruction19 = genoperandoperand(MoveCqR, 1, first4); + anInstruction17 = genoperandoperand(MoveCqR, 1, first4); /* begin Jump: */ contJump = genoperand(Jump, ((sqInt)0)); jmpTarget(falseJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); /* begin checkQuickConstant:forInstruction: */ - anInstruction18 = genoperandoperand(MoveCqR, 0, first4); + anInstruction16 = genoperandoperand(MoveCqR, 0, first4); jmpTarget(contJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); ssPushNativeRegister(first4); return 0; case 166: /* begin genLowcodePointerNotEqual */ - topRegistersMask11 = 0; - rTop26 = (rNext15 = NoReg); + topRegistersMask9 = 0; + rTop22 = (rNext9 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop26 = nativeRegisterOrNone(ssNativeTop()); + rTop22 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext15 == NoReg) { + if (rNext9 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg16 = (rNext15 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask11 = 1ULL << reg16; + reg10 = (rNext9 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask9 = 1ULL << reg10; } } - if (rTop26 == NoReg) { - rTop26 = allocateRegNotConflictingWith(topRegistersMask11); + if (rTop22 == NoReg) { + rTop22 = allocateRegNotConflictingWith(topRegistersMask9); } - if (rNext15 == NoReg) { - rNext15 = allocateRegNotConflictingWith(1ULL << rTop26); + if (rNext9 == NoReg) { + rNext9 = allocateRegNotConflictingWith(1ULL << rTop22); } - assert(!(((rTop26 == NoReg) - || (rNext15 == NoReg)))); - second5 = rTop26; - first5 = rNext15; + assert(!(((rTop22 == NoReg) + || (rNext9 == NoReg)))); + second5 = rTop22; + first5 = rNext9; nativePopToReg(ssNativeTop(), second5); ssNativePop(1); nativePopToReg(ssNativeTop(), first5); @@ -35535,62 +35810,62 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin JumpZero: */ falseJump1 = genConditionalBranchoperand(JumpZero, ((sqInt)0)); /* begin checkQuickConstant:forInstruction: */ - anInstruction20 = genoperandoperand(MoveCqR, 1, first5); + anInstruction19 = genoperandoperand(MoveCqR, 1, first5); /* begin Jump: */ contJump1 = genoperand(Jump, ((sqInt)0)); jmpTarget(falseJump1, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); /* begin checkQuickConstant:forInstruction: */ - anInstruction110 = genoperandoperand(MoveCqR, 0, first5); + anInstruction18 = genoperandoperand(MoveCqR, 0, first5); jmpTarget(contJump1, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); ssPushNativeRegister(first5); return 0; case 167: /* begin genLowcodePointerToInt32 */ - rTop27 = NoReg; + rTop23 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop27 = nativeRegisterOrNone(ssNativeTop()); + rTop23 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop27 == NoReg) { - rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop23 == NoReg) { + rTop23 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop27 == NoReg))); - pointer7 = rTop27; - nativePopToReg(ssNativeTop(), pointer7); + assert(!((rTop23 == NoReg))); + pointer5 = rTop23; + nativePopToReg(ssNativeTop(), pointer5); ssNativePop(1); - ssPushNativeRegister(pointer7); + ssPushNativeRegister(pointer5); return 0; case 168: /* begin genLowcodePointerToInt64 */ /* begin allocateRegistersForLowcodeIntegerResultInteger: */ - rTop112 = NoReg; - rResult13 = NoReg; + rTop110 = NoReg; + rResult12 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop112 = nativeRegisterOrNone(ssNativeTop()); + rTop110 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop112 == NoReg) { - rTop112 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop110 == NoReg) { + rTop110 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult13 = allocateRegNotConflictingWith(1ULL << rTop112); - assert(!(((rTop112 == NoReg) - || (rResult13 == NoReg)))); - pointer8 = rTop112; - result2 = rResult13; - nativePopToReg(ssNativeTop(), pointer8); + rResult12 = allocateRegNotConflictingWith(1ULL << rTop110); + assert(!(((rTop110 == NoReg) + || (rResult12 == NoReg)))); + pointer6 = rTop110; + result2 = rResult12; + nativePopToReg(ssNativeTop(), pointer6); ssNativePop(1); - ssPushNativeRegister(pointer8); + ssPushNativeRegister(pointer6); return 0; case 169: /* begin genLowcodePopFloat32 */ - topRegistersMask12 = 0; + topRegistersMask10 = 0; frTop = NoReg; if ((nativeFloatRegisterOrNone(ssNativeTop())) != NoReg) { frTop = nativeFloatRegisterOrNone(ssNativeTop()); } if (frTop == NoReg) { - frTop = allocateFloatRegNotConflictingWith(topRegistersMask12); + frTop = allocateFloatRegNotConflictingWith(topRegistersMask10); } assert(!((frTop == NoReg))); value8 = frTop; @@ -35600,13 +35875,13 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 170: /* begin genLowcodePopFloat64 */ - topRegistersMask13 = 0; + topRegistersMask11 = 0; frTop1 = NoReg; if ((nativeFloatRegisterOrNone(ssNativeTop())) != NoReg) { frTop1 = nativeFloatRegisterOrNone(ssNativeTop()); } if (frTop1 == NoReg) { - frTop1 = allocateFloatRegNotConflictingWith(topRegistersMask13); + frTop1 = allocateFloatRegNotConflictingWith(topRegistersMask11); } assert(!((frTop1 == NoReg))); value9 = frTop1; @@ -35616,30 +35891,30 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 171: /* begin genLowcodePopInt32 */ - rTop29 = NoReg; + rTop25 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop29 = nativeRegisterOrNone(ssNativeTop()); + rTop25 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop29 == NoReg) { - rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop25 == NoReg) { + rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop29 == NoReg))); - value10 = rTop29; + assert(!((rTop25 == NoReg))); + value10 = rTop25; nativePopToReg(ssNativeTop(), value10); ssNativePop(1); return 0; case 172: /* begin genLowcodePopInt64 */ - rTop30 = NoReg; + rTop26 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop30 = nativeRegisterOrNone(ssNativeTop()); + rTop26 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop30 == NoReg) { - rTop30 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop26 == NoReg) { + rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop30 == NoReg))); - value11 = rTop30; + assert(!((rTop26 == NoReg))); + value11 = rTop26; nativePopToReg(ssNativeTop(), value11); ssNativePop(1); return 0; @@ -35652,16 +35927,16 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 174: /* begin genLowcodePopPointer */ - rTop31 = NoReg; + rTop27 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop31 = nativeRegisterOrNone(ssNativeTop()); + rTop27 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop31 == NoReg) { - rTop31 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop27 == NoReg) { + rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop31 == NoReg))); - pointerValue9 = rTop31; - nativePopToReg(ssNativeTop(), pointerValue9); + assert(!((rTop27 == NoReg))); + pointerValue7 = rTop27; + nativePopToReg(ssNativeTop(), pointerValue7); ssNativePop(1); return 0; @@ -39981,7 +40256,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -40469,6 +40744,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -40476,7 +40752,15 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -40503,11 +40787,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -40594,7 +40877,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -40606,9 +40889,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -40707,6 +40990,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -40726,7 +41010,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((((rcvrInt = ((ssValue(1))->constant)))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -40769,7 +41053,15 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -40944,6 +41236,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -40961,14 +41254,22 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((((argInt = ((ssTop())->constant)))) & 7) == 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((((ssValue(1))->constant))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -41141,6 +41442,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -41164,7 +41466,15 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -41190,6 +41500,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -41218,8 +41529,87 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI /* begin annotateBytecode: */ abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); - /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + /* begin putSelfInReceiverResultReg */ + storeToReg(simSelf(), ReceiverResultReg); + /* begin Jump: */ + immutabilityFailure = genoperand(Jump, ((sqInt)0)); + jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + } +# endif /* IMMUTABILITY */ + ssPop(1); + ssAllocateCallRegand(ClassReg, SendNumArgsReg); + ssPush(1); + genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); + ssStoreAndReplacePoptoReg(popBoolean, ClassReg); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } + /* begin checkQuickConstant:forInstruction: */ + anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); + /* begin CallRT: */ + abstractInstruction = genoperand(Call, ceStoreContextInstVarTrampoline); + (abstractInstruction->annotation = IsRelativeCall); + +# if IMMUTABILITY + if (needsImmCheck) { + jmpTarget(immutabilityFailure, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + } +# endif /* IMMUTABILITY */ + return 0; +} + + +/* The reason we need a frame here is that assigning to an inst var of a + context may + involve wholesale reorganization of stack pages, and the only way to + preserve the + execution state of an activation in that case is if it has a frame. */ + + /* StackToRegisterMappingCogit>>#genStorePop:MaybeContextRemoteInstVar:ofObjectAt:needsStoreCheck:needsImmutabilityCheck: */ +static sqInt NoDbgRegParms +genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) +{ + AbstractInstruction *abstractInstruction; + AbstractInstruction *abstractInstruction1; + AbstractInstruction *abstractInstruction2; + AbstractInstruction *abstractInstruction3; + AbstractInstruction *anInstruction; + AbstractInstruction *anInstruction1; + sqInt i; + AbstractInstruction *immutabilityFailure; + AbstractInstruction *mutableJump; + + assert(needsFrame); + genLoadTempin(objectIndex, ReceiverResultReg); + /* begin genGenericStorePop:MaybeContextSlotIndex:needsStoreCheck:needsRestoreRcvr:needsImmutabilityCheck: */ + assert(needsFrame); + +# if IMMUTABILITY + if (needsImmCheck) { + mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); + /* begin genStoreTrampolineCall: */ + if (slotIndex >= (NumStoreTrampolines - 1)) { + /* begin checkQuickConstant:forInstruction: */ + anInstruction = genoperandoperand(MoveCqR, slotIndex, TempReg); + /* begin CallRT: */ + abstractInstruction3 = genoperand(Call, ceStoreTrampolines[NumStoreTrampolines - 1]); + (abstractInstruction3->annotation = IsRelativeCall); + } + else { + /* begin CallRT: */ + abstractInstruction1 = genoperand(Call, ceStoreTrampolines[slotIndex]); + (abstractInstruction1->annotation = IsRelativeCall); + } + /* begin annotateBytecode: */ + abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); + (abstractInstruction2->annotation = HasBytecodePC); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -41231,77 +41621,15 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); - /* begin checkQuickConstant:forInstruction: */ - anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); - /* begin CallRT: */ - abstractInstruction = genoperand(Call, ceStoreContextInstVarTrampoline); - (abstractInstruction->annotation = IsRelativeCall); - -# if IMMUTABILITY - if (needsImmCheck) { - jmpTarget(immutabilityFailure, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); - } -# endif /* IMMUTABILITY */ - return 0; -} - - -/* The reason we need a frame here is that assigning to an inst var of a - context may - involve wholesale reorganization of stack pages, and the only way to - preserve the - execution state of an activation in that case is if it has a frame. */ - - /* StackToRegisterMappingCogit>>#genStorePop:MaybeContextRemoteInstVar:ofObjectAt:needsStoreCheck:needsImmutabilityCheck: */ -static sqInt NoDbgRegParms -genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) -{ - AbstractInstruction *abstractInstruction; - AbstractInstruction *abstractInstruction1; - AbstractInstruction *abstractInstruction2; - AbstractInstruction *abstractInstruction3; - AbstractInstruction *anInstruction; - AbstractInstruction *anInstruction1; - AbstractInstruction *immutabilityFailure; - AbstractInstruction *mutableJump; - - assert(needsFrame); - genLoadTempin(objectIndex, ReceiverResultReg); - /* begin genGenericStorePop:MaybeContextSlotIndex:needsStoreCheck:needsRestoreRcvr:needsImmutabilityCheck: */ - assert(needsFrame); - -# if IMMUTABILITY - if (needsImmCheck) { - mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); - /* begin genStoreTrampolineCall: */ - if (slotIndex >= (NumStoreTrampolines - 1)) { - /* begin checkQuickConstant:forInstruction: */ - anInstruction = genoperandoperand(MoveCqR, slotIndex, TempReg); - /* begin CallRT: */ - abstractInstruction3 = genoperand(Call, ceStoreTrampolines[NumStoreTrampolines - 1]); - (abstractInstruction3->annotation = IsRelativeCall); - } - else { - /* begin CallRT: */ - abstractInstruction1 = genoperand(Call, ceStoreTrampolines[slotIndex]); - (abstractInstruction1->annotation = IsRelativeCall); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); } - /* begin annotateBytecode: */ - abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); - (abstractInstruction2->annotation = HasBytecodePC); - /* begin Jump: */ - immutabilityFailure = genoperand(Jump, ((sqInt)0)); - jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + simSpillBase = simStackPtr + 1; } -# endif /* IMMUTABILITY */ - ssPop(1); - ssAllocateCallRegand(ClassReg, SendNumArgsReg); - ssPush(1); - genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); - ssStoreAndReplacePoptoReg(popBoolean, ClassReg); - /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -41320,6 +41648,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -41337,7 +41666,15 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -41350,6 +41687,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -41361,7 +41699,15 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -41418,7 +41764,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -41443,6 +41789,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -41451,7 +41798,15 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -41489,64 +41844,40 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - (fixup->simNativeStackPtr) = UnknownSimStackPtrFlag; - (fixup->simNativeStackSize) = 0; -} - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -41556,32 +41887,36 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; } @@ -41590,25 +41925,25 @@ initSimStackForFramelessBlock(sqInt startpc) static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -41616,16 +41951,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; } @@ -41735,10 +42071,21 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -41749,7 +42096,15 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -41758,7 +42113,15 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -41829,7 +42192,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -41837,7 +42199,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; + sqInt i1; + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -41850,14 +42223,11 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); simNativeStackPtr = (fixup->simNativeStackPtr); simNativeStackSize = (fixup->simNativeStackSize); } @@ -41865,10 +42235,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); (fixup->simNativeStackPtr = simNativeStackPtr); (fixup->simNativeStackSize = simNativeStackSize); @@ -41878,18 +42256,17 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) assert(simNativeStackPtr == ((fixup->simNativeStackPtr))); assert(simNativeStackSize == ((fixup->simNativeStackSize))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } - for (i = 0; i <= simNativeStackPtr; i += 1) { - ensureIsMarkedAsSpilled(simNativeStackAt(i)); + simSpillBase = simStackPtr + 1; + for (i1 = 0; i1 <= simNativeStackPtr; i1 += 1) { + ensureIsMarkedAsSpilled(simNativeStackAt(i1)); } simNativeSpillBase = simNativeStackPtr + 1; return 0; @@ -41902,6 +42279,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -41977,6 +42370,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -41987,6 +42391,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -42007,7 +42412,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -42127,6 +42537,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -42203,7 +42614,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -42281,7 +42697,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1ULL << requiredReg1) | ((1ULL << requiredReg2) | (1ULL << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1ULL << requiredReg1) | (1ULL << requiredReg2)) | (1ULL << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredFloatRegMask:upThrough:upThroughNative: */ @@ -42289,6 +42705,7 @@ static void NoDbgRegParms ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -42306,6 +42723,7 @@ ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, s lastRequired = i; } } + assert(lastRequiredNative == simNativeStackPtr); for (i = (((simNativeSpillBase < 0) ? 0 : simNativeSpillBase)); i <= nativeStackPtr; i += 1) { liveRegs = liveRegs | (nativeRegisterMask(simNativeStackAt(i))); if ((0 /* floatRegisterMask */ & requiredRegsMask) != 0) { @@ -42315,7 +42733,16 @@ ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, s if (!((liveRegs & requiredRegsMask) == 0)) { /* Some live, must spill */ - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(((liveFloatRegisters()) & requiredRegsMask) == 0); } } @@ -42339,6 +42766,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -42353,10 +42781,11 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } + assert(nativeStackPtr == simNativeStackPtr); for (i = (((simNativeSpillBase < 0) ? 0 : simNativeSpillBase)); i <= nativeStackPtr; i += 1) { liveRegs = liveRegs | (nativeRegisterMask(simNativeStackAt(i))); if ((nativeRegisterMask(simNativeStackAt(i))) & requiredRegsMask) { @@ -42364,7 +42793,16 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -42390,31 +42828,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1ULL << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - ssNativeFlushTo(nativeIndex); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -42424,16 +42837,26 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; ssNativeFlushTo(simNativeStackPtr); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -42449,16 +42872,29 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; ssNativeFlushTo(simNativeStackPtr); + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -42573,11 +43009,33 @@ ssPopNativeSize(sqInt popSize) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -42585,18 +43043,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -42615,18 +43063,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -42635,17 +43100,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -42653,6 +43135,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -42660,8 +43144,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -42870,17 +43370,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -42891,6 +43408,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -42958,13 +43482,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -42982,6 +43499,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -43056,6 +43604,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -43065,18 +43620,27 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spurlowcode64src/vm/cointerp.c b/spurlowcode64src/vm/cointerp.c index 0a7bdc3a11..0ad81ec7af 100644 --- a/spurlowcode64src/vm/cointerp.c +++ b/spurlowcode64src/vm/cointerp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -526,7 +526,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1523,7 +1522,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2576,7 +2575,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -36915,24 +36914,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -43592,7 +43573,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((sqInt)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -86306,7 +86295,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -92224,7 +92213,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -92241,7 +92238,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -92249,11 +92246,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -92287,7 +92284,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -95697,7 +95702,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -96001,7 +96006,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -96032,18 +96036,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -96094,10 +96101,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -96105,22 +96112,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -96132,18 +96139,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -96425,7 +96432,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurlowcode64src/vm/cointerp.h b/spurlowcode64src/vm/cointerp.h index 6df5edcba4..2abc906e70 100644 --- a/spurlowcode64src/vm/cointerp.h +++ b/spurlowcode64src/vm/cointerp.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ @@ -328,6 +328,7 @@ extern sqInt literalofMethod(sqInt offset, sqInt methodPointer); extern void longPrintOop(sqInt oop); extern sqInt longStoreBytecodeForHeader(sqInt methodHeader); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodClassAssociationOf(sqInt methodPointer); extern sqInt methodClassOf(sqInt methodPointer); extern sqInt methodPrimitiveIndex(void); diff --git a/spurlowcode64src/vm/gcc3x-cointerp.c b/spurlowcode64src/vm/gcc3x-cointerp.c index 6c9384ce18..aceb5be316 100644 --- a/spurlowcode64src/vm/gcc3x-cointerp.c +++ b/spurlowcode64src/vm/gcc3x-cointerp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -529,7 +529,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1526,7 +1525,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2579,7 +2578,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -36924,24 +36923,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -43601,7 +43582,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((sqInt)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -86315,7 +86304,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -92233,7 +92222,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -92250,7 +92247,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -92258,11 +92255,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -92296,7 +92293,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -95706,7 +95711,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -96010,7 +96015,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -96041,18 +96045,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -96103,10 +96110,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -96114,22 +96121,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -96141,18 +96148,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -96434,7 +96441,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurlowcodesrc/vm/cogit.h b/spurlowcodesrc/vm/cogit.h index 6676dad49f..65b314cae3 100644 --- a/spurlowcodesrc/vm/cogit.h +++ b/spurlowcodesrc/vm/cogit.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ diff --git a/spurlowcodesrc/vm/cogitARMv5.c b/spurlowcodesrc/vm/cogitARMv5.c index 8d03973ead..c8118dc8a4 100644 --- a/spurlowcodesrc/vm/cogitARMv5.c +++ b/spurlowcodesrc/vm/cogitARMv5.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -354,7 +354,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstOpcode 8 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 10 #define VC 7 @@ -447,7 +446,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -1136,7 +1136,6 @@ static CogSimStackNativeEntry * NoDbgRegParms nativeStackPopToReg(CogSimStackNat static CogSimStackNativeEntry * NoDbgRegParms nativeStackPopToRegsecondReg(CogSimStackNativeEntry * self_in_nativeStackPopToRegsecondReg, sqInt reg, sqInt secondReg); static sqInt NoDbgRegParms spillingNeedsScratchRegister(CogSimStackNativeEntry * self_in_spillingNeedsScratchRegister); static sqInt NoDbgRegParms stackSpillSize(CogSimStackNativeEntry * self_in_stackSpillSize); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms allocateLiteral(sqInt aLiteral); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1364,7 +1363,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1376,11 +1374,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1396,7 +1396,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssNativeFlushTo(sqInt index); @@ -1421,14 +1420,16 @@ static sqInt NoDbgRegParms ssPushNativeRegister(sqInt reg); static sqInt NoDbgRegParms ssPushNativeRegistersecondRegister(sqInt reg, sqInt secondReg); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -2113,7 +2114,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -2137,7 +2137,6 @@ static sqInt simNativeSpillBase; static CogSimStackNativeEntry simNativeStack[70]; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2219,6 +2218,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -9007,12 +9007,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -23504,7 +23510,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -23556,7 +23562,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -24358,8 +24364,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -25124,13 +25131,6 @@ stackSpillSize(CogSimStackNativeEntry * self_in_stackSpillSize) return 0; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -28625,11 +28625,20 @@ beginHighLevelCall(sqInt alignment) AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; + sqInt i; sqInt mask; sqInt offset; /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); /* begin MoveR:Aw: */ address1 = stackPointerAddress(); @@ -28755,10 +28764,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -29169,6 +29175,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -29758,7 +29767,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -29809,7 +29819,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simNativeStackSize = simNativeStackSize); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -29854,18 +29864,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -29937,7 +29946,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -30164,12 +30173,21 @@ genExtEnsureAllocableSlots(void) sqInt address1; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -30307,7 +30325,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -30601,6 +30619,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -30713,7 +30732,15 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -30967,11 +30994,20 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; sqInt address; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -31007,13 +31043,22 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -31091,10 +31136,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -31104,13 +31151,29 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -31176,6 +31239,13 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt i17; sqInt i18; sqInt i19; + sqInt i210; + sqInt i211; + sqInt i212; + sqInt i214; + sqInt i29; + sqInt i34; + sqInt i37; sqInt index1; sqInt index11; sqInt index110; @@ -31300,12 +31370,12 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) index119 = ((simSpillBase < 0) ? 0 : simSpillBase); for (i119 = index119; i119 <= (simStackPtr); i119 += 1) { if ((registerOrNone(simStackAt(index119))) == rOopTop19) { - goto l60; + goto l62; } } - l60: ; + l62: ; rOopTop19 = NoReg; - l59: ; + l61: ; } if (rOopTop19 == NoReg) { rOopTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); @@ -31318,7 +31388,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object17); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i29 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i29 <= simStackPtr; i29 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i29), frameOffsetOfTemporary(i29 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcByteSizeOfto(object17, value9); return 0; @@ -31759,7 +31837,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object18); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i210 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i210 <= simStackPtr; i210 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i210), frameOffsetOfTemporary(i210 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoFloat32(object18, value10); return 0; @@ -31793,7 +31879,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object19); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i211 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i211 <= simStackPtr; i211 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i211), frameOffsetOfTemporary(i211 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoFloat64(object19, value11); return 0; @@ -31823,7 +31917,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object20); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i212 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i212 <= simStackPtr; i212 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i212), frameOffsetOfTemporary(i212 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToInt32(object20); return 0; @@ -31860,7 +31962,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object21); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i34 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i34 <= simStackPtr; i34 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i34), frameOffsetOfTemporary(i34 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoInt64highPart(object21, valueLow2, valueHigh2); return 0; @@ -31952,7 +32062,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object22); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i214 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i214 <= simStackPtr; i214 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i214), frameOffsetOfTemporary(i214 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToUInt32(object22); return 0; @@ -31989,7 +32107,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object23); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i37 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i37 <= simStackPtr; i37 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i37), frameOffsetOfTemporary(i37 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoUInt64highPart(object23, valueLow3, valueHigh3); return 0; @@ -32068,6 +32194,13 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) sqInt floatValue; sqInt frTop; sqInt frTop1; + sqInt i; + sqInt i1; + sqInt i2; + sqInt i3; + sqInt i4; + sqInt i5; + sqInt i6; AbstractInstruction * inst; AbstractInstruction * inst1; sqInt object; @@ -32227,7 +32360,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), singleFloatValue); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcFloat32toOop(singleFloatValue, object2); return 0; @@ -32252,7 +32393,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), floatValue); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcFloat64toOop(floatValue, object3); return 0; @@ -32271,7 +32420,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value2); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInt32ToOop(value2); return 0; @@ -32307,7 +32464,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToRegsecondReg(ssNativeTop(), valueLow1, valueHigh1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 <= simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInt64ToOophighPart(valueLow1, valueHigh1); return 0; @@ -32316,51 +32481,59 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) /* begin genLowcodePointerToOop */ pointerClassLiteral = getLiteral(extA); /* begin allocateRegistersForLowcodeInteger: */ - rTop5 = NoReg; + rTop7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop5 == NoReg))); - pointer = rTop5; - nativePopToReg(ssNativeTop(), pointer); + assert(!((rTop7 == NoReg))); + pointer1 = rTop7; + nativePopToReg(ssNativeTop(), pointer1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 <= simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - genLcPointerToOopclass(pointer, pointerClassLiteral); + genLcPointerToOopclass(pointer1, pointerClassLiteral); extA = 0; return 0; case 7: /* begin genLowcodePointerToOopReinterprer */ - rTop6 = NoReg; + rTop5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop6 == NoReg))); - pointer1 = rTop6; - nativePopToReg(ssNativeTop(), pointer1); + assert(!((rTop5 == NoReg))); + pointer = rTop5; + nativePopToReg(ssNativeTop(), pointer); ssNativePop(1); - ssPushRegister(pointer1); + ssPushRegister(pointer); return 0; case 8: /* begin genLowcodeSmallInt32ToOop */ - rTop7 = NoReg; + rTop6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop7 == NoReg) { - rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop7 == NoReg))); - value4 = rTop7; + assert(!((rTop6 == NoReg))); + value4 = rTop6; nativePopToReg(ssNativeTop(), value4); ssNativePop(1); genConvertIntegerToSmallIntegerInReg(value4); @@ -32381,7 +32554,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value5); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i5 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i5 <= simStackPtr; i5 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i5), frameOffsetOfTemporary(i5 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcUInt32ToOop(value5); return 0; @@ -32421,7 +32602,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToRegsecondReg(ssNativeTop(), valueLow2, valueHigh2); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i6 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i6 <= simStackPtr; i6 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i6), frameOffsetOfTemporary(i6 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcUInt64ToOophighPart(valueLow2, valueHigh2); return 0; @@ -32878,8 +33067,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt frTop2; sqInt frTop3; sqInt frTop4; + sqInt i; sqInt i1; sqInt i11; + sqInt i12; + sqInt i2; + sqInt i21; sqInt index1; sqInt index11; sqInt indexableSize; @@ -32990,12 +33183,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt rTop; sqInt rTop1; sqInt rTop10; - sqInt rTop11; + sqInt rTop12; sqInt rTop13; sqInt rTop14; sqInt rTop15; - sqInt rTop16; sqInt rTop17; + sqInt rTop18; sqInt rTop19; sqInt rTop2; sqInt rTop20; @@ -33204,23 +33397,31 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 65: /* begin genLowcodeFree */ - rTop = NoReg; + rTop29 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop = nativeRegisterOrNone(ssNativeTop()); + rTop29 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop == NoReg) { - rTop = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop29 == NoReg) { + rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop == NoReg))); - pointer2 = rTop; - nativePopToReg(ssNativeTop(), pointer2); + assert(!((rTop29 == NoReg))); + pointer8 = rTop29; + nativePopToReg(ssNativeTop(), pointer8); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - if (pointer2 != ReceiverResultReg) { + if (pointer8 != ReceiverResultReg) { /* begin MoveR:R: */ - genoperandoperand(MoveRR, pointer2, ReceiverResultReg); + genoperandoperand(MoveRR, pointer8, ReceiverResultReg); } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceFreeTrampoline); @@ -33229,36 +33430,44 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 66: /* begin genLowcodeInstantiateIndexable32Oop */ - rTop1 = (rOopTop = NoReg); + rTop30 = (rOopTop1 = NoReg); rOopResult = NoReg; - topRegisterMask = 0; + topRegisterMask1 = 0; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop1 = nativeRegisterOrNone(ssNativeTop()); + rTop30 = nativeRegisterOrNone(ssNativeTop()); } if ((registerOrNone(ssTop())) != NoReg) { - rOopTop = registerOrNone(ssTop()); + rOopTop1 = registerOrNone(ssTop()); /* begin registerMaskFor: */ - topRegisterMask = 1U << rOopTop; + topRegisterMask1 = 1U << rOopTop1; } - if (rTop1 == NoReg) { - rTop1 = allocateRegNotConflictingWith(topRegisterMask); + if (rTop30 == NoReg) { + rTop30 = allocateRegNotConflictingWith(topRegisterMask1); } - if (rOopTop == NoReg) { - rOopTop = allocateRegNotConflictingWith(1U << rTop1); + if (rOopTop1 == NoReg) { + rOopTop1 = allocateRegNotConflictingWith(1U << rTop30); } - rOopResult = allocateRegNotConflictingWith((1U << rTop1) | (1U << rOopTop)); - assert(!(((rTop1 == NoReg) - || ((rOopTop == NoReg) + rOopResult = allocateRegNotConflictingWith((1U << rTop30) | (1U << rOopTop1)); + assert(!(((rTop30 == NoReg) + || ((rOopTop1 == NoReg) || (rOopResult == NoReg))))); - indexableSize = rTop1; - classOop = rOopTop; - object = rOopResult; + indexableSize = rTop30; + classOop = rOopTop1; + object1 = rOopResult; nativePopToReg(ssNativeTop(), indexableSize); ssNativePop(1); popToReg(ssTop(), classOop); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOopindexableSize(classOop, indexableSize); return 0; @@ -33267,34 +33476,42 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInstantiateIndexableOop */ indexableSize1 = extA; /* begin allocateRegistersForLowcodeOopResultOop: */ - rOopTop1 = NoReg; - rResult20 = NoReg; + rOopTop2 = NoReg; + rResult35 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop1 = registerOrNone(ssTop()); + rOopTop2 = registerOrNone(ssTop()); index1 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i1 = index1; i1 <= (simStackPtr); i1 += 1) { - if ((registerOrNone(simStackAt(index1))) == rOopTop1) { - goto l40; + for (i11 = index1; i11 <= (simStackPtr); i11 += 1) { + if ((registerOrNone(simStackAt(index1))) == rOopTop2) { + goto l200; } } - l40: ; - rOopTop1 = NoReg; - l39: ; + l200: ; + rOopTop2 = NoReg; + l199: ; } - if (rOopTop1 == NoReg) { - rOopTop1 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop2 == NoReg) { + rOopTop2 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult20 = allocateRegNotConflictingWith(1U << rOopTop1); - assert(!(((rOopTop1 == NoReg) - || (rResult20 == NoReg)))); - classOop1 = rOopTop1; - object1 = rResult20; + rResult35 = allocateRegNotConflictingWith(1U << rOopTop2); + assert(!(((rOopTop2 == NoReg) + || (rResult35 == NoReg)))); + classOop1 = rOopTop2; + object2 = rResult35; popToReg(ssTop(), classOop1); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOopconstantIndexableSize(classOop1, indexableSize1); extA = 0; @@ -33302,30 +33519,38 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 68: /* begin genLowcodeInstantiateOop */ - rOopTop2 = NoReg; + rOopTop3 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop2 = registerOrNone(ssTop()); + rOopTop3 = registerOrNone(ssTop()); index11 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i11 = index11; i11 <= (simStackPtr); i11 += 1) { - if ((registerOrNone(simStackAt(index11))) == rOopTop2) { - goto l43; + for (i12 = index11; i12 <= (simStackPtr); i12 += 1) { + if ((registerOrNone(simStackAt(index11))) == rOopTop3) { + goto l203; } } - l43: ; - rOopTop2 = NoReg; - l42: ; + l203: ; + rOopTop3 = NoReg; + l202: ; } - if (rOopTop2 == NoReg) { - rOopTop2 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop3 == NoReg) { + rOopTop3 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rOopTop2 == NoReg))); - classOop2 = rOopTop2; + assert(!((rOopTop3 == NoReg))); + classOop2 = rOopTop3; popToReg(ssTop(), classOop2); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i21 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i21 <= simStackPtr; i21 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i21), frameOffsetOfTemporary(i21 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOop(classOop2); return 0; @@ -33333,9 +33558,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 69: /* begin genLowcodeInt32Equal */ topRegistersMask1 = 0; - rTop2 = (rNext = NoReg); + rTop = (rNext = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop2 = nativeRegisterOrNone(ssNativeTop()); + rTop = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33347,15 +33572,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask1 = 1U << reg; } } - if (rTop2 == NoReg) { - rTop2 = allocateRegNotConflictingWith(topRegistersMask1); + if (rTop == NoReg) { + rTop = allocateRegNotConflictingWith(topRegistersMask1); } if (rNext == NoReg) { - rNext = allocateRegNotConflictingWith(1U << rTop2); + rNext = allocateRegNotConflictingWith(1U << rTop); } - assert(!(((rTop2 == NoReg) + assert(!(((rTop == NoReg) || (rNext == NoReg)))); - second = rTop2; + second = rTop; first = rNext; nativePopToReg(ssNativeTop(), second); ssNativePop(1); @@ -33385,9 +33610,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 70: /* begin genLowcodeInt32Great */ topRegistersMask2 = 0; - rTop3 = (rNext1 = NoReg); + rTop1 = (rNext1 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop3 = nativeRegisterOrNone(ssNativeTop()); + rTop1 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33399,15 +33624,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask2 = 1U << reg1; } } - if (rTop3 == NoReg) { - rTop3 = allocateRegNotConflictingWith(topRegistersMask2); + if (rTop1 == NoReg) { + rTop1 = allocateRegNotConflictingWith(topRegistersMask2); } if (rNext1 == NoReg) { - rNext1 = allocateRegNotConflictingWith(1U << rTop3); + rNext1 = allocateRegNotConflictingWith(1U << rTop1); } - assert(!(((rTop3 == NoReg) + assert(!(((rTop1 == NoReg) || (rNext1 == NoReg)))); - second1 = rTop3; + second1 = rTop1; first1 = rNext1; nativePopToReg(ssNativeTop(), second1); ssNativePop(1); @@ -33437,9 +33662,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 71: /* begin genLowcodeInt32GreatEqual */ topRegistersMask3 = 0; - rTop4 = (rNext2 = NoReg); + rTop2 = (rNext2 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop4 = nativeRegisterOrNone(ssNativeTop()); + rTop2 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33451,15 +33676,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask3 = 1U << reg2; } } - if (rTop4 == NoReg) { - rTop4 = allocateRegNotConflictingWith(topRegistersMask3); + if (rTop2 == NoReg) { + rTop2 = allocateRegNotConflictingWith(topRegistersMask3); } if (rNext2 == NoReg) { - rNext2 = allocateRegNotConflictingWith(1U << rTop4); + rNext2 = allocateRegNotConflictingWith(1U << rTop2); } - assert(!(((rTop4 == NoReg) + assert(!(((rTop2 == NoReg) || (rNext2 == NoReg)))); - second2 = rTop4; + second2 = rTop2; first2 = rNext2; nativePopToReg(ssNativeTop(), second2); ssNativePop(1); @@ -33489,9 +33714,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 72: /* begin genLowcodeInt32Less */ topRegistersMask4 = 0; - rTop5 = (rNext3 = NoReg); + rTop3 = (rNext3 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop3 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33503,15 +33728,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask4 = 1U << reg3; } } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(topRegistersMask4); + if (rTop3 == NoReg) { + rTop3 = allocateRegNotConflictingWith(topRegistersMask4); } if (rNext3 == NoReg) { - rNext3 = allocateRegNotConflictingWith(1U << rTop5); + rNext3 = allocateRegNotConflictingWith(1U << rTop3); } - assert(!(((rTop5 == NoReg) + assert(!(((rTop3 == NoReg) || (rNext3 == NoReg)))); - second3 = rTop5; + second3 = rTop3; first3 = rNext3; nativePopToReg(ssNativeTop(), second3); ssNativePop(1); @@ -33541,9 +33766,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 73: /* begin genLowcodeInt32LessEqual */ topRegistersMask5 = 0; - rTop6 = (rNext4 = NoReg); + rTop4 = (rNext4 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop4 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33555,15 +33780,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask5 = 1U << reg4; } } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(topRegistersMask5); + if (rTop4 == NoReg) { + rTop4 = allocateRegNotConflictingWith(topRegistersMask5); } if (rNext4 == NoReg) { - rNext4 = allocateRegNotConflictingWith(1U << rTop6); + rNext4 = allocateRegNotConflictingWith(1U << rTop4); } - assert(!(((rTop6 == NoReg) + assert(!(((rTop4 == NoReg) || (rNext4 == NoReg)))); - second4 = rTop6; + second4 = rTop4; first4 = rNext4; nativePopToReg(ssNativeTop(), second4); ssNativePop(1); @@ -33593,9 +33818,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 74: /* begin genLowcodeInt32NotEqual */ topRegistersMask6 = 0; - rTop7 = (rNext5 = NoReg); + rTop5 = (rNext5 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33607,15 +33832,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask6 = 1U << reg5; } } - if (rTop7 == NoReg) { - rTop7 = allocateRegNotConflictingWith(topRegistersMask6); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(topRegistersMask6); } if (rNext5 == NoReg) { - rNext5 = allocateRegNotConflictingWith(1U << rTop7); + rNext5 = allocateRegNotConflictingWith(1U << rTop5); } - assert(!(((rTop7 == NoReg) + assert(!(((rTop5 == NoReg) || (rNext5 == NoReg)))); - second5 = rTop7; + second5 = rTop5; first5 = rNext5; nativePopToReg(ssNativeTop(), second5); ssNativePop(1); @@ -33644,18 +33869,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 75: /* begin genLowcodeInt32ToFloat32 */ - rTop8 = NoReg; + rTop6 = NoReg; frResult4 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop8 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop8 == NoReg) { - rTop8 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult4 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop8 == NoReg) + assert(!(((rTop6 == NoReg) || (frResult4 == NoReg)))); - value12 = rTop8; + value12 = rTop6; result = frResult4; nativePopToReg(ssNativeTop(), value12); ssNativePop(1); @@ -33666,18 +33891,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 76: /* begin genLowcodeInt32ToFloat64 */ - rTop9 = NoReg; + rTop7 = NoReg; frResult5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop9 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop9 == NoReg) { - rTop9 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult5 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop9 == NoReg) + assert(!(((rTop7 == NoReg) || (frResult5 == NoReg)))); - value13 = rTop9; + value13 = rTop7; result1 = frResult5; nativePopToReg(ssNativeTop(), value13); ssNativePop(1); @@ -33688,15 +33913,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 77: /* begin genLowcodeInt32ToPointer */ - rTop10 = NoReg; + rTop8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop10 = nativeRegisterOrNone(ssNativeTop()); + rTop8 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop10 == NoReg) { - rTop10 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop8 == NoReg) { + rTop8 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop10 == NoReg))); - value14 = rTop10; + assert(!((rTop8 == NoReg))); + value14 = rTop8; nativePopToReg(ssNativeTop(), value14); ssNativePop(1); ssPushNativeRegister(value14); @@ -33705,10 +33930,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 78: /* begin genLowcodeInt64Equal */ /* begin allocateRegistersForLowcodeInteger4: */ - rTop11 = (rNext6 = (rNextNext = (rNextNextNext = NoReg))); + rTop9 = (rNext6 = (rNextNext = (rNextNextNext = NoReg))); nativeValueIndex = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop11 = nativeRegisterOrNone(ssNativeTop()); + rTop9 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext6 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33737,7 +33962,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) nativeValueIndex += 1; } } - if (rTop11 == NoReg) { + if (rTop9 == NoReg) { nextRegisterMask = 0; if (rNext6 != NoReg) { /* begin registerMaskFor: */ @@ -33749,11 +33974,11 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) if (rNextNextNext != NoReg) { nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rTop11 = allocateRegNotConflictingWith(nextRegisterMask); + rTop9 = allocateRegNotConflictingWith(nextRegisterMask); } if (rNext6 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1U << rTop11; + nextRegisterMask = 1U << rTop9; if (rNextNext != NoReg) { nextRegisterMask = nextRegisterMask | (1U << rNextNext); } @@ -33764,7 +33989,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNext == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask = (1U << rTop11) | (1U << rNext6); + nextRegisterMask = (1U << rTop9) | (1U << rNext6); if (rNextNextNext != NoReg) { nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } @@ -33772,14 +33997,14 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNextNext == NoReg) { /* begin registerMaskFor:and:and: */ - nextRegisterMask = ((1U << rTop11) | (1U << rNext6)) | (1U << rNextNext); + nextRegisterMask = ((1U << rTop9) | (1U << rNext6)) | (1U << rNextNext); rNextNextNext = allocateRegNotConflictingWith(nextRegisterMask); } - assert(!(((rTop11 == NoReg) + assert(!(((rTop9 == NoReg) || ((rNext6 == NoReg) || ((rNextNext == NoReg) || (rNextNextNext == NoReg)))))); - secondLow = rTop11; + secondLow = rTop9; secondHigh = rNext6; firstLow = rNextNext; firstHigh = rNextNextNext; @@ -33817,10 +34042,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 79: /* begin genLowcodeInt64Great */ topRegistersMask8 = 0; - rTop13 = (rNext7 = NoReg); - rResult21 = NoReg; + rTop10 = (rNext7 = NoReg); + rResult20 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop13 = nativeRegisterOrNone(ssNativeTop()); + rTop10 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext7 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33832,19 +34057,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask8 = 1U << reg7; } } - if (rTop13 == NoReg) { - rTop13 = allocateRegNotConflictingWith(topRegistersMask8); + if (rTop10 == NoReg) { + rTop10 = allocateRegNotConflictingWith(topRegistersMask8); } if (rNext7 == NoReg) { - rNext7 = allocateRegNotConflictingWith(1U << rTop13); + rNext7 = allocateRegNotConflictingWith(1U << rTop10); } - assert(!(((rTop13 == NoReg) + assert(!(((rTop10 == NoReg) || (rNext7 == NoReg)))); - rResult21 = allocateFloatRegNotConflictingWith((1U << rTop13) | (1U << rNext7)); - assert(!((rResult21 == NoReg))); - second7 = rTop13; + rResult20 = allocateFloatRegNotConflictingWith((1U << rTop10) | (1U << rNext7)); + assert(!((rResult20 == NoReg))); + second7 = rTop10; first7 = rNext7; - value15 = rResult21; + value15 = rResult20; nativePopToReg(ssNativeTop(), second7); ssNativePop(1); nativePopToReg(ssNativeTop(), first7); @@ -33855,10 +34080,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 80: /* begin genLowcodeInt64GreatEqual */ topRegistersMask9 = 0; - rTop14 = (rNext8 = NoReg); - rResult22 = NoReg; + rTop12 = (rNext8 = NoReg); + rResult21 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop14 = nativeRegisterOrNone(ssNativeTop()); + rTop12 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33870,19 +34095,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask9 = 1U << reg8; } } - if (rTop14 == NoReg) { - rTop14 = allocateRegNotConflictingWith(topRegistersMask9); + if (rTop12 == NoReg) { + rTop12 = allocateRegNotConflictingWith(topRegistersMask9); } if (rNext8 == NoReg) { - rNext8 = allocateRegNotConflictingWith(1U << rTop14); + rNext8 = allocateRegNotConflictingWith(1U << rTop12); } - assert(!(((rTop14 == NoReg) + assert(!(((rTop12 == NoReg) || (rNext8 == NoReg)))); - rResult22 = allocateFloatRegNotConflictingWith((1U << rTop14) | (1U << rNext8)); - assert(!((rResult22 == NoReg))); - second8 = rTop14; + rResult21 = allocateFloatRegNotConflictingWith((1U << rTop12) | (1U << rNext8)); + assert(!((rResult21 == NoReg))); + second8 = rTop12; first8 = rNext8; - value16 = rResult22; + value16 = rResult21; nativePopToReg(ssNativeTop(), second8); ssNativePop(1); nativePopToReg(ssNativeTop(), first8); @@ -33893,10 +34118,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 81: /* begin genLowcodeInt64Less */ topRegistersMask10 = 0; - rTop15 = (rNext9 = NoReg); - rResult23 = NoReg; + rTop13 = (rNext9 = NoReg); + rResult22 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop15 = nativeRegisterOrNone(ssNativeTop()); + rTop13 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33908,19 +34133,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask10 = 1U << reg9; } } - if (rTop15 == NoReg) { - rTop15 = allocateRegNotConflictingWith(topRegistersMask10); + if (rTop13 == NoReg) { + rTop13 = allocateRegNotConflictingWith(topRegistersMask10); } if (rNext9 == NoReg) { - rNext9 = allocateRegNotConflictingWith(1U << rTop15); + rNext9 = allocateRegNotConflictingWith(1U << rTop13); } - assert(!(((rTop15 == NoReg) + assert(!(((rTop13 == NoReg) || (rNext9 == NoReg)))); - rResult23 = allocateFloatRegNotConflictingWith((1U << rTop15) | (1U << rNext9)); - assert(!((rResult23 == NoReg))); - second9 = rTop15; + rResult22 = allocateFloatRegNotConflictingWith((1U << rTop13) | (1U << rNext9)); + assert(!((rResult22 == NoReg))); + second9 = rTop13; first9 = rNext9; - value17 = rResult23; + value17 = rResult22; nativePopToReg(ssNativeTop(), second9); ssNativePop(1); nativePopToReg(ssNativeTop(), first9); @@ -33931,10 +34156,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 82: /* begin genLowcodeInt64LessEqual */ topRegistersMask11 = 0; - rTop16 = (rNext10 = NoReg); - rResult24 = NoReg; + rTop14 = (rNext10 = NoReg); + rResult23 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop16 = nativeRegisterOrNone(ssNativeTop()); + rTop14 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -33946,19 +34171,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask11 = 1U << reg10; } } - if (rTop16 == NoReg) { - rTop16 = allocateRegNotConflictingWith(topRegistersMask11); + if (rTop14 == NoReg) { + rTop14 = allocateRegNotConflictingWith(topRegistersMask11); } if (rNext10 == NoReg) { - rNext10 = allocateRegNotConflictingWith(1U << rTop16); + rNext10 = allocateRegNotConflictingWith(1U << rTop14); } - assert(!(((rTop16 == NoReg) + assert(!(((rTop14 == NoReg) || (rNext10 == NoReg)))); - rResult24 = allocateFloatRegNotConflictingWith((1U << rTop16) | (1U << rNext10)); - assert(!((rResult24 == NoReg))); - second10 = rTop16; + rResult23 = allocateFloatRegNotConflictingWith((1U << rTop14) | (1U << rNext10)); + assert(!((rResult23 == NoReg))); + second10 = rTop14; first10 = rNext10; - value18 = rResult24; + value18 = rResult23; nativePopToReg(ssNativeTop(), second10); ssNativePop(1); nativePopToReg(ssNativeTop(), first10); @@ -33969,10 +34194,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 83: /* begin genLowcodeInt64NotEqual */ /* begin allocateRegistersForLowcodeInteger4: */ - rTop17 = (rNext12 = (rNextNext1 = (rNextNextNext1 = NoReg))); + rTop15 = (rNext12 = (rNextNext1 = (rNextNextNext1 = NoReg))); nativeValueIndex1 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop17 = nativeRegisterOrNone(ssNativeTop()); + rTop15 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext12 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -34001,7 +34226,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) nativeValueIndex1 += 1; } } - if (rTop17 == NoReg) { + if (rTop15 == NoReg) { nextRegisterMask1 = 0; if (rNext12 != NoReg) { /* begin registerMaskFor: */ @@ -34013,11 +34238,11 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) if (rNextNextNext1 != NoReg) { nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNextNext1); } - rTop17 = allocateRegNotConflictingWith(nextRegisterMask1); + rTop15 = allocateRegNotConflictingWith(nextRegisterMask1); } if (rNext12 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1U << rTop17; + nextRegisterMask1 = 1U << rTop15; if (rNextNext1 != NoReg) { nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); } @@ -34028,7 +34253,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNext1 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask1 = (1U << rTop17) | (1U << rNext12); + nextRegisterMask1 = (1U << rTop15) | (1U << rNext12); if (rNextNextNext1 != NoReg) { nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNextNext1); } @@ -34036,14 +34261,14 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNextNext1 == NoReg) { /* begin registerMaskFor:and:and: */ - nextRegisterMask1 = ((1U << rTop17) | (1U << rNext12)) | (1U << rNextNext1); + nextRegisterMask1 = ((1U << rTop15) | (1U << rNext12)) | (1U << rNextNext1); rNextNextNext1 = allocateRegNotConflictingWith(nextRegisterMask1); } - assert(!(((rTop17 == NoReg) + assert(!(((rTop15 == NoReg) || ((rNext12 == NoReg) || ((rNextNext1 == NoReg) || (rNextNextNext1 == NoReg)))))); - secondLow5 = rTop17; + secondLow5 = rTop15; secondHigh5 = rNext12; firstLow5 = rNextNext1; firstHigh5 = rNextNextNext1; @@ -34080,18 +34305,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 84: /* begin genLowcodeInt64ToFloat32 */ - rTop19 = NoReg; + rTop17 = NoReg; frResult6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop19 = nativeRegisterOrNone(ssNativeTop()); + rTop17 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop19 == NoReg) { - rTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop17 == NoReg) { + rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult6 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop19 == NoReg) + assert(!(((rTop17 == NoReg) || (frResult6 == NoReg)))); - value19 = rTop19; + value19 = rTop17; result2 = frResult6; nativePopToReg(ssNativeTop(), value19); ssNativePop(1); @@ -34100,18 +34325,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 85: /* begin genLowcodeInt64ToFloat64 */ - rTop20 = NoReg; + rTop18 = NoReg; frResult7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop20 = nativeRegisterOrNone(ssNativeTop()); + rTop18 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop20 == NoReg) { - rTop20 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop18 == NoReg) { + rTop18 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult7 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop20 == NoReg) + assert(!(((rTop18 == NoReg) || (frResult7 == NoReg)))); - value20 = rTop20; + value20 = rTop18; result3 = frResult7; nativePopToReg(ssNativeTop(), value20); ssNativePop(1); @@ -34122,9 +34347,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInt64ToPointer */ /* begin allocateRegistersForLowcodeInteger2: */ topRegistersMask13 = 0; - rTop21 = (rNext14 = NoReg); + rTop19 = (rNext14 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop21 = nativeRegisterOrNone(ssNativeTop()); + rTop19 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -34136,15 +34361,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask13 = 1U << reg12; } } - if (rTop21 == NoReg) { - rTop21 = allocateRegNotConflictingWith(topRegistersMask13); + if (rTop19 == NoReg) { + rTop19 = allocateRegNotConflictingWith(topRegistersMask13); } if (rNext14 == NoReg) { - rNext14 = allocateRegNotConflictingWith(1U << rTop21); + rNext14 = allocateRegNotConflictingWith(1U << rTop19); } - assert(!(((rTop21 == NoReg) + assert(!(((rTop19 == NoReg) || (rNext14 == NoReg)))); - valueLow2 = rTop21; + valueLow2 = rTop19; valueHigh2 = rNext14; nativePopToRegsecondReg(ssNativeTop(), valueLow2, valueHigh2); ssNativePop(1); @@ -34154,9 +34379,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 87: /* begin genLowcodeLeftShift32 */ topRegistersMask14 = 0; - rTop22 = (rNext15 = NoReg); + rTop20 = (rNext15 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop22 = nativeRegisterOrNone(ssNativeTop()); + rTop20 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -34168,15 +34393,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask14 = 1U << reg13; } } - if (rTop22 == NoReg) { - rTop22 = allocateRegNotConflictingWith(topRegistersMask14); + if (rTop20 == NoReg) { + rTop20 = allocateRegNotConflictingWith(topRegistersMask14); } if (rNext15 == NoReg) { - rNext15 = allocateRegNotConflictingWith(1U << rTop22); + rNext15 = allocateRegNotConflictingWith(1U << rTop20); } - assert(!(((rTop22 == NoReg) + assert(!(((rTop20 == NoReg) || (rNext15 == NoReg)))); - shiftAmount = rTop22; + shiftAmount = rTop20; value22 = rNext15; nativePopToReg(ssNativeTop(), shiftAmount); ssNativePop(1); @@ -34190,10 +34415,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 88: /* begin genLowcodeLeftShift64 */ topRegistersMask15 = 0; - rTop23 = (rNext16 = NoReg); - rResult25 = NoReg; + rTop21 = (rNext16 = NoReg); + rResult24 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop23 = nativeRegisterOrNone(ssNativeTop()); + rTop21 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext16 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -34205,19 +34430,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask15 = 1U << reg14; } } - if (rTop23 == NoReg) { - rTop23 = allocateRegNotConflictingWith(topRegistersMask15); + if (rTop21 == NoReg) { + rTop21 = allocateRegNotConflictingWith(topRegistersMask15); } if (rNext16 == NoReg) { - rNext16 = allocateRegNotConflictingWith(1U << rTop23); + rNext16 = allocateRegNotConflictingWith(1U << rTop21); } - assert(!(((rTop23 == NoReg) + assert(!(((rTop21 == NoReg) || (rNext16 == NoReg)))); - rResult25 = allocateFloatRegNotConflictingWith((1U << rTop23) | (1U << rNext16)); - assert(!((rResult25 == NoReg))); - shiftAmount1 = rTop23; + rResult24 = allocateFloatRegNotConflictingWith((1U << rTop21) | (1U << rNext16)); + assert(!((rResult24 == NoReg))); + shiftAmount1 = rTop21; value23 = rNext16; - result4 = rResult25; + result4 = rResult24; nativePopToReg(ssNativeTop(), shiftAmount1); ssNativePop(1); nativePopToReg(ssNativeTop(), value23); @@ -34316,13 +34541,13 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadArgumentInt64 */ baseOffset20 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult26 = (rResult27 = NoReg); - rResult26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult27 = allocateRegNotConflictingWith(1U << rResult26); - assert(!(((rResult26 == NoReg) - || (rResult27 == NoReg)))); - valueLow4 = rResult26; - valueHigh4 = rResult27; + rResult25 = (rResult26 = NoReg); + rResult25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult26 = allocateRegNotConflictingWith(1U << rResult25); + assert(!(((rResult25 == NoReg) + || (rResult26 == NoReg)))); + valueLow4 = rResult25; + valueHigh4 = rResult26; loadNativeArgumentAddressto(baseOffset20, TempReg); /* begin checkQuickConstant:forInstruction: */ anInstruction20 = genoperandoperandoperand(MoveM32rR, 0, TempReg, valueLow4); @@ -34416,13 +34641,13 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadArgumentUInt64 */ baseOffset21 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult28 = (rResult29 = NoReg); - rResult28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult29 = allocateRegNotConflictingWith(1U << rResult28); - assert(!(((rResult28 == NoReg) - || (rResult29 == NoReg)))); - valueLow5 = rResult28; - valueHigh5 = rResult29; + rResult27 = (rResult28 = NoReg); + rResult27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult28 = allocateRegNotConflictingWith(1U << rResult27); + assert(!(((rResult27 == NoReg) + || (rResult28 == NoReg)))); + valueLow5 = rResult27; + valueHigh5 = rResult28; loadNativeArgumentAddressto(baseOffset21, TempReg); /* begin checkQuickConstant:forInstruction: */ anInstruction28 = genoperandoperandoperand(MoveM32rR, 0, TempReg, valueLow5); @@ -34458,23 +34683,23 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 101: /* begin genLowcodeLoadFloat32FromMemory */ - rTop24 = NoReg; + rTop22 = NoReg; frResult8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop24 = nativeRegisterOrNone(ssNativeTop()); + rTop22 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop24 == NoReg) { - rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop22 == NoReg) { + rTop22 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult8 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop24 == NoReg) + assert(!(((rTop22 == NoReg) || (frResult8 == NoReg)))); - pointer3 = rTop24; + pointer2 = rTop22; value26 = frResult8; - nativePopToReg(ssNativeTop(), pointer3); + nativePopToReg(ssNativeTop(), pointer2); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction33 = genoperandoperandoperand(MoveM32rRs, 0, pointer3, value26); + anInstruction33 = genoperandoperandoperand(MoveM32rRs, 0, pointer2, value26); if (usesOutOfLineLiteral(anInstruction33)) { (anInstruction33->dependent = locateLiteral(0)); } @@ -34483,23 +34708,23 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 102: /* begin genLowcodeLoadFloat64FromMemory */ - rTop25 = NoReg; + rTop23 = NoReg; frResult9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop25 = nativeRegisterOrNone(ssNativeTop()); + rTop23 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop25 == NoReg) { - rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop23 == NoReg) { + rTop23 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult9 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop25 == NoReg) + assert(!(((rTop23 == NoReg) || (frResult9 == NoReg)))); - pointer4 = rTop25; + pointer3 = rTop23; value27 = frResult9; - nativePopToReg(ssNativeTop(), pointer4); + nativePopToReg(ssNativeTop(), pointer3); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction34 = genoperandoperandoperand(MoveM64rRd, 0, pointer4, value27); + anInstruction34 = genoperandoperandoperand(MoveM64rRd, 0, pointer3, value27); if (usesOutOfLineLiteral(anInstruction34)) { (anInstruction34->dependent = locateLiteral(0)); } @@ -34508,23 +34733,23 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 103: /* begin genLowcodeLoadInt16FromMemory */ - rTop26 = NoReg; - rResult30 = NoReg; + rTop24 = NoReg; + rResult29 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop26 = nativeRegisterOrNone(ssNativeTop()); + rTop24 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop26 == NoReg) { - rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop24 == NoReg) { + rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult30 = allocateRegNotConflictingWith(1U << rTop26); - assert(!(((rTop26 == NoReg) - || (rResult30 == NoReg)))); - pointer5 = rTop26; - value28 = rResult30; - nativePopToReg(ssNativeTop(), pointer5); + rResult29 = allocateRegNotConflictingWith(1U << rTop24); + assert(!(((rTop24 == NoReg) + || (rResult29 == NoReg)))); + pointer4 = rTop24; + value28 = rResult29; + nativePopToReg(ssNativeTop(), pointer4); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction35 = genoperandoperandoperand(MoveM16rR, 0, pointer5, value28); + anInstruction35 = genoperandoperandoperand(MoveM16rR, 0, pointer4, value28); if (usesOutOfLineLiteral(anInstruction35)) { (anInstruction35->dependent = locateLiteral(0)); } @@ -34535,23 +34760,23 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 104: /* begin genLowcodeLoadInt32FromMemory */ - rTop27 = NoReg; - rResult31 = NoReg; + rTop25 = NoReg; + rResult30 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop27 = nativeRegisterOrNone(ssNativeTop()); + rTop25 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop27 == NoReg) { - rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop25 == NoReg) { + rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult31 = allocateRegNotConflictingWith(1U << rTop27); - assert(!(((rTop27 == NoReg) - || (rResult31 == NoReg)))); - pointer6 = rTop27; - value29 = rResult31; - nativePopToReg(ssNativeTop(), pointer6); + rResult30 = allocateRegNotConflictingWith(1U << rTop25); + assert(!(((rTop25 == NoReg) + || (rResult30 == NoReg)))); + pointer5 = rTop25; + value29 = rResult30; + nativePopToReg(ssNativeTop(), pointer5); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction36 = genoperandoperandoperand(MoveM32rR, 0, pointer6, value29); + anInstruction36 = genoperandoperandoperand(MoveM32rR, 0, pointer5, value29); if (usesOutOfLineLiteral(anInstruction36)) { (anInstruction36->dependent = locateLiteral(0)); } @@ -34561,31 +34786,31 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 105: /* begin genLowcodeLoadInt64FromMemory */ /* begin allocateRegistersForLowcodeIntegerResultInteger2: */ - rTop28 = NoReg; - rResult32 = (rResult32 = NoReg); + rTop26 = NoReg; + rResult31 = (rResult31 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop28 = nativeRegisterOrNone(ssNativeTop()); + rTop26 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop28 == NoReg) { - rTop28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop26 == NoReg) { + rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult32 = allocateRegNotConflictingWith(1U << rTop28); - rResult210 = allocateRegNotConflictingWith((1U << rTop28) | (1U << rResult32)); - assert(!(((rTop28 == NoReg) - || ((rResult32 == NoReg) + rResult31 = allocateRegNotConflictingWith(1U << rTop26); + rResult210 = allocateRegNotConflictingWith((1U << rTop26) | (1U << rResult31)); + assert(!(((rTop26 == NoReg) + || ((rResult31 == NoReg) || (rResult210 == NoReg))))); - pointer7 = rTop28; - valueLow6 = rResult32; + pointer6 = rTop26; + valueLow6 = rResult31; valueHigh6 = rResult210; - nativePopToReg(ssNativeTop(), pointer7); + nativePopToReg(ssNativeTop(), pointer6); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction37 = genoperandoperandoperand(MoveM32rR, 0, pointer7, valueLow6); + anInstruction37 = genoperandoperandoperand(MoveM32rR, 0, pointer6, valueLow6); if (usesOutOfLineLiteral(anInstruction37)) { (anInstruction37->dependent = locateLiteral(0)); } /* begin checkQuickConstant:forInstruction: */ - anInstruction112 = genoperandoperandoperand(MoveM32rR, 4, pointer7, valueHigh6); + anInstruction112 = genoperandoperandoperand(MoveM32rR, 4, pointer6, valueHigh6); if (usesOutOfLineLiteral(anInstruction112)) { (anInstruction112->dependent = locateLiteral(4)); } @@ -34594,23 +34819,23 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 106: /* begin genLowcodeLoadInt8FromMemory */ - rTop29 = NoReg; - rResult33 = NoReg; + rTop27 = NoReg; + rResult32 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop29 = nativeRegisterOrNone(ssNativeTop()); + rTop27 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop29 == NoReg) { - rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop27 == NoReg) { + rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult33 = allocateRegNotConflictingWith(1U << rTop29); - assert(!(((rTop29 == NoReg) - || (rResult33 == NoReg)))); - pointer8 = rTop29; - value31 = rResult33; - nativePopToReg(ssNativeTop(), pointer8); + rResult32 = allocateRegNotConflictingWith(1U << rTop27); + assert(!(((rTop27 == NoReg) + || (rResult32 == NoReg)))); + pointer7 = rTop27; + value31 = rResult32; + nativePopToReg(ssNativeTop(), pointer7); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction38 = genoperandoperandoperand(MoveM8rR, 0, pointer8, value31); + anInstruction38 = genoperandoperandoperand(MoveM8rR, 0, pointer7, value31); if (usesOutOfLineLiteral(anInstruction38)) { (anInstruction38->dependent = locateLiteral(0)); } @@ -34710,12 +34935,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadLocalInt64 */ baseOffset22 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult34 = (rResult211 = NoReg); - rResult34 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult211 = allocateRegNotConflictingWith(1U << rResult34); - assert(!(((rResult34 == NoReg) + rResult33 = (rResult211 = NoReg); + rResult33 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult211 = allocateRegNotConflictingWith(1U << rResult33); + assert(!(((rResult33 == NoReg) || (rResult211 == NoReg)))); - valueLow7 = rResult34; + valueLow7 = rResult33; valueHigh7 = rResult211; loadNativeLocalAddressto(baseOffset22, TempReg); /* begin checkQuickConstant:forInstruction: */ @@ -34810,12 +35035,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadLocalUInt64 */ baseOffset23 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult35 = (rResult212 = NoReg); - rResult35 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult212 = allocateRegNotConflictingWith(1U << rResult35); - assert(!(((rResult35 == NoReg) + rResult34 = (rResult212 = NoReg); + rResult34 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult212 = allocateRegNotConflictingWith(1U << rResult34); + assert(!(((rResult34 == NoReg) || (rResult212 == NoReg)))); - valueLow8 = rResult35; + valueLow8 = rResult34; valueHigh8 = rResult212; loadNativeLocalAddressto(baseOffset23, TempReg); /* begin checkQuickConstant:forInstruction: */ @@ -34852,31 +35077,31 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 119: /* begin genLowcodeLoadObjectAt */ - rTop30 = (rOopTop3 = NoReg); - topRegisterMask1 = 0; + rTop28 = (rOopTop = NoReg); + topRegisterMask = 0; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop30 = nativeRegisterOrNone(ssNativeTop()); + rTop28 = nativeRegisterOrNone(ssNativeTop()); } if ((registerOrNone(ssTop())) != NoReg) { - rOopTop3 = registerOrNone(ssTop()); + rOopTop = registerOrNone(ssTop()); /* begin registerMaskFor: */ - topRegisterMask1 = 1U << rOopTop3; + topRegisterMask = 1U << rOopTop; } - if (rTop30 == NoReg) { - rTop30 = allocateRegNotConflictingWith(topRegisterMask1); + if (rTop28 == NoReg) { + rTop28 = allocateRegNotConflictingWith(topRegisterMask); } - if (rOopTop3 == NoReg) { - rOopTop3 = allocateRegNotConflictingWith(1U << rTop30); + if (rOopTop == NoReg) { + rOopTop = allocateRegNotConflictingWith(1U << rTop28); } - assert(!(((rTop30 == NoReg) - || (rOopTop3 == NoReg)))); - fieldIndex = rTop30; - object2 = rOopTop3; + assert(!(((rTop28 == NoReg) + || (rOopTop == NoReg)))); + fieldIndex = rTop28; + object = rOopTop; nativePopToReg(ssNativeTop(), fieldIndex); ssNativePop(1); - popToReg(ssTop(), object2); + popToReg(ssTop(), object); ssPop(1); - genLcLoadObjectat(object2, fieldIndex); + genLcLoadObjectat(object, fieldIndex); return 0; default: @@ -34895,7 +35120,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; - AbstractInstruction *abstractInstruction12; + AbstractInstruction *abstractInstruction11; AbstractInstruction *abstractInstruction2; AbstractInstruction *abstractInstruction3; AbstractInstruction *abstractInstruction4; @@ -34948,6 +35173,12 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt frTop; sqInt frTop1; sqInt i1; + sqInt i2; + sqInt i3; + sqInt i4; + sqInt i5; + sqInt i6; + sqInt i7; sqInt index1; sqInt nativeValueIndex; sqInt nativeValueIndex1; @@ -34976,10 +35207,11 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt pointer7; sqInt pointer8; sqInt pointerResult; - sqInt pointerValue9; + sqInt pointerValue7; sqInt quickConstant; sqInt reg; sqInt reg1; + sqInt reg10; sqInt reg11; sqInt reg13; sqInt reg14; @@ -34989,7 +35221,6 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt reg3; sqInt reg4; sqInt reg5; - sqInt reg6; sqInt reg7; sqInt reg9; sqInt registerID; @@ -35004,7 +35235,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt rNext; sqInt rNext1; sqInt rNext10; - sqInt rNext12; + sqInt rNext13; sqInt rNext14; sqInt rNext15; sqInt rNext2; @@ -35036,9 +35267,8 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt rTop; sqInt rTop1; sqInt rTop10; - sqInt rTop13; sqInt rTop14; - sqInt rTop15; + sqInt rTop16; sqInt rTop17; sqInt rTop18; sqInt rTop2; @@ -35055,6 +35285,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt rTop3; sqInt rTop30; sqInt rTop31; + sqInt rTop32; sqInt rTop4; sqInt rTop5; sqInt rTop6; @@ -35088,9 +35319,9 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt topRegistersMask2; sqInt topRegistersMask3; sqInt topRegistersMask4; - sqInt topRegistersMask5; sqInt topRegistersMask6; sqInt topRegistersMask8; + sqInt topRegistersMask9; sqInt value; sqInt value1; sqInt value10; @@ -35343,7 +35574,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 0x7F: /* begin genLowcodeLockRegisters */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); return 0; @@ -35354,139 +35593,155 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 129: /* begin genLowcodeMalloc32 */ - rTop5 = NoReg; - rResult5 = NoReg; + rTop28 = NoReg; + rResult8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop28 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop28 == NoReg) { + rTop28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult5 = allocateRegNotConflictingWith(1U << rTop5); - assert(!(((rTop5 == NoReg) - || (rResult5 == NoReg)))); - size1 = rTop5; - pointer5 = rResult5; + rResult8 = allocateRegNotConflictingWith(1U << rTop28); + assert(!(((rTop28 == NoReg) + || (rResult8 == NoReg)))); + size1 = rTop28; + pointer7 = rResult8; nativePopToReg(ssNativeTop(), size1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 <= simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); if (size1 != ReceiverResultReg) { /* begin MoveR:R: */ genoperandoperand(MoveRR, size1, ReceiverResultReg); } /* begin CallRT: */ - abstractInstruction2 = genoperand(Call, ceMallocTrampoline); - (abstractInstruction2->annotation = IsRelativeCall); + abstractInstruction3 = genoperand(Call, ceMallocTrampoline); + (abstractInstruction3->annotation = IsRelativeCall); /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, pointer5); - ssPushNativeRegister(pointer5); + genoperandoperand(MoveRR, TempReg, pointer7); + ssPushNativeRegister(pointer7); return 0; case 130: /* begin genLowcodeMalloc64 */ /* begin allocateRegistersForLowcodeInteger2ResultInteger: */ - topRegistersMask = 0; - rTop6 = (rNext = NoReg); - rResult6 = NoReg; + topRegistersMask12 = 0; + rTop29 = (rNext10 = NoReg); + rResult9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop29 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext = nativeRegisterSecondOrNone(ssNativeTop()); + rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext == NoReg) { + if (rNext10 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg = (rNext = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask = 1U << reg; + reg15 = (rNext10 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask12 = 1U << reg15; } } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(topRegistersMask); + if (rTop29 == NoReg) { + rTop29 = allocateRegNotConflictingWith(topRegistersMask12); } - if (rNext == NoReg) { - rNext = allocateRegNotConflictingWith(1U << rTop6); + if (rNext10 == NoReg) { + rNext10 = allocateRegNotConflictingWith(1U << rTop29); } - assert(!(((rTop6 == NoReg) - || (rNext == NoReg)))); - rResult6 = allocateFloatRegNotConflictingWith((1U << rTop6) | (1U << rNext)); - assert(!((rResult6 == NoReg))); - sizeLow = rTop6; - sizeHigh = rNext; - pointer6 = rResult6; + assert(!(((rTop29 == NoReg) + || (rNext10 == NoReg)))); + rResult9 = allocateFloatRegNotConflictingWith((1U << rTop29) | (1U << rNext10)); + assert(!((rResult9 == NoReg))); + sizeLow = rTop29; + sizeHigh = rNext10; + pointer8 = rResult9; nativePopToRegsecondReg(ssNativeTop(), sizeLow, sizeHigh); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 <= simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); if (sizeLow != ReceiverResultReg) { /* begin MoveR:R: */ genoperandoperand(MoveRR, sizeLow, ReceiverResultReg); } /* begin CallRT: */ - abstractInstruction3 = genoperand(Call, ceMallocTrampoline); - (abstractInstruction3->annotation = IsRelativeCall); + abstractInstruction4 = genoperand(Call, ceMallocTrampoline); + (abstractInstruction4->annotation = IsRelativeCall); /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, pointer6); - ssPushNativeRegister(pointer6); + genoperandoperand(MoveRR, TempReg, pointer8); + ssPushNativeRegister(pointer8); return 0; case 131: /* begin genLowcodeMemcpy32 */ - rTop7 = (rNext1 = (rNextNext = NoReg)); - nativeValueIndex = 1; + rTop30 = (rNext13 = (rNextNext2 = NoReg)); + nativeValueIndex2 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop30 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext13 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext1 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNextNext = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex)); + if (rNext13 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNext13 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNextNext2 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2)); } - nativeValueIndex += 1; + nativeValueIndex2 += 1; } } - if (rNextNext == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + if (rNextNext2 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNextNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); } } - if (rTop7 == NoReg) { - nextRegisterMask = 0; - if (rNext1 != NoReg) { + if (rTop30 == NoReg) { + nextRegisterMask2 = 0; + if (rNext13 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1U << rNext1; + nextRegisterMask2 = 1U << rNext13; } - if (rNextNext != NoReg) { - nextRegisterMask = nextRegisterMask | (1U << rNextNext); + if (rNextNext2 != NoReg) { + nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); } - rTop7 = allocateRegNotConflictingWith(nextRegisterMask); + rTop30 = allocateRegNotConflictingWith(nextRegisterMask2); } - if (rNext1 == NoReg) { + if (rNext13 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1U << rTop7; - if (rNextNext != NoReg) { - nextRegisterMask = nextRegisterMask | (1U << rNextNext); + nextRegisterMask2 = 1U << rTop30; + if (rNextNext2 != NoReg) { + nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); } - rNext1 = allocateRegNotConflictingWith(nextRegisterMask); + rNext13 = allocateRegNotConflictingWith(nextRegisterMask2); } - if (rNextNext == NoReg) { + if (rNextNext2 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask = (1U << rTop7) | (1U << rNext1); - rNextNext = allocateRegNotConflictingWith(nextRegisterMask); + nextRegisterMask2 = (1U << rTop30) | (1U << rNext13); + rNextNext2 = allocateRegNotConflictingWith(nextRegisterMask2); } - assert(!(((rTop7 == NoReg) - || ((rNext1 == NoReg) - || (rNextNext == NoReg))))); - size3 = rTop7; - source = rNext1; - dest = rNextNext; + assert(!(((rTop30 == NoReg) + || ((rNext13 == NoReg) + || (rNextNext2 == NoReg))))); + size3 = rTop30; + source = rNext13; + dest = rNextNext2; nativePopToReg(ssNativeTop(), size3); ssNativePop(1); nativePopToReg(ssNativeTop(), source); @@ -35494,65 +35749,73 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) nativePopToReg(ssNativeTop(), dest); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i5 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i5 <= simStackPtr; i5 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i5), frameOffsetOfTemporary(i5 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytosize(backEnd, source, dest, size3); return 0; case 132: /* begin genLowcodeMemcpy64 */ - rTop8 = (rNext2 = (rNextNext1 = NoReg)); - nativeValueIndex1 = 1; + rTop31 = (rNext14 = (rNextNext3 = NoReg)); + nativeValueIndex3 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop8 = nativeRegisterOrNone(ssNativeTop()); + rTop31 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext2 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNextNext1 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1)); + if (rNext14 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNext14 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNextNext3 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3)); } - nativeValueIndex1 += 1; + nativeValueIndex3 += 1; } } - if (rNextNext1 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNextNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); + if (rNextNext3 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNextNext3 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); } } - if (rTop8 == NoReg) { - nextRegisterMask1 = 0; - if (rNext2 != NoReg) { + if (rTop31 == NoReg) { + nextRegisterMask3 = 0; + if (rNext14 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1U << rNext2; + nextRegisterMask3 = 1U << rNext14; } - if (rNextNext1 != NoReg) { - nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); + if (rNextNext3 != NoReg) { + nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); } - rTop8 = allocateRegNotConflictingWith(nextRegisterMask1); + rTop31 = allocateRegNotConflictingWith(nextRegisterMask3); } - if (rNext2 == NoReg) { + if (rNext14 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1U << rTop8; - if (rNextNext1 != NoReg) { - nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); + nextRegisterMask3 = 1U << rTop31; + if (rNextNext3 != NoReg) { + nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); } - rNext2 = allocateRegNotConflictingWith(nextRegisterMask1); + rNext14 = allocateRegNotConflictingWith(nextRegisterMask3); } - if (rNextNext1 == NoReg) { + if (rNextNext3 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask1 = (1U << rTop8) | (1U << rNext2); - rNextNext1 = allocateRegNotConflictingWith(nextRegisterMask1); + nextRegisterMask3 = (1U << rTop31) | (1U << rNext14); + rNextNext3 = allocateRegNotConflictingWith(nextRegisterMask3); } - assert(!(((rTop8 == NoReg) - || ((rNext2 == NoReg) - || (rNextNext1 == NoReg))))); - size4 = rTop8; - source1 = rNext2; - dest1 = rNextNext1; + assert(!(((rTop31 == NoReg) + || ((rNext14 == NoReg) + || (rNextNext3 == NoReg))))); + size4 = rTop31; + source1 = rNext14; + dest1 = rNextNext3; nativePopToReg(ssNativeTop(), size4); ssNativePop(1); nativePopToReg(ssNativeTop(), source1); @@ -35560,7 +35823,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) nativePopToReg(ssNativeTop(), dest1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i6 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i6 <= simStackPtr; i6 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i6), frameOffsetOfTemporary(i6 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytosize(backEnd, source1, dest1, sizeLow1); return 0; @@ -35569,50 +35840,58 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodeMemcpyFixed */ size5 = extA; /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask1 = 0; - rTop9 = (rNext3 = NoReg); + topRegistersMask13 = 0; + rTop32 = (rNext15 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop9 = nativeRegisterOrNone(ssNativeTop()); + rTop32 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext3 == NoReg) { + if (rNext15 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg2 = (rNext3 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask1 = 1U << reg2; + reg16 = (rNext15 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask13 = 1U << reg16; } } - if (rTop9 == NoReg) { - rTop9 = allocateRegNotConflictingWith(topRegistersMask1); + if (rTop32 == NoReg) { + rTop32 = allocateRegNotConflictingWith(topRegistersMask13); } - if (rNext3 == NoReg) { - rNext3 = allocateRegNotConflictingWith(1U << rTop9); + if (rNext15 == NoReg) { + rNext15 = allocateRegNotConflictingWith(1U << rTop32); } - assert(!(((rTop9 == NoReg) - || (rNext3 == NoReg)))); - source2 = rTop9; - dest2 = rNext3; + assert(!(((rTop32 == NoReg) + || (rNext15 == NoReg)))); + source2 = rTop32; + dest2 = rNext15; nativePopToReg(ssNativeTop(), source2); ssNativePop(1); nativePopToReg(ssNativeTop(), dest2); ssNativePop(1); if (size5 == BytesPerWord) { /* begin checkQuickConstant:forInstruction: */ - anInstruction8 = genoperandoperandoperand(MoveMwrR, 0, source2, TempReg); - if (usesOutOfLineLiteral(anInstruction8)) { - (anInstruction8->dependent = locateLiteral(0)); + anInstruction19 = genoperandoperandoperand(MoveMwrR, 0, source2, TempReg); + if (usesOutOfLineLiteral(anInstruction19)) { + (anInstruction19->dependent = locateLiteral(0)); } /* begin checkQuickConstant:forInstruction: */ - anInstruction13 = genoperandoperandoperand(MoveRMwr, TempReg, 0, dest2); - if (usesOutOfLineLiteral(anInstruction13)) { - (anInstruction13->dependent = locateLiteral(0)); + anInstruction18 = genoperandoperandoperand(MoveRMwr, TempReg, 0, dest2); + if (usesOutOfLineLiteral(anInstruction18)) { + (anInstruction18->dependent = locateLiteral(0)); } } else { /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i7 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i7 <= simStackPtr; i7 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i7), frameOffsetOfTemporary(i7 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytoconstantSize(backEnd, source2, dest2, size5); } @@ -35661,31 +35940,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 139: /* begin genLowcodeMul32 */ - topRegistersMask2 = 0; - rTop10 = (rNext4 = NoReg); + topRegistersMask = 0; + rTop5 = (rNext = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop10 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext4 == NoReg) { + if (rNext == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg3 = (rNext4 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask2 = 1U << reg3; + reg = (rNext = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask = 1U << reg; } } - if (rTop10 == NoReg) { - rTop10 = allocateRegNotConflictingWith(topRegistersMask2); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(topRegistersMask); } - if (rNext4 == NoReg) { - rNext4 = allocateRegNotConflictingWith(1U << rTop10); + if (rNext == NoReg) { + rNext = allocateRegNotConflictingWith(1U << rTop5); } - assert(!(((rTop10 == NoReg) - || (rNext4 == NoReg)))); - second = rTop10; - first = rNext4; + assert(!(((rTop5 == NoReg) + || (rNext == NoReg)))); + second = rTop5; + first = rNext; nativePopToReg(ssNativeTop(), second); ssNativePop(1); nativePopToReg(ssNativeTop(), first); @@ -35697,35 +35976,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 140: /* begin genLowcodeMul64 */ - topRegistersMask3 = 0; - rTop13 = (rNext5 = NoReg); - rResult7 = NoReg; + topRegistersMask1 = 0; + rTop6 = (rNext1 = NoReg); + rResult5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop13 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext5 == NoReg) { + if (rNext1 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg4 = (rNext5 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask3 = 1U << reg4; + reg2 = (rNext1 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask1 = 1U << reg2; } } - if (rTop13 == NoReg) { - rTop13 = allocateRegNotConflictingWith(topRegistersMask3); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(topRegistersMask1); } - if (rNext5 == NoReg) { - rNext5 = allocateRegNotConflictingWith(1U << rTop13); + if (rNext1 == NoReg) { + rNext1 = allocateRegNotConflictingWith(1U << rTop6); } - assert(!(((rTop13 == NoReg) - || (rNext5 == NoReg)))); - rResult7 = allocateFloatRegNotConflictingWith((1U << rTop13) | (1U << rNext5)); - assert(!((rResult7 == NoReg))); - second1 = rTop13; - first1 = rNext5; - result = rResult7; + assert(!(((rTop6 == NoReg) + || (rNext1 == NoReg)))); + rResult5 = allocateFloatRegNotConflictingWith((1U << rTop6) | (1U << rNext1)); + assert(!((rResult5 == NoReg))); + second1 = rTop6; + first1 = rNext1; + result = rResult5; nativePopToReg(ssNativeTop(), second1); ssNativePop(1); nativePopToReg(ssNativeTop(), first1); @@ -35735,15 +36014,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 141: /* begin genLowcodeNeg32 */ - rTop14 = NoReg; + rTop7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop14 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop14 == NoReg) { - rTop14 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop14 == NoReg))); - value4 = rTop14; + assert(!((rTop7 == NoReg))); + value4 = rTop7; nativePopToReg(ssNativeTop(), value4); ssNativePop(1); /* begin NegateR: */ @@ -35754,31 +36033,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 142: /* begin genLowcodeNeg64 */ /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask4 = 0; - rTop15 = (rNext6 = NoReg); + topRegistersMask2 = 0; + rTop8 = (rNext2 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop15 = nativeRegisterOrNone(ssNativeTop()); + rTop8 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext6 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext6 == NoReg) { + if (rNext2 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg5 = (rNext6 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask4 = 1U << reg5; + reg3 = (rNext2 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask2 = 1U << reg3; } } - if (rTop15 == NoReg) { - rTop15 = allocateRegNotConflictingWith(topRegistersMask4); + if (rTop8 == NoReg) { + rTop8 = allocateRegNotConflictingWith(topRegistersMask2); } - if (rNext6 == NoReg) { - rNext6 = allocateRegNotConflictingWith(1U << rTop15); + if (rNext2 == NoReg) { + rNext2 = allocateRegNotConflictingWith(1U << rTop8); } - assert(!(((rTop15 == NoReg) - || (rNext6 == NoReg)))); - valueLow1 = rTop15; - valueHigh1 = rNext6; + assert(!(((rTop8 == NoReg) + || (rNext2 == NoReg)))); + valueLow1 = rTop8; + valueHigh1 = rNext2; nativePopToRegsecondReg(ssNativeTop(), valueLow1, valueHigh1); ssNativePop(1); /* begin NotR: */ @@ -35786,29 +36065,29 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin NotR: */ genoperand(NotR, valueHigh1); /* begin checkQuickConstant:forInstruction: */ - anInstruction9 = genoperandoperand(AddCqR, 1, valueLow1); - if (usesOutOfLineLiteral(anInstruction9)) { - (anInstruction9->dependent = locateLiteral(1)); + anInstruction8 = genoperandoperand(AddCqR, 1, valueLow1); + if (usesOutOfLineLiteral(anInstruction8)) { + (anInstruction8->dependent = locateLiteral(1)); } /* begin checkQuickConstant:forInstruction: */ - anInstruction14 = genoperandoperand(AddcCqR, 0, valueHigh1); - if (usesOutOfLineLiteral(anInstruction14)) { - (anInstruction14->dependent = locateLiteral(0)); + anInstruction13 = genoperandoperand(AddcCqR, 0, valueHigh1); + if (usesOutOfLineLiteral(anInstruction13)) { + (anInstruction13->dependent = locateLiteral(0)); } ssPushNativeRegistersecondRegister(valueLow1, valueHigh1); return 0; case 143: /* begin genLowcodeNot32 */ - rTop17 = NoReg; + rTop9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop17 = nativeRegisterOrNone(ssNativeTop()); + rTop9 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop17 == NoReg) { - rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop9 == NoReg) { + rTop9 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop17 == NoReg))); - value6 = rTop17; + assert(!((rTop9 == NoReg))); + value6 = rTop9; nativePopToReg(ssNativeTop(), value6); ssNativePop(1); /* begin NotR: */ @@ -35819,31 +36098,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 144: /* begin genLowcodeNot64 */ /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask5 = 0; - rTop18 = (rNext7 = NoReg); + topRegistersMask3 = 0; + rTop10 = (rNext3 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop18 = nativeRegisterOrNone(ssNativeTop()); + rTop10 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext7 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext7 == NoReg) { + if (rNext3 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg6 = (rNext7 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask5 = 1U << reg6; + reg4 = (rNext3 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask3 = 1U << reg4; } } - if (rTop18 == NoReg) { - rTop18 = allocateRegNotConflictingWith(topRegistersMask5); + if (rTop10 == NoReg) { + rTop10 = allocateRegNotConflictingWith(topRegistersMask3); } - if (rNext7 == NoReg) { - rNext7 = allocateRegNotConflictingWith(1U << rTop18); + if (rNext3 == NoReg) { + rNext3 = allocateRegNotConflictingWith(1U << rTop10); } - assert(!(((rTop18 == NoReg) - || (rNext7 == NoReg)))); - valueLow2 = rTop18; - valueHigh2 = rNext7; + assert(!(((rTop10 == NoReg) + || (rNext3 == NoReg)))); + valueLow2 = rTop10; + valueHigh2 = rNext3; nativePopToRegsecondReg(ssNativeTop(), valueLow2, valueHigh2); ssNativePop(1); /* begin NotR: */ @@ -35855,35 +36134,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 145: /* begin genLowcodeOr32 */ - topRegistersMask6 = 0; - rTop20 = (rNext8 = NoReg); - rResult8 = NoReg; + topRegistersMask4 = 0; + rTop14 = (rNext4 = NoReg); + rResult6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop20 = nativeRegisterOrNone(ssNativeTop()); + rTop14 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext8 == NoReg) { + if (rNext4 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg7 = (rNext8 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask6 = 1U << reg7; + reg5 = (rNext4 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask4 = 1U << reg5; } } - if (rTop20 == NoReg) { - rTop20 = allocateRegNotConflictingWith(topRegistersMask6); + if (rTop14 == NoReg) { + rTop14 = allocateRegNotConflictingWith(topRegistersMask4); } - if (rNext8 == NoReg) { - rNext8 = allocateRegNotConflictingWith(1U << rTop20); + if (rNext4 == NoReg) { + rNext4 = allocateRegNotConflictingWith(1U << rTop14); } - assert(!(((rTop20 == NoReg) - || (rNext8 == NoReg)))); - rResult8 = allocateFloatRegNotConflictingWith((1U << rTop20) | (1U << rNext8)); - assert(!((rResult8 == NoReg))); - second2 = rTop20; - first2 = rNext8; - result1 = rResult8; + assert(!(((rTop14 == NoReg) + || (rNext4 == NoReg)))); + rResult6 = allocateFloatRegNotConflictingWith((1U << rTop14) | (1U << rNext4)); + assert(!((rResult6 == NoReg))); + second2 = rTop14; + first2 = rNext4; + result1 = rResult6; nativePopToReg(ssNativeTop(), second2); ssNativePop(1); nativePopToReg(ssNativeTop(), first2); @@ -35896,83 +36175,83 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 146: /* begin genLowcodeOr64 */ /* begin allocateRegistersForLowcodeInteger4: */ - rTop21 = (rNext9 = (rNextNext2 = (rNextNextNext = NoReg))); - nativeValueIndex2 = 1; + rTop16 = (rNext5 = (rNextNext = (rNextNextNext = NoReg))); + nativeValueIndex = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop21 = nativeRegisterOrNone(ssNativeTop()); + rTop16 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext9 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNext9 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); + if (rNext5 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNext5 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); } - nativeValueIndex2 += 1; + nativeValueIndex += 1; } } - if (rNextNext2 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNextNext = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2)); + if (rNextNext == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNextNext = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex)); } - nativeValueIndex2 += 1; + nativeValueIndex += 1; } } if (rNextNextNext == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); - nativeValueIndex2 += 1; + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + nativeValueIndex += 1; } } - if (rTop21 == NoReg) { - nextRegisterMask2 = 0; - if (rNext9 != NoReg) { + if (rTop16 == NoReg) { + nextRegisterMask = 0; + if (rNext5 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask2 = 1U << rNext9; + nextRegisterMask = 1U << rNext5; } - if (rNextNext2 != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); + if (rNextNext != NoReg) { + nextRegisterMask = nextRegisterMask | (1U << rNextNext); } if (rNextNextNext != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNextNext); + nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rTop21 = allocateRegNotConflictingWith(nextRegisterMask2); + rTop16 = allocateRegNotConflictingWith(nextRegisterMask); } - if (rNext9 == NoReg) { + if (rNext5 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask2 = 1U << rTop21; - if (rNextNext2 != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); + nextRegisterMask = 1U << rTop16; + if (rNextNext != NoReg) { + nextRegisterMask = nextRegisterMask | (1U << rNextNext); } if (rNextNextNext != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNextNext); + nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rNext9 = allocateRegNotConflictingWith(nextRegisterMask2); + rNext5 = allocateRegNotConflictingWith(nextRegisterMask); } - if (rNextNext2 == NoReg) { + if (rNextNext == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask2 = (1U << rTop21) | (1U << rNext9); + nextRegisterMask = (1U << rTop16) | (1U << rNext5); if (rNextNextNext != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNextNext); + nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rNextNext2 = allocateRegNotConflictingWith(nextRegisterMask2); + rNextNext = allocateRegNotConflictingWith(nextRegisterMask); } if (rNextNextNext == NoReg) { /* begin registerMaskFor:and:and: */ - nextRegisterMask2 = ((1U << rTop21) | (1U << rNext9)) | (1U << rNextNext2); - rNextNextNext = allocateRegNotConflictingWith(nextRegisterMask2); + nextRegisterMask = ((1U << rTop16) | (1U << rNext5)) | (1U << rNextNext); + rNextNextNext = allocateRegNotConflictingWith(nextRegisterMask); } - assert(!(((rTop21 == NoReg) - || ((rNext9 == NoReg) - || ((rNextNext2 == NoReg) + assert(!(((rTop16 == NoReg) + || ((rNext5 == NoReg) + || ((rNextNext == NoReg) || (rNextNextNext == NoReg)))))); - secondLow1 = rTop21; - secondHigh1 = rNext9; - firstLow1 = rNextNext2; + secondLow1 = rTop16; + secondHigh1 = rNext5; + firstLow1 = rNextNext; firstHigh1 = rNextNextNext; nativePopToRegsecondReg(ssNativeTop(), secondLow1, secondHigh1); ssNativePop(1); @@ -36005,11 +36284,11 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) ssNativePop(1); callSwitchToCStack(); /* begin CallRT: */ - abstractInstruction4 = genoperand(Call, ceFFICalloutTrampoline); - (abstractInstruction4->annotation = IsRelativeCall); + abstractInstruction2 = genoperand(Call, ceFFICalloutTrampoline); + (abstractInstruction2->annotation = IsRelativeCall); /* begin annotateBytecode: */ - abstractInstruction12 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); - (abstractInstruction12->annotation = HasBytecodePC); + abstractInstruction11 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); + (abstractInstruction11->annotation = HasBytecodePC); return 0; case 149: @@ -36058,21 +36337,21 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodePointerAddConstantOffset */ offset4 = extB; /* begin allocateRegistersForLowcodeInteger: */ - rTop22 = NoReg; + rTop17 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop22 = nativeRegisterOrNone(ssNativeTop()); + rTop17 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop22 == NoReg) { - rTop22 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop17 == NoReg) { + rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop22 == NoReg))); - base = rTop22; + assert(!((rTop17 == NoReg))); + base = rTop17; nativePopToReg(ssNativeTop(), base); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction10 = genoperandoperand(AddCqR, offset4, base); - if (usesOutOfLineLiteral(anInstruction10)) { - (anInstruction10->dependent = locateLiteral(offset4)); + anInstruction9 = genoperandoperand(AddCqR, offset4, base); + if (usesOutOfLineLiteral(anInstruction9)) { + (anInstruction9->dependent = locateLiteral(offset4)); } ssPushNativeRegister(base); extB = 0; @@ -36081,31 +36360,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 163: /* begin genLowcodePointerAddOffset32 */ - topRegistersMask8 = 0; - rTop23 = (rNext10 = NoReg); + topRegistersMask6 = 0; + rTop18 = (rNext6 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop23 = nativeRegisterOrNone(ssNativeTop()); + rTop18 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext6 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext10 == NoReg) { + if (rNext6 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg9 = (rNext10 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask8 = 1U << reg9; + reg7 = (rNext6 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask6 = 1U << reg7; } } - if (rTop23 == NoReg) { - rTop23 = allocateRegNotConflictingWith(topRegistersMask8); + if (rTop18 == NoReg) { + rTop18 = allocateRegNotConflictingWith(topRegistersMask6); } - if (rNext10 == NoReg) { - rNext10 = allocateRegNotConflictingWith(1U << rTop23); + if (rNext6 == NoReg) { + rNext6 = allocateRegNotConflictingWith(1U << rTop18); } - assert(!(((rTop23 == NoReg) - || (rNext10 == NoReg)))); - offset5 = rTop23; - base1 = rNext10; + assert(!(((rTop18 == NoReg) + || (rNext6 == NoReg)))); + offset5 = rTop18; + base1 = rNext6; nativePopToReg(ssNativeTop(), offset5); ssNativePop(1); nativePopToReg(ssNativeTop(), base1); @@ -36118,58 +36397,58 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 164: /* begin genLowcodePointerAddOffset64 */ /* begin allocateRegistersForLowcodeInteger3: */ - rTop24 = (rNext12 = (rNextNext3 = NoReg)); - nativeValueIndex3 = 1; + rTop20 = (rNext7 = (rNextNext1 = NoReg)); + nativeValueIndex1 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop24 = nativeRegisterOrNone(ssNativeTop()); + rTop20 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext12 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext7 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext12 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { - rNext12 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { - rNextNext3 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3)); + if (rNext7 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { + rNext7 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { + rNextNext1 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1)); } - nativeValueIndex3 += 1; + nativeValueIndex1 += 1; } } - if (rNextNext3 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { - rNextNext3 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); + if (rNextNext1 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { + rNextNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); } } - if (rTop24 == NoReg) { - nextRegisterMask3 = 0; - if (rNext12 != NoReg) { + if (rTop20 == NoReg) { + nextRegisterMask1 = 0; + if (rNext7 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask3 = 1U << rNext12; + nextRegisterMask1 = 1U << rNext7; } - if (rNextNext3 != NoReg) { - nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); + if (rNextNext1 != NoReg) { + nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); } - rTop24 = allocateRegNotConflictingWith(nextRegisterMask3); + rTop20 = allocateRegNotConflictingWith(nextRegisterMask1); } - if (rNext12 == NoReg) { + if (rNext7 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask3 = 1U << rTop24; - if (rNextNext3 != NoReg) { - nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); + nextRegisterMask1 = 1U << rTop20; + if (rNextNext1 != NoReg) { + nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); } - rNext12 = allocateRegNotConflictingWith(nextRegisterMask3); + rNext7 = allocateRegNotConflictingWith(nextRegisterMask1); } - if (rNextNext3 == NoReg) { + if (rNextNext1 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask3 = (1U << rTop24) | (1U << rNext12); - rNextNext3 = allocateRegNotConflictingWith(nextRegisterMask3); + nextRegisterMask1 = (1U << rTop20) | (1U << rNext7); + rNextNext1 = allocateRegNotConflictingWith(nextRegisterMask1); } - assert(!(((rTop24 == NoReg) - || ((rNext12 == NoReg) - || (rNextNext3 == NoReg))))); - offsetLow = rTop24; - offsetHigh = rNext12; - base2 = rNextNext3; + assert(!(((rTop20 == NoReg) + || ((rNext7 == NoReg) + || (rNextNext1 == NoReg))))); + offsetLow = rTop20; + offsetHigh = rNext7; + base2 = rNextNext1; nativePopToRegsecondReg(ssNativeTop(), offsetLow, offsetHigh); ssNativePop(1); nativePopToReg(ssNativeTop(), base2); @@ -36181,31 +36460,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 165: /* begin genLowcodePointerEqual */ - topRegistersMask10 = 0; - rTop25 = (rNext14 = NoReg); + topRegistersMask8 = 0; + rTop21 = (rNext8 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop25 = nativeRegisterOrNone(ssNativeTop()); + rTop21 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext14 == NoReg) { + if (rNext8 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg15 = (rNext14 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask10 = 1U << reg15; + reg9 = (rNext8 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask8 = 1U << reg9; } } - if (rTop25 == NoReg) { - rTop25 = allocateRegNotConflictingWith(topRegistersMask10); + if (rTop21 == NoReg) { + rTop21 = allocateRegNotConflictingWith(topRegistersMask8); } - if (rNext14 == NoReg) { - rNext14 = allocateRegNotConflictingWith(1U << rTop25); + if (rNext8 == NoReg) { + rNext8 = allocateRegNotConflictingWith(1U << rTop21); } - assert(!(((rTop25 == NoReg) - || (rNext14 == NoReg)))); - second4 = rTop25; - first4 = rNext14; + assert(!(((rTop21 == NoReg) + || (rNext8 == NoReg)))); + second4 = rTop21; + first4 = rNext8; nativePopToReg(ssNativeTop(), second4); ssNativePop(1); nativePopToReg(ssNativeTop(), first4); @@ -36215,17 +36494,17 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin JumpNonZero: */ falseJump = genConditionalBranchoperand(JumpNonZero, ((sqInt)0)); /* begin checkQuickConstant:forInstruction: */ - anInstruction16 = genoperandoperand(MoveCqR, 1, first4); - if (usesOutOfLineLiteral(anInstruction16)) { - (anInstruction16->dependent = locateLiteral(1)); + anInstruction10 = genoperandoperand(MoveCqR, 1, first4); + if (usesOutOfLineLiteral(anInstruction10)) { + (anInstruction10->dependent = locateLiteral(1)); } /* begin Jump: */ contJump = genoperand(Jump, ((sqInt)0)); jmpTarget(falseJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); /* begin checkQuickConstant:forInstruction: */ - anInstruction15 = genoperandoperand(MoveCqR, 0, first4); - if (usesOutOfLineLiteral(anInstruction15)) { - (anInstruction15->dependent = locateLiteral(0)); + anInstruction14 = genoperandoperand(MoveCqR, 0, first4); + if (usesOutOfLineLiteral(anInstruction14)) { + (anInstruction14->dependent = locateLiteral(0)); } jmpTarget(contJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); ssPushNativeRegister(first4); @@ -36233,31 +36512,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 166: /* begin genLowcodePointerNotEqual */ - topRegistersMask11 = 0; - rTop26 = (rNext15 = NoReg); + topRegistersMask9 = 0; + rTop22 = (rNext9 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop26 = nativeRegisterOrNone(ssNativeTop()); + rTop22 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext15 == NoReg) { + if (rNext9 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg16 = (rNext15 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask11 = 1U << reg16; + reg10 = (rNext9 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask9 = 1U << reg10; } } - if (rTop26 == NoReg) { - rTop26 = allocateRegNotConflictingWith(topRegistersMask11); + if (rTop22 == NoReg) { + rTop22 = allocateRegNotConflictingWith(topRegistersMask9); } - if (rNext15 == NoReg) { - rNext15 = allocateRegNotConflictingWith(1U << rTop26); + if (rNext9 == NoReg) { + rNext9 = allocateRegNotConflictingWith(1U << rTop22); } - assert(!(((rTop26 == NoReg) - || (rNext15 == NoReg)))); - second5 = rTop26; - first5 = rNext15; + assert(!(((rTop22 == NoReg) + || (rNext9 == NoReg)))); + second5 = rTop22; + first5 = rNext9; nativePopToReg(ssNativeTop(), second5); ssNativePop(1); nativePopToReg(ssNativeTop(), first5); @@ -36267,17 +36546,17 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin JumpZero: */ falseJump1 = genConditionalBranchoperand(JumpZero, ((sqInt)0)); /* begin checkQuickConstant:forInstruction: */ - anInstruction18 = genoperandoperand(MoveCqR, 1, first5); - if (usesOutOfLineLiteral(anInstruction18)) { - (anInstruction18->dependent = locateLiteral(1)); + anInstruction16 = genoperandoperand(MoveCqR, 1, first5); + if (usesOutOfLineLiteral(anInstruction16)) { + (anInstruction16->dependent = locateLiteral(1)); } /* begin Jump: */ contJump1 = genoperand(Jump, ((sqInt)0)); jmpTarget(falseJump1, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); /* begin checkQuickConstant:forInstruction: */ - anInstruction17 = genoperandoperand(MoveCqR, 0, first5); - if (usesOutOfLineLiteral(anInstruction17)) { - (anInstruction17->dependent = locateLiteral(0)); + anInstruction15 = genoperandoperand(MoveCqR, 0, first5); + if (usesOutOfLineLiteral(anInstruction15)) { + (anInstruction15->dependent = locateLiteral(0)); } jmpTarget(contJump1, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); ssPushNativeRegister(first5); @@ -36285,60 +36564,60 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 167: /* begin genLowcodePointerToInt32 */ - rTop27 = NoReg; + rTop23 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop27 = nativeRegisterOrNone(ssNativeTop()); + rTop23 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop27 == NoReg) { - rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop23 == NoReg) { + rTop23 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop27 == NoReg))); - pointer7 = rTop27; - nativePopToReg(ssNativeTop(), pointer7); + assert(!((rTop23 == NoReg))); + pointer5 = rTop23; + nativePopToReg(ssNativeTop(), pointer5); ssNativePop(1); - ssPushNativeRegister(pointer7); + ssPushNativeRegister(pointer5); return 0; case 168: /* begin genLowcodePointerToInt64 */ /* begin allocateRegistersForLowcodeIntegerResultInteger2: */ - rTop28 = NoReg; - rResult9 = (rResult9 = NoReg); + rTop24 = NoReg; + rResult7 = (rResult7 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop28 = nativeRegisterOrNone(ssNativeTop()); + rTop24 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop28 == NoReg) { - rTop28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop24 == NoReg) { + rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult9 = allocateRegNotConflictingWith(1U << rTop28); - rResult22 = allocateRegNotConflictingWith((1U << rTop28) | (1U << rResult9)); - assert(!(((rTop28 == NoReg) - || ((rResult9 == NoReg) + rResult7 = allocateRegNotConflictingWith(1U << rTop24); + rResult22 = allocateRegNotConflictingWith((1U << rTop24) | (1U << rResult7)); + assert(!(((rTop24 == NoReg) + || ((rResult7 == NoReg) || (rResult22 == NoReg))))); - pointer8 = rTop28; - resultLow1 = rResult9; + pointer6 = rTop24; + resultLow1 = rResult7; resultHigh1 = rResult22; - nativePopToReg(ssNativeTop(), pointer8); + nativePopToReg(ssNativeTop(), pointer6); ssNativePop(1); /* begin MoveR:R: */ - genoperandoperand(MoveRR, pointer8, resultLow1); + genoperandoperand(MoveRR, pointer6, resultLow1); /* begin checkQuickConstant:forInstruction: */ - anInstruction19 = genoperandoperand(MoveCqR, 0, resultHigh1); - if (usesOutOfLineLiteral(anInstruction19)) { - (anInstruction19->dependent = locateLiteral(0)); + anInstruction17 = genoperandoperand(MoveCqR, 0, resultHigh1); + if (usesOutOfLineLiteral(anInstruction17)) { + (anInstruction17->dependent = locateLiteral(0)); } ssPushNativeRegistersecondRegister(resultLow1, resultHigh1); return 0; case 169: /* begin genLowcodePopFloat32 */ - topRegistersMask12 = 0; + topRegistersMask10 = 0; frTop = NoReg; if ((nativeFloatRegisterOrNone(ssNativeTop())) != NoReg) { frTop = nativeFloatRegisterOrNone(ssNativeTop()); } if (frTop == NoReg) { - frTop = allocateFloatRegNotConflictingWith(topRegistersMask12); + frTop = allocateFloatRegNotConflictingWith(topRegistersMask10); } assert(!((frTop == NoReg))); value8 = frTop; @@ -36348,13 +36627,13 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 170: /* begin genLowcodePopFloat64 */ - topRegistersMask13 = 0; + topRegistersMask11 = 0; frTop1 = NoReg; if ((nativeFloatRegisterOrNone(ssNativeTop())) != NoReg) { frTop1 = nativeFloatRegisterOrNone(ssNativeTop()); } if (frTop1 == NoReg) { - frTop1 = allocateFloatRegNotConflictingWith(topRegistersMask13); + frTop1 = allocateFloatRegNotConflictingWith(topRegistersMask11); } assert(!((frTop1 == NoReg))); value9 = frTop1; @@ -36364,30 +36643,30 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 171: /* begin genLowcodePopInt32 */ - rTop29 = NoReg; + rTop25 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop29 = nativeRegisterOrNone(ssNativeTop()); + rTop25 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop29 == NoReg) { - rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop25 == NoReg) { + rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop29 == NoReg))); - value10 = rTop29; + assert(!((rTop25 == NoReg))); + value10 = rTop25; nativePopToReg(ssNativeTop(), value10); ssNativePop(1); return 0; case 172: /* begin genLowcodePopInt64 */ - rTop30 = NoReg; + rTop26 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop30 = nativeRegisterOrNone(ssNativeTop()); + rTop26 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop30 == NoReg) { - rTop30 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop26 == NoReg) { + rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop30 == NoReg))); - value11 = rTop30; + assert(!((rTop26 == NoReg))); + value11 = rTop26; nativePopToReg(ssNativeTop(), value11); ssNativePop(1); return 0; @@ -36400,16 +36679,16 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 174: /* begin genLowcodePopPointer */ - rTop31 = NoReg; + rTop27 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop31 = nativeRegisterOrNone(ssNativeTop()); + rTop27 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop31 == NoReg) { - rTop31 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop27 == NoReg) { + rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop31 == NoReg))); - pointerValue9 = rTop31; - nativePopToReg(ssNativeTop(), pointerValue9); + assert(!((rTop27 == NoReg))); + pointerValue7 = rTop27; + nativePopToReg(ssNativeTop(), pointerValue7); ssNativePop(1); return 0; @@ -41477,7 +41756,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -42012,6 +42291,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -42019,7 +42299,15 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -42046,11 +42334,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -42140,7 +42427,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -42152,9 +42439,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -42253,6 +42540,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -42268,7 +42556,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -42311,7 +42599,15 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -42506,6 +42802,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -42523,14 +42820,22 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -42709,6 +43014,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -42735,7 +43041,15 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -42761,6 +43075,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -42792,8 +43107,93 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI /* begin annotateBytecode: */ abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); - /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + /* begin putSelfInReceiverResultReg */ + storeToReg(simSelf(), ReceiverResultReg); + /* begin Jump: */ + immutabilityFailure = genoperand(Jump, ((sqInt)0)); + jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + } +# endif /* IMMUTABILITY */ + ssPop(1); + ssAllocateCallRegand(ClassReg, SendNumArgsReg); + ssPush(1); + genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); + ssStoreAndReplacePoptoReg(popBoolean, ClassReg); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } + /* begin checkQuickConstant:forInstruction: */ + anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); + if (usesOutOfLineLiteral(anInstruction1)) { + (anInstruction1->dependent = locateLiteral(slotIndex)); + } + /* begin CallRT: */ + abstractInstruction = genoperand(Call, ceStoreContextInstVarTrampoline); + (abstractInstruction->annotation = IsRelativeCall); + +# if IMMUTABILITY + if (needsImmCheck) { + jmpTarget(immutabilityFailure, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + } +# endif /* IMMUTABILITY */ + return 0; +} + + +/* The reason we need a frame here is that assigning to an inst var of a + context may + involve wholesale reorganization of stack pages, and the only way to + preserve the + execution state of an activation in that case is if it has a frame. */ + + /* StackToRegisterMappingCogit>>#genStorePop:MaybeContextRemoteInstVar:ofObjectAt:needsStoreCheck:needsImmutabilityCheck: */ +static sqInt NoDbgRegParms +genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) +{ + AbstractInstruction *abstractInstruction; + AbstractInstruction *abstractInstruction1; + AbstractInstruction *abstractInstruction2; + AbstractInstruction *abstractInstruction3; + AbstractInstruction *anInstruction; + AbstractInstruction *anInstruction1; + sqInt i; + AbstractInstruction *immutabilityFailure; + AbstractInstruction *mutableJump; + + assert(needsFrame); + genLoadTempin(objectIndex, ReceiverResultReg); + /* begin genGenericStorePop:MaybeContextSlotIndex:needsStoreCheck:needsRestoreRcvr:needsImmutabilityCheck: */ + assert(needsFrame); + +# if IMMUTABILITY + if (needsImmCheck) { + mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); + /* begin genStoreTrampolineCall: */ + if (slotIndex >= (NumStoreTrampolines - 1)) { + /* begin checkQuickConstant:forInstruction: */ + anInstruction = genoperandoperand(MoveCqR, slotIndex, TempReg); + if (usesOutOfLineLiteral(anInstruction)) { + (anInstruction->dependent = locateLiteral(slotIndex)); + } + /* begin CallRT: */ + abstractInstruction3 = genoperand(Call, ceStoreTrampolines[NumStoreTrampolines - 1]); + (abstractInstruction3->annotation = IsRelativeCall); + } + else { + /* begin CallRT: */ + abstractInstruction1 = genoperand(Call, ceStoreTrampolines[slotIndex]); + (abstractInstruction1->annotation = IsRelativeCall); + } + /* begin annotateBytecode: */ + abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); + (abstractInstruction2->annotation = HasBytecodePC); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -42805,83 +43205,15 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); - /* begin checkQuickConstant:forInstruction: */ - anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); - if (usesOutOfLineLiteral(anInstruction1)) { - (anInstruction1->dependent = locateLiteral(slotIndex)); - } - /* begin CallRT: */ - abstractInstruction = genoperand(Call, ceStoreContextInstVarTrampoline); - (abstractInstruction->annotation = IsRelativeCall); - -# if IMMUTABILITY - if (needsImmCheck) { - jmpTarget(immutabilityFailure, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); - } -# endif /* IMMUTABILITY */ - return 0; -} - - -/* The reason we need a frame here is that assigning to an inst var of a - context may - involve wholesale reorganization of stack pages, and the only way to - preserve the - execution state of an activation in that case is if it has a frame. */ - - /* StackToRegisterMappingCogit>>#genStorePop:MaybeContextRemoteInstVar:ofObjectAt:needsStoreCheck:needsImmutabilityCheck: */ -static sqInt NoDbgRegParms -genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) -{ - AbstractInstruction *abstractInstruction; - AbstractInstruction *abstractInstruction1; - AbstractInstruction *abstractInstruction2; - AbstractInstruction *abstractInstruction3; - AbstractInstruction *anInstruction; - AbstractInstruction *anInstruction1; - AbstractInstruction *immutabilityFailure; - AbstractInstruction *mutableJump; - - assert(needsFrame); - genLoadTempin(objectIndex, ReceiverResultReg); - /* begin genGenericStorePop:MaybeContextSlotIndex:needsStoreCheck:needsRestoreRcvr:needsImmutabilityCheck: */ - assert(needsFrame); - -# if IMMUTABILITY - if (needsImmCheck) { - mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); - /* begin genStoreTrampolineCall: */ - if (slotIndex >= (NumStoreTrampolines - 1)) { - /* begin checkQuickConstant:forInstruction: */ - anInstruction = genoperandoperand(MoveCqR, slotIndex, TempReg); - if (usesOutOfLineLiteral(anInstruction)) { - (anInstruction->dependent = locateLiteral(slotIndex)); - } - /* begin CallRT: */ - abstractInstruction3 = genoperand(Call, ceStoreTrampolines[NumStoreTrampolines - 1]); - (abstractInstruction3->annotation = IsRelativeCall); - } - else { - /* begin CallRT: */ - abstractInstruction1 = genoperand(Call, ceStoreTrampolines[slotIndex]); - (abstractInstruction1->annotation = IsRelativeCall); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); } - /* begin annotateBytecode: */ - abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); - (abstractInstruction2->annotation = HasBytecodePC); - /* begin Jump: */ - immutabilityFailure = genoperand(Jump, ((sqInt)0)); - jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + simSpillBase = simStackPtr + 1; } -# endif /* IMMUTABILITY */ - ssPop(1); - ssAllocateCallRegand(ClassReg, SendNumArgsReg); - ssPush(1); - genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); - ssStoreAndReplacePoptoReg(popBoolean, ClassReg); - /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); if (usesOutOfLineLiteral(anInstruction1)) { @@ -42903,6 +43235,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -42920,7 +43253,15 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -42933,6 +43274,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -42944,7 +43286,15 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -43007,7 +43357,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) if (usesOutOfLineLiteral(anInstruction)) { (anInstruction->dependent = locateLiteral(offset)); } - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -43032,6 +43382,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -43040,7 +43391,15 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -43080,64 +43439,40 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - (fixup->simNativeStackPtr) = UnknownSimStackPtrFlag; - (fixup->simNativeStackSize) = 0; -} - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -43147,32 +43482,36 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; } @@ -43181,25 +43520,25 @@ initSimStackForFramelessBlock(sqInt startpc) static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -43207,16 +43546,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; } @@ -43331,10 +43671,21 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -43345,7 +43696,15 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -43354,7 +43713,15 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -43425,7 +43792,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -43433,7 +43799,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; + sqInt i1; + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -43446,14 +43823,11 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); simNativeStackPtr = (fixup->simNativeStackPtr); simNativeStackSize = (fixup->simNativeStackSize); } @@ -43461,10 +43835,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); (fixup->simNativeStackPtr = simNativeStackPtr); (fixup->simNativeStackSize = simNativeStackSize); @@ -43474,18 +43856,17 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) assert(simNativeStackPtr == ((fixup->simNativeStackPtr))); assert(simNativeStackSize == ((fixup->simNativeStackSize))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } - for (i = 0; i <= simNativeStackPtr; i += 1) { - ensureIsMarkedAsSpilled(simNativeStackAt(i)); + simSpillBase = simStackPtr + 1; + for (i1 = 0; i1 <= simNativeStackPtr; i1 += 1) { + ensureIsMarkedAsSpilled(simNativeStackAt(i1)); } simNativeSpillBase = simNativeStackPtr + 1; return 0; @@ -43498,6 +43879,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -43573,6 +43970,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -43583,6 +43991,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -43603,7 +44012,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -43723,6 +44137,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -43799,7 +44214,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -43877,7 +44297,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredFloatRegMask:upThrough:upThroughNative: */ @@ -43885,6 +44305,7 @@ static void NoDbgRegParms ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -43902,6 +44323,7 @@ ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, s lastRequired = i; } } + assert(lastRequiredNative == simNativeStackPtr); for (i = (((simNativeSpillBase < 0) ? 0 : simNativeSpillBase)); i <= nativeStackPtr; i += 1) { liveRegs = liveRegs | (nativeRegisterMask(simNativeStackAt(i))); if ((0 /* floatRegisterMask */ & requiredRegsMask) != 0) { @@ -43911,7 +44333,16 @@ ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, s if (!((liveRegs & requiredRegsMask) == 0)) { /* Some live, must spill */ - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(((liveFloatRegisters()) & requiredRegsMask) == 0); } } @@ -43935,6 +44366,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -43949,10 +44381,11 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } + assert(nativeStackPtr == simNativeStackPtr); for (i = (((simNativeSpillBase < 0) ? 0 : simNativeSpillBase)); i <= nativeStackPtr; i += 1) { liveRegs = liveRegs | (nativeRegisterMask(simNativeStackAt(i))); if ((nativeRegisterMask(simNativeStackAt(i))) & requiredRegsMask) { @@ -43960,7 +44393,16 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -43986,31 +44428,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - ssNativeFlushTo(nativeIndex); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -44020,16 +44437,26 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; ssNativeFlushTo(simNativeStackPtr); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -44045,16 +44472,29 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; ssNativeFlushTo(simNativeStackPtr); + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -44178,11 +44618,33 @@ ssPopNativeSize(sqInt popSize) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -44190,18 +44652,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -44220,18 +44672,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -44240,17 +44709,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -44258,6 +44744,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -44265,8 +44753,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -44475,17 +44979,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -44496,6 +45017,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -44563,13 +45091,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -44587,6 +45108,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -44661,6 +45213,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -44670,18 +45229,27 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spurlowcodesrc/vm/cogitIA32.c b/spurlowcodesrc/vm/cogitIA32.c index 5d1ee6758b..932b6464c9 100644 --- a/spurlowcodesrc/vm/cogitIA32.c +++ b/spurlowcodesrc/vm/cogitIA32.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -344,7 +344,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #undef VarBaseReg #define XCHGAwR 155 @@ -434,7 +433,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -679,7 +679,7 @@ static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static CogMethod * NoDbgRegParms fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -758,7 +758,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -1080,7 +1080,6 @@ static CogSimStackNativeEntry * NoDbgRegParms nativeStackPopToReg(CogSimStackNat static CogSimStackNativeEntry * NoDbgRegParms nativeStackPopToRegsecondReg(CogSimStackNativeEntry * self_in_nativeStackPopToRegsecondReg, sqInt reg, sqInt secondReg); static sqInt NoDbgRegParms spillingNeedsScratchRegister(CogSimStackNativeEntry * self_in_spillingNeedsScratchRegister); static sqInt NoDbgRegParms stackSpillSize(CogSimStackNativeEntry * self_in_stackSpillSize); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); static AbstractInstruction * NoDbgRegParms checkQuickConstantforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1302,7 +1301,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1314,11 +1312,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1334,7 +1334,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssNativeFlushTo(sqInt index); @@ -1359,14 +1358,16 @@ static sqInt NoDbgRegParms ssPushNativeRegister(sqInt reg); static sqInt NoDbgRegParms ssPushNativeRegistersecondRegister(sqInt reg, sqInt secondReg); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -2046,7 +2047,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -2070,7 +2070,6 @@ static sqInt simNativeSpillBase; static CogSimStackNativeEntry simNativeStack[70]; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2153,6 +2152,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -7339,11 +7339,7 @@ stackPageInterruptHeadroomBytes(AbstractInstruction * self_in_stackPageInterrupt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -7655,7 +7651,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -9037,12 +9033,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -10961,7 +10963,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -12871,7 +12873,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -22543,7 +22545,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -22593,7 +22595,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -22878,8 +22880,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -23588,13 +23591,6 @@ stackSpillSize(CogSimStackNativeEntry * self_in_stackSpillSize) return 0; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -26779,11 +26775,20 @@ beginHighLevelCall(sqInt alignment) AbstractInstruction *anInstruction4; AbstractInstruction *anInstruction5; AbstractInstruction *anInstruction6; + sqInt i; sqInt mask; sqInt offset; /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); /* begin MoveR:Aw: */ address1 = stackPointerAddress(); @@ -26883,10 +26888,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -27279,6 +27281,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -27844,7 +27849,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -27892,7 +27898,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simNativeStackSize = simNativeStackSize); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -27937,18 +27943,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -28020,7 +28025,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -28240,12 +28245,21 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -28380,7 +28394,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -28674,6 +28688,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -28785,7 +28800,15 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -29016,11 +29039,20 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -29056,13 +29088,22 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -29134,10 +29175,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -29147,13 +29190,29 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -29200,7 +29259,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt i114; sqInt i115; sqInt i116; - sqInt i117; + sqInt i118; sqInt i119; sqInt i12; sqInt i120; @@ -29216,6 +29275,13 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt i17; sqInt i18; sqInt i19; + sqInt i210; + sqInt i211; + sqInt i212; + sqInt i214; + sqInt i29; + sqInt i34; + sqInt i37; sqInt index1; sqInt index11; sqInt index110; @@ -29225,7 +29291,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt index115; sqInt index116; sqInt index117; - sqInt index118; + sqInt index119; sqInt index12; sqInt index120; sqInt index121; @@ -29274,7 +29340,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt rOopTop15; sqInt rOopTop16; sqInt rOopTop17; - sqInt rOopTop18; + sqInt rOopTop19; sqInt rOopTop2; sqInt rOopTop20; sqInt rOopTop21; @@ -29317,7 +29383,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt value4; sqInt value5; sqInt value6; - sqInt value8; + sqInt value9; sqInt valueHigh; sqInt valueHigh1; sqInt valueHigh2; @@ -29331,36 +29397,44 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) switch (prim) { case 0: /* begin genLowcodeByteSizeOf */ - rOopTop16 = NoReg; - rResult9 = NoReg; + rOopTop19 = NoReg; + rResult10 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop16 = registerOrNone(ssTop()); - index116 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i116 = index116; i116 <= (simStackPtr); i116 += 1) { - if ((registerOrNone(simStackAt(index116))) == rOopTop16) { - goto l51; + rOopTop19 = registerOrNone(ssTop()); + index119 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i119 = index119; i119 <= (simStackPtr); i119 += 1) { + if ((registerOrNone(simStackAt(index119))) == rOopTop19) { + goto l62; } } - l51: ; - rOopTop16 = NoReg; - l50: ; + l62: ; + rOopTop19 = NoReg; + l61: ; } - if (rOopTop16 == NoReg) { - rOopTop16 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop19 == NoReg) { + rOopTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult9 = allocateRegNotConflictingWith(1U << rOopTop16); - assert(!(((rOopTop16 == NoReg) - || (rResult9 == NoReg)))); - object15 = rOopTop16; - value8 = rResult9; - popToReg(ssTop(), object15); + rResult10 = allocateRegNotConflictingWith(1U << rOopTop19); + assert(!(((rOopTop19 == NoReg) + || (rResult10 == NoReg)))); + object17 = rOopTop19; + value9 = rResult10; + popToReg(ssTop(), object17); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i29 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i29 <= simStackPtr; i29 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i29), frameOffsetOfTemporary(i29 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - genLcByteSizeOfto(object15, value8); + genLcByteSizeOfto(object17, value9); return 0; case 1: @@ -29701,67 +29775,67 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) case 12: /* begin genLowcodeOopToBoolean32 */ - rOopTop17 = NoReg; + rOopTop16 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop17 = registerOrNone(ssTop()); - index117 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i117 = index117; i117 <= (simStackPtr); i117 += 1) { - if ((registerOrNone(simStackAt(index117))) == rOopTop17) { - goto l55; + rOopTop16 = registerOrNone(ssTop()); + index116 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i116 = index116; i116 <= (simStackPtr); i116 += 1) { + if ((registerOrNone(simStackAt(index116))) == rOopTop16) { + goto l52; } } - l55: ; - rOopTop17 = NoReg; - l54: ; + l52: ; + rOopTop16 = NoReg; + l51: ; } - if (rOopTop17 == NoReg) { - rOopTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop16 == NoReg) { + rOopTop16 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rOopTop17 == NoReg))); - object16 = rOopTop17; - popToReg(ssTop(), object16); + assert(!((rOopTop16 == NoReg))); + object15 = rOopTop16; + popToReg(ssTop(), object15); ssPop(1); - annotateobjRef(gSubCwR(falseObject(), object16), falseObject()); - ssPushNativeRegister(object16); + annotateobjRef(gSubCwR(falseObject(), object15), falseObject()); + ssPushNativeRegister(object15); return 0; case 13: /* begin genLowcodeOopToBoolean64 */ /* begin allocateRegistersForLowcodeOopResultInteger2: */ - rOopTop18 = NoReg; - rResult10 = (rResult22 = NoReg); + rOopTop17 = NoReg; + rResult9 = (rResult22 = NoReg); if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop18 = registerOrNone(ssTop()); - index118 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i119 = index118; i119 <= (simStackPtr); i119 += 1) { - if ((registerOrNone(simStackAt(index118))) == rOopTop18) { - goto l62; + rOopTop17 = registerOrNone(ssTop()); + index117 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i118 = index117; i118 <= (simStackPtr); i118 += 1) { + if ((registerOrNone(simStackAt(index117))) == rOopTop17) { + goto l59; } } - l62: ; - rOopTop18 = NoReg; l59: ; + rOopTop17 = NoReg; + l56: ; } - if (rOopTop18 == NoReg) { - rOopTop18 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop17 == NoReg) { + rOopTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult10 = allocateRegNotConflictingWith(1U << rOopTop18); - rResult22 = allocateRegNotConflictingWith((1U << rOopTop18) | (1U << rResult10)); - assert(!(((rOopTop18 == NoReg) - || (rResult10 == NoReg)))); - object17 = rOopTop18; - valueLow1 = rResult10; + rResult9 = allocateRegNotConflictingWith(1U << rOopTop17); + rResult22 = allocateRegNotConflictingWith((1U << rOopTop17) | (1U << rResult9)); + assert(!(((rOopTop17 == NoReg) + || (rResult9 == NoReg)))); + object16 = rOopTop17; + valueLow1 = rResult9; valueHigh1 = rResult22; - popToReg(ssTop(), object17); + popToReg(ssTop(), object16); ssPop(1); /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, 0, valueHigh1); - annotateobjRef(gSubCwR(falseObject(), object17), falseObject()); - ssPushNativeRegistersecondRegister(object17, valueHigh1); + annotateobjRef(gSubCwR(falseObject(), object16), falseObject()); + ssPushNativeRegistersecondRegister(object16, valueHigh1); return 0; case 14: @@ -29793,7 +29867,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object18); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i210 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i210 <= simStackPtr; i210 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i210), frameOffsetOfTemporary(i210 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoFloat32(object18, value10); return 0; @@ -29827,7 +29909,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object19); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i211 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i211 <= simStackPtr; i211 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i211), frameOffsetOfTemporary(i211 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoFloat64(object19, value11); return 0; @@ -29857,7 +29947,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object20); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i212 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i212 <= simStackPtr; i212 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i212), frameOffsetOfTemporary(i212 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToInt32(object20); return 0; @@ -29894,7 +29992,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object21); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i34 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i34 <= simStackPtr; i34 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i34), frameOffsetOfTemporary(i34 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoInt64highPart(object21, valueLow2, valueHigh2); return 0; @@ -29986,7 +30092,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object22); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i214 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i214 <= simStackPtr; i214 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i214), frameOffsetOfTemporary(i214 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToUInt32(object22); return 0; @@ -30023,7 +30137,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object23); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i37 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i37 <= simStackPtr; i37 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i37), frameOffsetOfTemporary(i37 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoUInt64highPart(object23, valueLow3, valueHigh3); return 0; @@ -30104,6 +30226,13 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) sqInt floatValue; sqInt frTop; sqInt frTop1; + sqInt i; + sqInt i1; + sqInt i2; + sqInt i3; + sqInt i4; + sqInt i5; + sqInt i6; AbstractInstruction * inst; AbstractInstruction * inst1; sqInt object; @@ -30262,7 +30391,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), singleFloatValue); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcFloat32toOop(singleFloatValue, object2); return 0; @@ -30287,7 +30424,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), floatValue); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcFloat64toOop(floatValue, object3); return 0; @@ -30306,7 +30451,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value2); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInt32ToOop(value2); return 0; @@ -30342,7 +30495,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToRegsecondReg(ssNativeTop(), valueLow1, valueHigh1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 <= simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInt64ToOophighPart(valueLow1, valueHigh1); return 0; @@ -30351,51 +30512,59 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) /* begin genLowcodePointerToOop */ pointerClassLiteral = getLiteral(extA); /* begin allocateRegistersForLowcodeInteger: */ - rTop5 = NoReg; + rTop7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop5 == NoReg))); - pointer = rTop5; - nativePopToReg(ssNativeTop(), pointer); + assert(!((rTop7 == NoReg))); + pointer1 = rTop7; + nativePopToReg(ssNativeTop(), pointer1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 <= simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - genLcPointerToOopclass(pointer, pointerClassLiteral); + genLcPointerToOopclass(pointer1, pointerClassLiteral); extA = 0; return 0; case 7: /* begin genLowcodePointerToOopReinterprer */ - rTop6 = NoReg; + rTop5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop6 == NoReg))); - pointer1 = rTop6; - nativePopToReg(ssNativeTop(), pointer1); + assert(!((rTop5 == NoReg))); + pointer = rTop5; + nativePopToReg(ssNativeTop(), pointer); ssNativePop(1); - ssPushRegister(pointer1); + ssPushRegister(pointer); return 0; case 8: /* begin genLowcodeSmallInt32ToOop */ - rTop7 = NoReg; + rTop6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop7 == NoReg) { - rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop7 == NoReg))); - value4 = rTop7; + assert(!((rTop6 == NoReg))); + value4 = rTop6; nativePopToReg(ssNativeTop(), value4); ssNativePop(1); genConvertIntegerToSmallIntegerInReg(value4); @@ -30416,7 +30585,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value5); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i5 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i5 <= simStackPtr; i5 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i5), frameOffsetOfTemporary(i5 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcUInt32ToOop(value5); return 0; @@ -30456,7 +30633,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToRegsecondReg(ssNativeTop(), valueLow2, valueHigh2); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i6 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i6 <= simStackPtr; i6 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i6), frameOffsetOfTemporary(i6 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcUInt64ToOophighPart(valueLow2, valueHigh2); return 0; @@ -30901,8 +31086,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt frTop2; sqInt frTop3; sqInt frTop4; + sqInt i; sqInt i1; sqInt i11; + sqInt i12; + sqInt i2; + sqInt i21; sqInt index1; sqInt index11; sqInt indexableSize; @@ -31013,12 +31202,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt rTop; sqInt rTop1; sqInt rTop10; - sqInt rTop11; + sqInt rTop12; sqInt rTop13; sqInt rTop14; sqInt rTop15; - sqInt rTop16; sqInt rTop17; + sqInt rTop18; sqInt rTop19; sqInt rTop2; sqInt rTop20; @@ -31227,23 +31416,31 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 65: /* begin genLowcodeFree */ - rTop = NoReg; + rTop29 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop = nativeRegisterOrNone(ssNativeTop()); + rTop29 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop == NoReg) { - rTop = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop29 == NoReg) { + rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop == NoReg))); - pointer2 = rTop; - nativePopToReg(ssNativeTop(), pointer2); + assert(!((rTop29 == NoReg))); + pointer8 = rTop29; + nativePopToReg(ssNativeTop(), pointer8); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - if (pointer2 != ReceiverResultReg) { + if (pointer8 != ReceiverResultReg) { /* begin MoveR:R: */ - genoperandoperand(MoveRR, pointer2, ReceiverResultReg); + genoperandoperand(MoveRR, pointer8, ReceiverResultReg); } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceFreeTrampoline); @@ -31252,36 +31449,44 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 66: /* begin genLowcodeInstantiateIndexable32Oop */ - rTop1 = (rOopTop = NoReg); + rTop30 = (rOopTop1 = NoReg); rOopResult = NoReg; - topRegisterMask = 0; + topRegisterMask1 = 0; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop1 = nativeRegisterOrNone(ssNativeTop()); + rTop30 = nativeRegisterOrNone(ssNativeTop()); } if ((registerOrNone(ssTop())) != NoReg) { - rOopTop = registerOrNone(ssTop()); + rOopTop1 = registerOrNone(ssTop()); /* begin registerMaskFor: */ - topRegisterMask = 1U << rOopTop; + topRegisterMask1 = 1U << rOopTop1; } - if (rTop1 == NoReg) { - rTop1 = allocateRegNotConflictingWith(topRegisterMask); + if (rTop30 == NoReg) { + rTop30 = allocateRegNotConflictingWith(topRegisterMask1); } - if (rOopTop == NoReg) { - rOopTop = allocateRegNotConflictingWith(1U << rTop1); + if (rOopTop1 == NoReg) { + rOopTop1 = allocateRegNotConflictingWith(1U << rTop30); } - rOopResult = allocateRegNotConflictingWith((1U << rTop1) | (1U << rOopTop)); - assert(!(((rTop1 == NoReg) - || ((rOopTop == NoReg) + rOopResult = allocateRegNotConflictingWith((1U << rTop30) | (1U << rOopTop1)); + assert(!(((rTop30 == NoReg) + || ((rOopTop1 == NoReg) || (rOopResult == NoReg))))); - indexableSize = rTop1; - classOop = rOopTop; - object = rOopResult; + indexableSize = rTop30; + classOop = rOopTop1; + object1 = rOopResult; nativePopToReg(ssNativeTop(), indexableSize); ssNativePop(1); popToReg(ssTop(), classOop); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOopindexableSize(classOop, indexableSize); return 0; @@ -31290,34 +31495,42 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInstantiateIndexableOop */ indexableSize1 = extA; /* begin allocateRegistersForLowcodeOopResultOop: */ - rOopTop1 = NoReg; - rResult20 = NoReg; + rOopTop2 = NoReg; + rResult35 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop1 = registerOrNone(ssTop()); + rOopTop2 = registerOrNone(ssTop()); index1 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i1 = index1; i1 <= (simStackPtr); i1 += 1) { - if ((registerOrNone(simStackAt(index1))) == rOopTop1) { - goto l40; + for (i11 = index1; i11 <= (simStackPtr); i11 += 1) { + if ((registerOrNone(simStackAt(index1))) == rOopTop2) { + goto l200; } } - l40: ; - rOopTop1 = NoReg; - l39: ; + l200: ; + rOopTop2 = NoReg; + l199: ; } - if (rOopTop1 == NoReg) { - rOopTop1 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop2 == NoReg) { + rOopTop2 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult20 = allocateRegNotConflictingWith(1U << rOopTop1); - assert(!(((rOopTop1 == NoReg) - || (rResult20 == NoReg)))); - classOop1 = rOopTop1; - object1 = rResult20; + rResult35 = allocateRegNotConflictingWith(1U << rOopTop2); + assert(!(((rOopTop2 == NoReg) + || (rResult35 == NoReg)))); + classOop1 = rOopTop2; + object2 = rResult35; popToReg(ssTop(), classOop1); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOopconstantIndexableSize(classOop1, indexableSize1); extA = 0; @@ -31325,30 +31538,38 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 68: /* begin genLowcodeInstantiateOop */ - rOopTop2 = NoReg; + rOopTop3 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop2 = registerOrNone(ssTop()); + rOopTop3 = registerOrNone(ssTop()); index11 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i11 = index11; i11 <= (simStackPtr); i11 += 1) { - if ((registerOrNone(simStackAt(index11))) == rOopTop2) { - goto l43; + for (i12 = index11; i12 <= (simStackPtr); i12 += 1) { + if ((registerOrNone(simStackAt(index11))) == rOopTop3) { + goto l203; } } - l43: ; - rOopTop2 = NoReg; - l42: ; + l203: ; + rOopTop3 = NoReg; + l202: ; } - if (rOopTop2 == NoReg) { - rOopTop2 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop3 == NoReg) { + rOopTop3 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rOopTop2 == NoReg))); - classOop2 = rOopTop2; + assert(!((rOopTop3 == NoReg))); + classOop2 = rOopTop3; popToReg(ssTop(), classOop2); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i21 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i21 <= simStackPtr; i21 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i21), frameOffsetOfTemporary(i21 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOop(classOop2); return 0; @@ -31356,9 +31577,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 69: /* begin genLowcodeInt32Equal */ topRegistersMask1 = 0; - rTop2 = (rNext = NoReg); + rTop = (rNext = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop2 = nativeRegisterOrNone(ssNativeTop()); + rTop = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31370,15 +31591,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask1 = 1U << reg; } } - if (rTop2 == NoReg) { - rTop2 = allocateRegNotConflictingWith(topRegistersMask1); + if (rTop == NoReg) { + rTop = allocateRegNotConflictingWith(topRegistersMask1); } if (rNext == NoReg) { - rNext = allocateRegNotConflictingWith(1U << rTop2); + rNext = allocateRegNotConflictingWith(1U << rTop); } - assert(!(((rTop2 == NoReg) + assert(!(((rTop == NoReg) || (rNext == NoReg)))); - second = rTop2; + second = rTop; first = rNext; nativePopToReg(ssNativeTop(), second); ssNativePop(1); @@ -31402,9 +31623,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 70: /* begin genLowcodeInt32Great */ topRegistersMask2 = 0; - rTop3 = (rNext1 = NoReg); + rTop1 = (rNext1 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop3 = nativeRegisterOrNone(ssNativeTop()); + rTop1 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31416,15 +31637,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask2 = 1U << reg1; } } - if (rTop3 == NoReg) { - rTop3 = allocateRegNotConflictingWith(topRegistersMask2); + if (rTop1 == NoReg) { + rTop1 = allocateRegNotConflictingWith(topRegistersMask2); } if (rNext1 == NoReg) { - rNext1 = allocateRegNotConflictingWith(1U << rTop3); + rNext1 = allocateRegNotConflictingWith(1U << rTop1); } - assert(!(((rTop3 == NoReg) + assert(!(((rTop1 == NoReg) || (rNext1 == NoReg)))); - second1 = rTop3; + second1 = rTop1; first1 = rNext1; nativePopToReg(ssNativeTop(), second1); ssNativePop(1); @@ -31448,9 +31669,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 71: /* begin genLowcodeInt32GreatEqual */ topRegistersMask3 = 0; - rTop4 = (rNext2 = NoReg); + rTop2 = (rNext2 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop4 = nativeRegisterOrNone(ssNativeTop()); + rTop2 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31462,15 +31683,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask3 = 1U << reg2; } } - if (rTop4 == NoReg) { - rTop4 = allocateRegNotConflictingWith(topRegistersMask3); + if (rTop2 == NoReg) { + rTop2 = allocateRegNotConflictingWith(topRegistersMask3); } if (rNext2 == NoReg) { - rNext2 = allocateRegNotConflictingWith(1U << rTop4); + rNext2 = allocateRegNotConflictingWith(1U << rTop2); } - assert(!(((rTop4 == NoReg) + assert(!(((rTop2 == NoReg) || (rNext2 == NoReg)))); - second2 = rTop4; + second2 = rTop2; first2 = rNext2; nativePopToReg(ssNativeTop(), second2); ssNativePop(1); @@ -31494,9 +31715,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 72: /* begin genLowcodeInt32Less */ topRegistersMask4 = 0; - rTop5 = (rNext3 = NoReg); + rTop3 = (rNext3 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop3 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31508,15 +31729,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask4 = 1U << reg3; } } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(topRegistersMask4); + if (rTop3 == NoReg) { + rTop3 = allocateRegNotConflictingWith(topRegistersMask4); } if (rNext3 == NoReg) { - rNext3 = allocateRegNotConflictingWith(1U << rTop5); + rNext3 = allocateRegNotConflictingWith(1U << rTop3); } - assert(!(((rTop5 == NoReg) + assert(!(((rTop3 == NoReg) || (rNext3 == NoReg)))); - second3 = rTop5; + second3 = rTop3; first3 = rNext3; nativePopToReg(ssNativeTop(), second3); ssNativePop(1); @@ -31540,9 +31761,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 73: /* begin genLowcodeInt32LessEqual */ topRegistersMask5 = 0; - rTop6 = (rNext4 = NoReg); + rTop4 = (rNext4 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop4 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31554,15 +31775,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask5 = 1U << reg4; } } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(topRegistersMask5); + if (rTop4 == NoReg) { + rTop4 = allocateRegNotConflictingWith(topRegistersMask5); } if (rNext4 == NoReg) { - rNext4 = allocateRegNotConflictingWith(1U << rTop6); + rNext4 = allocateRegNotConflictingWith(1U << rTop4); } - assert(!(((rTop6 == NoReg) + assert(!(((rTop4 == NoReg) || (rNext4 == NoReg)))); - second4 = rTop6; + second4 = rTop4; first4 = rNext4; nativePopToReg(ssNativeTop(), second4); ssNativePop(1); @@ -31586,9 +31807,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 74: /* begin genLowcodeInt32NotEqual */ topRegistersMask6 = 0; - rTop7 = (rNext5 = NoReg); + rTop5 = (rNext5 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31600,15 +31821,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask6 = 1U << reg5; } } - if (rTop7 == NoReg) { - rTop7 = allocateRegNotConflictingWith(topRegistersMask6); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(topRegistersMask6); } if (rNext5 == NoReg) { - rNext5 = allocateRegNotConflictingWith(1U << rTop7); + rNext5 = allocateRegNotConflictingWith(1U << rTop5); } - assert(!(((rTop7 == NoReg) + assert(!(((rTop5 == NoReg) || (rNext5 == NoReg)))); - second5 = rTop7; + second5 = rTop5; first5 = rNext5; nativePopToReg(ssNativeTop(), second5); ssNativePop(1); @@ -31631,18 +31852,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 75: /* begin genLowcodeInt32ToFloat32 */ - rTop8 = NoReg; + rTop6 = NoReg; frResult4 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop8 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop8 == NoReg) { - rTop8 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult4 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop8 == NoReg) + assert(!(((rTop6 == NoReg) || (frResult4 == NoReg)))); - value12 = rTop8; + value12 = rTop6; result = frResult4; nativePopToReg(ssNativeTop(), value12); ssNativePop(1); @@ -31653,18 +31874,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 76: /* begin genLowcodeInt32ToFloat64 */ - rTop9 = NoReg; + rTop7 = NoReg; frResult5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop9 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop9 == NoReg) { - rTop9 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult5 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop9 == NoReg) + assert(!(((rTop7 == NoReg) || (frResult5 == NoReg)))); - value13 = rTop9; + value13 = rTop7; result1 = frResult5; nativePopToReg(ssNativeTop(), value13); ssNativePop(1); @@ -31675,15 +31896,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 77: /* begin genLowcodeInt32ToPointer */ - rTop10 = NoReg; + rTop8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop10 = nativeRegisterOrNone(ssNativeTop()); + rTop8 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop10 == NoReg) { - rTop10 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop8 == NoReg) { + rTop8 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop10 == NoReg))); - value14 = rTop10; + assert(!((rTop8 == NoReg))); + value14 = rTop8; nativePopToReg(ssNativeTop(), value14); ssNativePop(1); ssPushNativeRegister(value14); @@ -31692,10 +31913,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 78: /* begin genLowcodeInt64Equal */ /* begin allocateRegistersForLowcodeInteger4: */ - rTop11 = (rNext6 = (rNextNext = (rNextNextNext = NoReg))); + rTop9 = (rNext6 = (rNextNext = (rNextNextNext = NoReg))); nativeValueIndex = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop11 = nativeRegisterOrNone(ssNativeTop()); + rTop9 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext6 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31724,7 +31945,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) nativeValueIndex += 1; } } - if (rTop11 == NoReg) { + if (rTop9 == NoReg) { nextRegisterMask = 0; if (rNext6 != NoReg) { /* begin registerMaskFor: */ @@ -31736,11 +31957,11 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) if (rNextNextNext != NoReg) { nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rTop11 = allocateRegNotConflictingWith(nextRegisterMask); + rTop9 = allocateRegNotConflictingWith(nextRegisterMask); } if (rNext6 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1U << rTop11; + nextRegisterMask = 1U << rTop9; if (rNextNext != NoReg) { nextRegisterMask = nextRegisterMask | (1U << rNextNext); } @@ -31751,7 +31972,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNext == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask = (1U << rTop11) | (1U << rNext6); + nextRegisterMask = (1U << rTop9) | (1U << rNext6); if (rNextNextNext != NoReg) { nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } @@ -31759,14 +31980,14 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNextNext == NoReg) { /* begin registerMaskFor:and:and: */ - nextRegisterMask = ((1U << rTop11) | (1U << rNext6)) | (1U << rNextNext); + nextRegisterMask = ((1U << rTop9) | (1U << rNext6)) | (1U << rNextNext); rNextNextNext = allocateRegNotConflictingWith(nextRegisterMask); } - assert(!(((rTop11 == NoReg) + assert(!(((rTop9 == NoReg) || ((rNext6 == NoReg) || ((rNextNext == NoReg) || (rNextNextNext == NoReg)))))); - secondLow = rTop11; + secondLow = rTop9; secondHigh = rNext6; firstLow = rNextNext; firstHigh = rNextNextNext; @@ -31798,10 +32019,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 79: /* begin genLowcodeInt64Great */ topRegistersMask8 = 0; - rTop13 = (rNext7 = NoReg); - rResult21 = NoReg; + rTop10 = (rNext7 = NoReg); + rResult20 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop13 = nativeRegisterOrNone(ssNativeTop()); + rTop10 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext7 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31813,19 +32034,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask8 = 1U << reg7; } } - if (rTop13 == NoReg) { - rTop13 = allocateRegNotConflictingWith(topRegistersMask8); + if (rTop10 == NoReg) { + rTop10 = allocateRegNotConflictingWith(topRegistersMask8); } if (rNext7 == NoReg) { - rNext7 = allocateRegNotConflictingWith(1U << rTop13); + rNext7 = allocateRegNotConflictingWith(1U << rTop10); } - assert(!(((rTop13 == NoReg) + assert(!(((rTop10 == NoReg) || (rNext7 == NoReg)))); - rResult21 = allocateFloatRegNotConflictingWith((1U << rTop13) | (1U << rNext7)); - assert(!((rResult21 == NoReg))); - second7 = rTop13; + rResult20 = allocateFloatRegNotConflictingWith((1U << rTop10) | (1U << rNext7)); + assert(!((rResult20 == NoReg))); + second7 = rTop10; first7 = rNext7; - value15 = rResult21; + value15 = rResult20; nativePopToReg(ssNativeTop(), second7); ssNativePop(1); nativePopToReg(ssNativeTop(), first7); @@ -31836,10 +32057,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 80: /* begin genLowcodeInt64GreatEqual */ topRegistersMask9 = 0; - rTop14 = (rNext8 = NoReg); - rResult22 = NoReg; + rTop12 = (rNext8 = NoReg); + rResult21 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop14 = nativeRegisterOrNone(ssNativeTop()); + rTop12 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31851,19 +32072,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask9 = 1U << reg8; } } - if (rTop14 == NoReg) { - rTop14 = allocateRegNotConflictingWith(topRegistersMask9); + if (rTop12 == NoReg) { + rTop12 = allocateRegNotConflictingWith(topRegistersMask9); } if (rNext8 == NoReg) { - rNext8 = allocateRegNotConflictingWith(1U << rTop14); + rNext8 = allocateRegNotConflictingWith(1U << rTop12); } - assert(!(((rTop14 == NoReg) + assert(!(((rTop12 == NoReg) || (rNext8 == NoReg)))); - rResult22 = allocateFloatRegNotConflictingWith((1U << rTop14) | (1U << rNext8)); - assert(!((rResult22 == NoReg))); - second8 = rTop14; + rResult21 = allocateFloatRegNotConflictingWith((1U << rTop12) | (1U << rNext8)); + assert(!((rResult21 == NoReg))); + second8 = rTop12; first8 = rNext8; - value16 = rResult22; + value16 = rResult21; nativePopToReg(ssNativeTop(), second8); ssNativePop(1); nativePopToReg(ssNativeTop(), first8); @@ -31874,10 +32095,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 81: /* begin genLowcodeInt64Less */ topRegistersMask10 = 0; - rTop15 = (rNext9 = NoReg); - rResult23 = NoReg; + rTop13 = (rNext9 = NoReg); + rResult22 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop15 = nativeRegisterOrNone(ssNativeTop()); + rTop13 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31889,19 +32110,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask10 = 1U << reg9; } } - if (rTop15 == NoReg) { - rTop15 = allocateRegNotConflictingWith(topRegistersMask10); + if (rTop13 == NoReg) { + rTop13 = allocateRegNotConflictingWith(topRegistersMask10); } if (rNext9 == NoReg) { - rNext9 = allocateRegNotConflictingWith(1U << rTop15); + rNext9 = allocateRegNotConflictingWith(1U << rTop13); } - assert(!(((rTop15 == NoReg) + assert(!(((rTop13 == NoReg) || (rNext9 == NoReg)))); - rResult23 = allocateFloatRegNotConflictingWith((1U << rTop15) | (1U << rNext9)); - assert(!((rResult23 == NoReg))); - second9 = rTop15; + rResult22 = allocateFloatRegNotConflictingWith((1U << rTop13) | (1U << rNext9)); + assert(!((rResult22 == NoReg))); + second9 = rTop13; first9 = rNext9; - value17 = rResult23; + value17 = rResult22; nativePopToReg(ssNativeTop(), second9); ssNativePop(1); nativePopToReg(ssNativeTop(), first9); @@ -31912,10 +32133,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 82: /* begin genLowcodeInt64LessEqual */ topRegistersMask11 = 0; - rTop16 = (rNext10 = NoReg); - rResult24 = NoReg; + rTop14 = (rNext10 = NoReg); + rResult23 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop16 = nativeRegisterOrNone(ssNativeTop()); + rTop14 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31927,19 +32148,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask11 = 1U << reg10; } } - if (rTop16 == NoReg) { - rTop16 = allocateRegNotConflictingWith(topRegistersMask11); + if (rTop14 == NoReg) { + rTop14 = allocateRegNotConflictingWith(topRegistersMask11); } if (rNext10 == NoReg) { - rNext10 = allocateRegNotConflictingWith(1U << rTop16); + rNext10 = allocateRegNotConflictingWith(1U << rTop14); } - assert(!(((rTop16 == NoReg) + assert(!(((rTop14 == NoReg) || (rNext10 == NoReg)))); - rResult24 = allocateFloatRegNotConflictingWith((1U << rTop16) | (1U << rNext10)); - assert(!((rResult24 == NoReg))); - second10 = rTop16; + rResult23 = allocateFloatRegNotConflictingWith((1U << rTop14) | (1U << rNext10)); + assert(!((rResult23 == NoReg))); + second10 = rTop14; first10 = rNext10; - value18 = rResult24; + value18 = rResult23; nativePopToReg(ssNativeTop(), second10); ssNativePop(1); nativePopToReg(ssNativeTop(), first10); @@ -31950,10 +32171,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 83: /* begin genLowcodeInt64NotEqual */ /* begin allocateRegistersForLowcodeInteger4: */ - rTop17 = (rNext12 = (rNextNext1 = (rNextNextNext1 = NoReg))); + rTop15 = (rNext12 = (rNextNext1 = (rNextNextNext1 = NoReg))); nativeValueIndex1 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop17 = nativeRegisterOrNone(ssNativeTop()); + rTop15 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext12 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31982,7 +32203,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) nativeValueIndex1 += 1; } } - if (rTop17 == NoReg) { + if (rTop15 == NoReg) { nextRegisterMask1 = 0; if (rNext12 != NoReg) { /* begin registerMaskFor: */ @@ -31994,11 +32215,11 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) if (rNextNextNext1 != NoReg) { nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNextNext1); } - rTop17 = allocateRegNotConflictingWith(nextRegisterMask1); + rTop15 = allocateRegNotConflictingWith(nextRegisterMask1); } if (rNext12 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1U << rTop17; + nextRegisterMask1 = 1U << rTop15; if (rNextNext1 != NoReg) { nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); } @@ -32009,7 +32230,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNext1 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask1 = (1U << rTop17) | (1U << rNext12); + nextRegisterMask1 = (1U << rTop15) | (1U << rNext12); if (rNextNextNext1 != NoReg) { nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNextNext1); } @@ -32017,14 +32238,14 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNextNext1 == NoReg) { /* begin registerMaskFor:and:and: */ - nextRegisterMask1 = ((1U << rTop17) | (1U << rNext12)) | (1U << rNextNext1); + nextRegisterMask1 = ((1U << rTop15) | (1U << rNext12)) | (1U << rNextNext1); rNextNextNext1 = allocateRegNotConflictingWith(nextRegisterMask1); } - assert(!(((rTop17 == NoReg) + assert(!(((rTop15 == NoReg) || ((rNext12 == NoReg) || ((rNextNext1 == NoReg) || (rNextNextNext1 == NoReg)))))); - secondLow5 = rTop17; + secondLow5 = rTop15; secondHigh5 = rNext12; firstLow5 = rNextNext1; firstHigh5 = rNextNextNext1; @@ -32055,18 +32276,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 84: /* begin genLowcodeInt64ToFloat32 */ - rTop19 = NoReg; + rTop17 = NoReg; frResult6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop19 = nativeRegisterOrNone(ssNativeTop()); + rTop17 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop19 == NoReg) { - rTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop17 == NoReg) { + rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult6 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop19 == NoReg) + assert(!(((rTop17 == NoReg) || (frResult6 == NoReg)))); - value19 = rTop19; + value19 = rTop17; result2 = frResult6; nativePopToReg(ssNativeTop(), value19); ssNativePop(1); @@ -32075,18 +32296,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 85: /* begin genLowcodeInt64ToFloat64 */ - rTop20 = NoReg; + rTop18 = NoReg; frResult7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop20 = nativeRegisterOrNone(ssNativeTop()); + rTop18 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop20 == NoReg) { - rTop20 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop18 == NoReg) { + rTop18 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult7 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop20 == NoReg) + assert(!(((rTop18 == NoReg) || (frResult7 == NoReg)))); - value20 = rTop20; + value20 = rTop18; result3 = frResult7; nativePopToReg(ssNativeTop(), value20); ssNativePop(1); @@ -32097,9 +32318,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInt64ToPointer */ /* begin allocateRegistersForLowcodeInteger2: */ topRegistersMask13 = 0; - rTop21 = (rNext14 = NoReg); + rTop19 = (rNext14 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop21 = nativeRegisterOrNone(ssNativeTop()); + rTop19 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -32111,15 +32332,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask13 = 1U << reg12; } } - if (rTop21 == NoReg) { - rTop21 = allocateRegNotConflictingWith(topRegistersMask13); + if (rTop19 == NoReg) { + rTop19 = allocateRegNotConflictingWith(topRegistersMask13); } if (rNext14 == NoReg) { - rNext14 = allocateRegNotConflictingWith(1U << rTop21); + rNext14 = allocateRegNotConflictingWith(1U << rTop19); } - assert(!(((rTop21 == NoReg) + assert(!(((rTop19 == NoReg) || (rNext14 == NoReg)))); - valueLow2 = rTop21; + valueLow2 = rTop19; valueHigh2 = rNext14; nativePopToRegsecondReg(ssNativeTop(), valueLow2, valueHigh2); ssNativePop(1); @@ -32129,9 +32350,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 87: /* begin genLowcodeLeftShift32 */ topRegistersMask14 = 0; - rTop22 = (rNext15 = NoReg); + rTop20 = (rNext15 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop22 = nativeRegisterOrNone(ssNativeTop()); + rTop20 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -32143,15 +32364,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask14 = 1U << reg13; } } - if (rTop22 == NoReg) { - rTop22 = allocateRegNotConflictingWith(topRegistersMask14); + if (rTop20 == NoReg) { + rTop20 = allocateRegNotConflictingWith(topRegistersMask14); } if (rNext15 == NoReg) { - rNext15 = allocateRegNotConflictingWith(1U << rTop22); + rNext15 = allocateRegNotConflictingWith(1U << rTop20); } - assert(!(((rTop22 == NoReg) + assert(!(((rTop20 == NoReg) || (rNext15 == NoReg)))); - shiftAmount = rTop22; + shiftAmount = rTop20; value22 = rNext15; nativePopToReg(ssNativeTop(), shiftAmount); ssNativePop(1); @@ -32165,10 +32386,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 88: /* begin genLowcodeLeftShift64 */ topRegistersMask15 = 0; - rTop23 = (rNext16 = NoReg); - rResult25 = NoReg; + rTop21 = (rNext16 = NoReg); + rResult24 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop23 = nativeRegisterOrNone(ssNativeTop()); + rTop21 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext16 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -32180,19 +32401,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask15 = 1U << reg14; } } - if (rTop23 == NoReg) { - rTop23 = allocateRegNotConflictingWith(topRegistersMask15); + if (rTop21 == NoReg) { + rTop21 = allocateRegNotConflictingWith(topRegistersMask15); } if (rNext16 == NoReg) { - rNext16 = allocateRegNotConflictingWith(1U << rTop23); + rNext16 = allocateRegNotConflictingWith(1U << rTop21); } - assert(!(((rTop23 == NoReg) + assert(!(((rTop21 == NoReg) || (rNext16 == NoReg)))); - rResult25 = allocateFloatRegNotConflictingWith((1U << rTop23) | (1U << rNext16)); - assert(!((rResult25 == NoReg))); - shiftAmount1 = rTop23; + rResult24 = allocateFloatRegNotConflictingWith((1U << rTop21) | (1U << rNext16)); + assert(!((rResult24 == NoReg))); + shiftAmount1 = rTop21; value23 = rNext16; - result4 = rResult25; + result4 = rResult24; nativePopToReg(ssNativeTop(), shiftAmount1); ssNativePop(1); nativePopToReg(ssNativeTop(), value23); @@ -32279,13 +32500,13 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadArgumentInt64 */ baseOffset20 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult26 = (rResult27 = NoReg); - rResult26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult27 = allocateRegNotConflictingWith(1U << rResult26); - assert(!(((rResult26 == NoReg) - || (rResult27 == NoReg)))); - valueLow4 = rResult26; - valueHigh4 = rResult27; + rResult25 = (rResult26 = NoReg); + rResult25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult26 = allocateRegNotConflictingWith(1U << rResult25); + assert(!(((rResult25 == NoReg) + || (rResult26 == NoReg)))); + valueLow4 = rResult25; + valueHigh4 = rResult26; loadNativeArgumentAddressto(baseOffset20, TempReg); /* begin checkQuickConstant:forInstruction: */ anInstruction20 = genoperandoperandoperand(MoveM32rR, 0, TempReg, valueLow4); @@ -32361,13 +32582,13 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadArgumentUInt64 */ baseOffset21 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult28 = (rResult29 = NoReg); - rResult28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult29 = allocateRegNotConflictingWith(1U << rResult28); - assert(!(((rResult28 == NoReg) - || (rResult29 == NoReg)))); - valueLow5 = rResult28; - valueHigh5 = rResult29; + rResult27 = (rResult28 = NoReg); + rResult27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult28 = allocateRegNotConflictingWith(1U << rResult27); + assert(!(((rResult27 == NoReg) + || (rResult28 == NoReg)))); + valueLow5 = rResult27; + valueHigh5 = rResult28; loadNativeArgumentAddressto(baseOffset21, TempReg); /* begin checkQuickConstant:forInstruction: */ anInstruction28 = genoperandoperandoperand(MoveM32rR, 0, TempReg, valueLow5); @@ -32394,67 +32615,67 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 101: /* begin genLowcodeLoadFloat32FromMemory */ - rTop24 = NoReg; + rTop22 = NoReg; frResult8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop24 = nativeRegisterOrNone(ssNativeTop()); + rTop22 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop24 == NoReg) { - rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop22 == NoReg) { + rTop22 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult8 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop24 == NoReg) + assert(!(((rTop22 == NoReg) || (frResult8 == NoReg)))); - pointer3 = rTop24; + pointer2 = rTop22; value26 = frResult8; - nativePopToReg(ssNativeTop(), pointer3); + nativePopToReg(ssNativeTop(), pointer2); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction33 = genoperandoperandoperand(MoveM32rRs, 0, pointer3, value26); + anInstruction33 = genoperandoperandoperand(MoveM32rRs, 0, pointer2, value26); ssPushNativeRegisterSingleFloat(value26); return 0; case 102: /* begin genLowcodeLoadFloat64FromMemory */ - rTop25 = NoReg; + rTop23 = NoReg; frResult9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop25 = nativeRegisterOrNone(ssNativeTop()); + rTop23 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop25 == NoReg) { - rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop23 == NoReg) { + rTop23 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult9 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop25 == NoReg) + assert(!(((rTop23 == NoReg) || (frResult9 == NoReg)))); - pointer4 = rTop25; + pointer3 = rTop23; value27 = frResult9; - nativePopToReg(ssNativeTop(), pointer4); + nativePopToReg(ssNativeTop(), pointer3); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction34 = genoperandoperandoperand(MoveM64rRd, 0, pointer4, value27); + anInstruction34 = genoperandoperandoperand(MoveM64rRd, 0, pointer3, value27); ssPushNativeRegisterDoubleFloat(value27); return 0; case 103: /* begin genLowcodeLoadInt16FromMemory */ - rTop26 = NoReg; - rResult30 = NoReg; + rTop24 = NoReg; + rResult29 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop26 = nativeRegisterOrNone(ssNativeTop()); + rTop24 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop26 == NoReg) { - rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop24 == NoReg) { + rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult30 = allocateRegNotConflictingWith(1U << rTop26); - assert(!(((rTop26 == NoReg) - || (rResult30 == NoReg)))); - pointer5 = rTop26; - value28 = rResult30; - nativePopToReg(ssNativeTop(), pointer5); + rResult29 = allocateRegNotConflictingWith(1U << rTop24); + assert(!(((rTop24 == NoReg) + || (rResult29 == NoReg)))); + pointer4 = rTop24; + value28 = rResult29; + nativePopToReg(ssNativeTop(), pointer4); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction35 = genoperandoperandoperand(MoveM16rR, 0, pointer5, value28); + anInstruction35 = genoperandoperandoperand(MoveM16rR, 0, pointer4, value28); /* begin SignExtend16R:R: */ genoperandoperand(SignExtend16RR, value28, value28); ssPushNativeRegister(value28); @@ -32462,73 +32683,73 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 104: /* begin genLowcodeLoadInt32FromMemory */ - rTop27 = NoReg; - rResult31 = NoReg; + rTop25 = NoReg; + rResult30 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop27 = nativeRegisterOrNone(ssNativeTop()); + rTop25 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop27 == NoReg) { - rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop25 == NoReg) { + rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult31 = allocateRegNotConflictingWith(1U << rTop27); - assert(!(((rTop27 == NoReg) - || (rResult31 == NoReg)))); - pointer6 = rTop27; - value29 = rResult31; - nativePopToReg(ssNativeTop(), pointer6); + rResult30 = allocateRegNotConflictingWith(1U << rTop25); + assert(!(((rTop25 == NoReg) + || (rResult30 == NoReg)))); + pointer5 = rTop25; + value29 = rResult30; + nativePopToReg(ssNativeTop(), pointer5); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction36 = genoperandoperandoperand(MoveM32rR, 0, pointer6, value29); + anInstruction36 = genoperandoperandoperand(MoveM32rR, 0, pointer5, value29); ssPushNativeRegister(value29); return 0; case 105: /* begin genLowcodeLoadInt64FromMemory */ /* begin allocateRegistersForLowcodeIntegerResultInteger2: */ - rTop28 = NoReg; - rResult32 = (rResult32 = NoReg); + rTop26 = NoReg; + rResult31 = (rResult31 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop28 = nativeRegisterOrNone(ssNativeTop()); + rTop26 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop28 == NoReg) { - rTop28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop26 == NoReg) { + rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult32 = allocateRegNotConflictingWith(1U << rTop28); - rResult210 = allocateRegNotConflictingWith((1U << rTop28) | (1U << rResult32)); - assert(!(((rTop28 == NoReg) - || ((rResult32 == NoReg) + rResult31 = allocateRegNotConflictingWith(1U << rTop26); + rResult210 = allocateRegNotConflictingWith((1U << rTop26) | (1U << rResult31)); + assert(!(((rTop26 == NoReg) + || ((rResult31 == NoReg) || (rResult210 == NoReg))))); - pointer7 = rTop28; - valueLow6 = rResult32; + pointer6 = rTop26; + valueLow6 = rResult31; valueHigh6 = rResult210; - nativePopToReg(ssNativeTop(), pointer7); + nativePopToReg(ssNativeTop(), pointer6); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction37 = genoperandoperandoperand(MoveM32rR, 0, pointer7, valueLow6); + anInstruction37 = genoperandoperandoperand(MoveM32rR, 0, pointer6, valueLow6); /* begin checkQuickConstant:forInstruction: */ - anInstruction112 = genoperandoperandoperand(MoveM32rR, 4, pointer7, valueHigh6); + anInstruction112 = genoperandoperandoperand(MoveM32rR, 4, pointer6, valueHigh6); ssPushNativeRegistersecondRegister(valueLow6, valueHigh6); return 0; case 106: /* begin genLowcodeLoadInt8FromMemory */ - rTop29 = NoReg; - rResult33 = NoReg; + rTop27 = NoReg; + rResult32 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop29 = nativeRegisterOrNone(ssNativeTop()); + rTop27 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop29 == NoReg) { - rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop27 == NoReg) { + rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult33 = allocateRegNotConflictingWith(1U << rTop29); - assert(!(((rTop29 == NoReg) - || (rResult33 == NoReg)))); - pointer8 = rTop29; - value31 = rResult33; - nativePopToReg(ssNativeTop(), pointer8); + rResult32 = allocateRegNotConflictingWith(1U << rTop27); + assert(!(((rTop27 == NoReg) + || (rResult32 == NoReg)))); + pointer7 = rTop27; + value31 = rResult32; + nativePopToReg(ssNativeTop(), pointer7); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction38 = genoperandoperandoperand(MoveM8rR, 0, pointer8, value31); + anInstruction38 = genoperandoperandoperand(MoveM8rR, 0, pointer7, value31); /* begin SignExtend8R:R: */ genoperandoperand(SignExtend8RR, value31, value31); ssPushNativeRegister(value31); @@ -32613,12 +32834,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadLocalInt64 */ baseOffset22 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult34 = (rResult211 = NoReg); - rResult34 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult211 = allocateRegNotConflictingWith(1U << rResult34); - assert(!(((rResult34 == NoReg) + rResult33 = (rResult211 = NoReg); + rResult33 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult211 = allocateRegNotConflictingWith(1U << rResult33); + assert(!(((rResult33 == NoReg) || (rResult211 == NoReg)))); - valueLow7 = rResult34; + valueLow7 = rResult33; valueHigh7 = rResult211; loadNativeLocalAddressto(baseOffset22, TempReg); /* begin checkQuickConstant:forInstruction: */ @@ -32695,12 +32916,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadLocalUInt64 */ baseOffset23 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult35 = (rResult212 = NoReg); - rResult35 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult212 = allocateRegNotConflictingWith(1U << rResult35); - assert(!(((rResult35 == NoReg) + rResult34 = (rResult212 = NoReg); + rResult34 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult212 = allocateRegNotConflictingWith(1U << rResult34); + assert(!(((rResult34 == NoReg) || (rResult212 == NoReg)))); - valueLow8 = rResult35; + valueLow8 = rResult34; valueHigh8 = rResult212; loadNativeLocalAddressto(baseOffset23, TempReg); /* begin checkQuickConstant:forInstruction: */ @@ -32728,31 +32949,31 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 119: /* begin genLowcodeLoadObjectAt */ - rTop30 = (rOopTop3 = NoReg); - topRegisterMask1 = 0; + rTop28 = (rOopTop = NoReg); + topRegisterMask = 0; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop30 = nativeRegisterOrNone(ssNativeTop()); + rTop28 = nativeRegisterOrNone(ssNativeTop()); } if ((registerOrNone(ssTop())) != NoReg) { - rOopTop3 = registerOrNone(ssTop()); + rOopTop = registerOrNone(ssTop()); /* begin registerMaskFor: */ - topRegisterMask1 = 1U << rOopTop3; + topRegisterMask = 1U << rOopTop; } - if (rTop30 == NoReg) { - rTop30 = allocateRegNotConflictingWith(topRegisterMask1); + if (rTop28 == NoReg) { + rTop28 = allocateRegNotConflictingWith(topRegisterMask); } - if (rOopTop3 == NoReg) { - rOopTop3 = allocateRegNotConflictingWith(1U << rTop30); + if (rOopTop == NoReg) { + rOopTop = allocateRegNotConflictingWith(1U << rTop28); } - assert(!(((rTop30 == NoReg) - || (rOopTop3 == NoReg)))); - fieldIndex = rTop30; - object2 = rOopTop3; + assert(!(((rTop28 == NoReg) + || (rOopTop == NoReg)))); + fieldIndex = rTop28; + object = rOopTop; nativePopToReg(ssNativeTop(), fieldIndex); ssNativePop(1); - popToReg(ssTop(), object2); + popToReg(ssTop(), object); ssPop(1); - genLcLoadObjectat(object2, fieldIndex); + genLcLoadObjectat(object, fieldIndex); return 0; default: @@ -32771,7 +32992,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; - AbstractInstruction *abstractInstruction12; + AbstractInstruction *abstractInstruction11; AbstractInstruction *abstractInstruction2; AbstractInstruction *abstractInstruction3; AbstractInstruction *abstractInstruction4; @@ -32827,6 +33048,12 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt frTop; sqInt frTop1; sqInt i1; + sqInt i2; + sqInt i3; + sqInt i4; + sqInt i5; + sqInt i6; + sqInt i7; sqInt index1; sqInt nativeValueIndex; sqInt nativeValueIndex1; @@ -32855,10 +33082,11 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt pointer7; sqInt pointer8; sqInt pointerResult; - sqInt pointerValue9; + sqInt pointerValue7; sqInt quickConstant; sqInt reg; sqInt reg1; + sqInt reg10; sqInt reg11; sqInt reg13; sqInt reg14; @@ -32868,7 +33096,6 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt reg3; sqInt reg4; sqInt reg5; - sqInt reg6; sqInt reg7; sqInt reg9; sqInt registerID; @@ -32883,7 +33110,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt rNext; sqInt rNext1; sqInt rNext10; - sqInt rNext12; + sqInt rNext13; sqInt rNext14; sqInt rNext15; sqInt rNext2; @@ -32915,9 +33142,8 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt rTop; sqInt rTop1; sqInt rTop10; - sqInt rTop13; sqInt rTop14; - sqInt rTop15; + sqInt rTop16; sqInt rTop17; sqInt rTop18; sqInt rTop2; @@ -32934,6 +33160,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt rTop3; sqInt rTop30; sqInt rTop31; + sqInt rTop32; sqInt rTop4; sqInt rTop5; sqInt rTop6; @@ -32967,9 +33194,9 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt topRegistersMask2; sqInt topRegistersMask3; sqInt topRegistersMask4; - sqInt topRegistersMask5; sqInt topRegistersMask6; sqInt topRegistersMask8; + sqInt topRegistersMask9; sqInt value; sqInt value1; sqInt value10; @@ -33183,7 +33410,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 0x7F: /* begin genLowcodeLockRegisters */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); return 0; @@ -33194,139 +33429,155 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 129: /* begin genLowcodeMalloc32 */ - rTop5 = NoReg; - rResult5 = NoReg; + rTop28 = NoReg; + rResult8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop28 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop28 == NoReg) { + rTop28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult5 = allocateRegNotConflictingWith(1U << rTop5); - assert(!(((rTop5 == NoReg) - || (rResult5 == NoReg)))); - size1 = rTop5; - pointer5 = rResult5; + rResult8 = allocateRegNotConflictingWith(1U << rTop28); + assert(!(((rTop28 == NoReg) + || (rResult8 == NoReg)))); + size1 = rTop28; + pointer7 = rResult8; nativePopToReg(ssNativeTop(), size1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 <= simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); if (size1 != ReceiverResultReg) { /* begin MoveR:R: */ genoperandoperand(MoveRR, size1, ReceiverResultReg); } /* begin CallRT: */ - abstractInstruction2 = genoperand(Call, ceMallocTrampoline); - (abstractInstruction2->annotation = IsRelativeCall); + abstractInstruction3 = genoperand(Call, ceMallocTrampoline); + (abstractInstruction3->annotation = IsRelativeCall); /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, pointer5); - ssPushNativeRegister(pointer5); + genoperandoperand(MoveRR, TempReg, pointer7); + ssPushNativeRegister(pointer7); return 0; case 130: /* begin genLowcodeMalloc64 */ /* begin allocateRegistersForLowcodeInteger2ResultInteger: */ - topRegistersMask = 0; - rTop6 = (rNext = NoReg); - rResult6 = NoReg; + topRegistersMask12 = 0; + rTop29 = (rNext10 = NoReg); + rResult9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop29 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext = nativeRegisterSecondOrNone(ssNativeTop()); + rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext == NoReg) { + if (rNext10 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg = (rNext = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask = 1U << reg; + reg15 = (rNext10 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask12 = 1U << reg15; } } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(topRegistersMask); + if (rTop29 == NoReg) { + rTop29 = allocateRegNotConflictingWith(topRegistersMask12); } - if (rNext == NoReg) { - rNext = allocateRegNotConflictingWith(1U << rTop6); + if (rNext10 == NoReg) { + rNext10 = allocateRegNotConflictingWith(1U << rTop29); } - assert(!(((rTop6 == NoReg) - || (rNext == NoReg)))); - rResult6 = allocateFloatRegNotConflictingWith((1U << rTop6) | (1U << rNext)); - assert(!((rResult6 == NoReg))); - sizeLow = rTop6; - sizeHigh = rNext; - pointer6 = rResult6; + assert(!(((rTop29 == NoReg) + || (rNext10 == NoReg)))); + rResult9 = allocateFloatRegNotConflictingWith((1U << rTop29) | (1U << rNext10)); + assert(!((rResult9 == NoReg))); + sizeLow = rTop29; + sizeHigh = rNext10; + pointer8 = rResult9; nativePopToRegsecondReg(ssNativeTop(), sizeLow, sizeHigh); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 <= simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); if (sizeLow != ReceiverResultReg) { /* begin MoveR:R: */ genoperandoperand(MoveRR, sizeLow, ReceiverResultReg); } /* begin CallRT: */ - abstractInstruction3 = genoperand(Call, ceMallocTrampoline); - (abstractInstruction3->annotation = IsRelativeCall); + abstractInstruction4 = genoperand(Call, ceMallocTrampoline); + (abstractInstruction4->annotation = IsRelativeCall); /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, pointer6); - ssPushNativeRegister(pointer6); + genoperandoperand(MoveRR, TempReg, pointer8); + ssPushNativeRegister(pointer8); return 0; case 131: /* begin genLowcodeMemcpy32 */ - rTop7 = (rNext1 = (rNextNext = NoReg)); - nativeValueIndex = 1; + rTop30 = (rNext13 = (rNextNext2 = NoReg)); + nativeValueIndex2 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop30 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext13 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext1 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNextNext = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex)); + if (rNext13 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNext13 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNextNext2 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2)); } - nativeValueIndex += 1; + nativeValueIndex2 += 1; } } - if (rNextNext == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + if (rNextNext2 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNextNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); } } - if (rTop7 == NoReg) { - nextRegisterMask = 0; - if (rNext1 != NoReg) { + if (rTop30 == NoReg) { + nextRegisterMask2 = 0; + if (rNext13 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1U << rNext1; + nextRegisterMask2 = 1U << rNext13; } - if (rNextNext != NoReg) { - nextRegisterMask = nextRegisterMask | (1U << rNextNext); + if (rNextNext2 != NoReg) { + nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); } - rTop7 = allocateRegNotConflictingWith(nextRegisterMask); + rTop30 = allocateRegNotConflictingWith(nextRegisterMask2); } - if (rNext1 == NoReg) { + if (rNext13 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1U << rTop7; - if (rNextNext != NoReg) { - nextRegisterMask = nextRegisterMask | (1U << rNextNext); + nextRegisterMask2 = 1U << rTop30; + if (rNextNext2 != NoReg) { + nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); } - rNext1 = allocateRegNotConflictingWith(nextRegisterMask); + rNext13 = allocateRegNotConflictingWith(nextRegisterMask2); } - if (rNextNext == NoReg) { + if (rNextNext2 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask = (1U << rTop7) | (1U << rNext1); - rNextNext = allocateRegNotConflictingWith(nextRegisterMask); + nextRegisterMask2 = (1U << rTop30) | (1U << rNext13); + rNextNext2 = allocateRegNotConflictingWith(nextRegisterMask2); } - assert(!(((rTop7 == NoReg) - || ((rNext1 == NoReg) - || (rNextNext == NoReg))))); - size3 = rTop7; - source = rNext1; - dest = rNextNext; + assert(!(((rTop30 == NoReg) + || ((rNext13 == NoReg) + || (rNextNext2 == NoReg))))); + size3 = rTop30; + source = rNext13; + dest = rNextNext2; nativePopToReg(ssNativeTop(), size3); ssNativePop(1); nativePopToReg(ssNativeTop(), source); @@ -33334,65 +33585,73 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) nativePopToReg(ssNativeTop(), dest); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i5 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i5 <= simStackPtr; i5 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i5), frameOffsetOfTemporary(i5 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytosize(backEnd, source, dest, size3); return 0; case 132: /* begin genLowcodeMemcpy64 */ - rTop8 = (rNext2 = (rNextNext1 = NoReg)); - nativeValueIndex1 = 1; + rTop31 = (rNext14 = (rNextNext3 = NoReg)); + nativeValueIndex3 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop8 = nativeRegisterOrNone(ssNativeTop()); + rTop31 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext2 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNextNext1 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1)); + if (rNext14 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNext14 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNextNext3 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3)); } - nativeValueIndex1 += 1; + nativeValueIndex3 += 1; } } - if (rNextNext1 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNextNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); + if (rNextNext3 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNextNext3 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); } } - if (rTop8 == NoReg) { - nextRegisterMask1 = 0; - if (rNext2 != NoReg) { + if (rTop31 == NoReg) { + nextRegisterMask3 = 0; + if (rNext14 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1U << rNext2; + nextRegisterMask3 = 1U << rNext14; } - if (rNextNext1 != NoReg) { - nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); + if (rNextNext3 != NoReg) { + nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); } - rTop8 = allocateRegNotConflictingWith(nextRegisterMask1); + rTop31 = allocateRegNotConflictingWith(nextRegisterMask3); } - if (rNext2 == NoReg) { + if (rNext14 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1U << rTop8; - if (rNextNext1 != NoReg) { - nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); + nextRegisterMask3 = 1U << rTop31; + if (rNextNext3 != NoReg) { + nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); } - rNext2 = allocateRegNotConflictingWith(nextRegisterMask1); + rNext14 = allocateRegNotConflictingWith(nextRegisterMask3); } - if (rNextNext1 == NoReg) { + if (rNextNext3 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask1 = (1U << rTop8) | (1U << rNext2); - rNextNext1 = allocateRegNotConflictingWith(nextRegisterMask1); + nextRegisterMask3 = (1U << rTop31) | (1U << rNext14); + rNextNext3 = allocateRegNotConflictingWith(nextRegisterMask3); } - assert(!(((rTop8 == NoReg) - || ((rNext2 == NoReg) - || (rNextNext1 == NoReg))))); - size4 = rTop8; - source1 = rNext2; - dest1 = rNextNext1; + assert(!(((rTop31 == NoReg) + || ((rNext14 == NoReg) + || (rNextNext3 == NoReg))))); + size4 = rTop31; + source1 = rNext14; + dest1 = rNextNext3; nativePopToReg(ssNativeTop(), size4); ssNativePop(1); nativePopToReg(ssNativeTop(), source1); @@ -33400,7 +33659,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) nativePopToReg(ssNativeTop(), dest1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i6 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i6 <= simStackPtr; i6 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i6), frameOffsetOfTemporary(i6 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytosize(backEnd, source1, dest1, sizeLow1); return 0; @@ -33409,44 +33676,52 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodeMemcpyFixed */ size5 = extA; /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask1 = 0; - rTop9 = (rNext3 = NoReg); + topRegistersMask13 = 0; + rTop32 = (rNext15 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop9 = nativeRegisterOrNone(ssNativeTop()); + rTop32 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext3 == NoReg) { + if (rNext15 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg2 = (rNext3 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask1 = 1U << reg2; + reg16 = (rNext15 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask13 = 1U << reg16; } } - if (rTop9 == NoReg) { - rTop9 = allocateRegNotConflictingWith(topRegistersMask1); + if (rTop32 == NoReg) { + rTop32 = allocateRegNotConflictingWith(topRegistersMask13); } - if (rNext3 == NoReg) { - rNext3 = allocateRegNotConflictingWith(1U << rTop9); + if (rNext15 == NoReg) { + rNext15 = allocateRegNotConflictingWith(1U << rTop32); } - assert(!(((rTop9 == NoReg) - || (rNext3 == NoReg)))); - source2 = rTop9; - dest2 = rNext3; + assert(!(((rTop32 == NoReg) + || (rNext15 == NoReg)))); + source2 = rTop32; + dest2 = rNext15; nativePopToReg(ssNativeTop(), source2); ssNativePop(1); nativePopToReg(ssNativeTop(), dest2); ssNativePop(1); if (size5 == BytesPerWord) { /* begin checkQuickConstant:forInstruction: */ - anInstruction10 = genoperandoperandoperand(MoveMwrR, 0, source2, TempReg); + anInstruction23 = genoperandoperandoperand(MoveMwrR, 0, source2, TempReg); /* begin checkQuickConstant:forInstruction: */ - anInstruction13 = genoperandoperandoperand(MoveRMwr, TempReg, 0, dest2); + anInstruction110 = genoperandoperandoperand(MoveRMwr, TempReg, 0, dest2); } else { /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i7 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i7 <= simStackPtr; i7 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i7), frameOffsetOfTemporary(i7 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytoconstantSize(backEnd, source2, dest2, size5); } @@ -33495,31 +33770,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 139: /* begin genLowcodeMul32 */ - topRegistersMask2 = 0; - rTop10 = (rNext4 = NoReg); + topRegistersMask = 0; + rTop5 = (rNext = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop10 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext4 == NoReg) { + if (rNext == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg3 = (rNext4 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask2 = 1U << reg3; + reg = (rNext = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask = 1U << reg; } } - if (rTop10 == NoReg) { - rTop10 = allocateRegNotConflictingWith(topRegistersMask2); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(topRegistersMask); } - if (rNext4 == NoReg) { - rNext4 = allocateRegNotConflictingWith(1U << rTop10); + if (rNext == NoReg) { + rNext = allocateRegNotConflictingWith(1U << rTop5); } - assert(!(((rTop10 == NoReg) - || (rNext4 == NoReg)))); - second = rTop10; - first = rNext4; + assert(!(((rTop5 == NoReg) + || (rNext == NoReg)))); + second = rTop5; + first = rNext; nativePopToReg(ssNativeTop(), second); ssNativePop(1); nativePopToReg(ssNativeTop(), first); @@ -33531,35 +33806,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 140: /* begin genLowcodeMul64 */ - topRegistersMask3 = 0; - rTop13 = (rNext5 = NoReg); - rResult7 = NoReg; + topRegistersMask1 = 0; + rTop6 = (rNext1 = NoReg); + rResult5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop13 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext5 == NoReg) { + if (rNext1 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg4 = (rNext5 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask3 = 1U << reg4; + reg2 = (rNext1 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask1 = 1U << reg2; } } - if (rTop13 == NoReg) { - rTop13 = allocateRegNotConflictingWith(topRegistersMask3); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(topRegistersMask1); } - if (rNext5 == NoReg) { - rNext5 = allocateRegNotConflictingWith(1U << rTop13); + if (rNext1 == NoReg) { + rNext1 = allocateRegNotConflictingWith(1U << rTop6); } - assert(!(((rTop13 == NoReg) - || (rNext5 == NoReg)))); - rResult7 = allocateFloatRegNotConflictingWith((1U << rTop13) | (1U << rNext5)); - assert(!((rResult7 == NoReg))); - second1 = rTop13; - first1 = rNext5; - result = rResult7; + assert(!(((rTop6 == NoReg) + || (rNext1 == NoReg)))); + rResult5 = allocateFloatRegNotConflictingWith((1U << rTop6) | (1U << rNext1)); + assert(!((rResult5 == NoReg))); + second1 = rTop6; + first1 = rNext1; + result = rResult5; nativePopToReg(ssNativeTop(), second1); ssNativePop(1); nativePopToReg(ssNativeTop(), first1); @@ -33569,15 +33844,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 141: /* begin genLowcodeNeg32 */ - rTop14 = NoReg; + rTop7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop14 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop14 == NoReg) { - rTop14 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop14 == NoReg))); - value4 = rTop14; + assert(!((rTop7 == NoReg))); + value4 = rTop7; nativePopToReg(ssNativeTop(), value4); ssNativePop(1); /* begin NegateR: */ @@ -33588,31 +33863,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 142: /* begin genLowcodeNeg64 */ /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask4 = 0; - rTop15 = (rNext6 = NoReg); + topRegistersMask2 = 0; + rTop8 = (rNext2 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop15 = nativeRegisterOrNone(ssNativeTop()); + rTop8 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext6 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext6 == NoReg) { + if (rNext2 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg5 = (rNext6 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask4 = 1U << reg5; + reg3 = (rNext2 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask2 = 1U << reg3; } } - if (rTop15 == NoReg) { - rTop15 = allocateRegNotConflictingWith(topRegistersMask4); + if (rTop8 == NoReg) { + rTop8 = allocateRegNotConflictingWith(topRegistersMask2); } - if (rNext6 == NoReg) { - rNext6 = allocateRegNotConflictingWith(1U << rTop15); + if (rNext2 == NoReg) { + rNext2 = allocateRegNotConflictingWith(1U << rTop8); } - assert(!(((rTop15 == NoReg) - || (rNext6 == NoReg)))); - valueLow1 = rTop15; - valueHigh1 = rNext6; + assert(!(((rTop8 == NoReg) + || (rNext2 == NoReg)))); + valueLow1 = rTop8; + valueHigh1 = rNext2; nativePopToRegsecondReg(ssNativeTop(), valueLow1, valueHigh1); ssNativePop(1); /* begin NotR: */ @@ -33620,23 +33895,23 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin NotR: */ genoperand(NotR, valueHigh1); /* begin checkQuickConstant:forInstruction: */ - anInstruction15 = genoperandoperand(AddCqR, 1, valueLow1); + anInstruction10 = genoperandoperand(AddCqR, 1, valueLow1); /* begin checkQuickConstant:forInstruction: */ - anInstruction14 = genoperandoperand(AddcCqR, 0, valueHigh1); + anInstruction13 = genoperandoperand(AddcCqR, 0, valueHigh1); ssPushNativeRegistersecondRegister(valueLow1, valueHigh1); return 0; case 143: /* begin genLowcodeNot32 */ - rTop17 = NoReg; + rTop9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop17 = nativeRegisterOrNone(ssNativeTop()); + rTop9 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop17 == NoReg) { - rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop9 == NoReg) { + rTop9 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop17 == NoReg))); - value6 = rTop17; + assert(!((rTop9 == NoReg))); + value6 = rTop9; nativePopToReg(ssNativeTop(), value6); ssNativePop(1); /* begin NotR: */ @@ -33647,31 +33922,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 144: /* begin genLowcodeNot64 */ /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask5 = 0; - rTop18 = (rNext7 = NoReg); + topRegistersMask3 = 0; + rTop10 = (rNext3 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop18 = nativeRegisterOrNone(ssNativeTop()); + rTop10 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext7 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext7 == NoReg) { + if (rNext3 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg6 = (rNext7 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask5 = 1U << reg6; + reg4 = (rNext3 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask3 = 1U << reg4; } } - if (rTop18 == NoReg) { - rTop18 = allocateRegNotConflictingWith(topRegistersMask5); + if (rTop10 == NoReg) { + rTop10 = allocateRegNotConflictingWith(topRegistersMask3); } - if (rNext7 == NoReg) { - rNext7 = allocateRegNotConflictingWith(1U << rTop18); + if (rNext3 == NoReg) { + rNext3 = allocateRegNotConflictingWith(1U << rTop10); } - assert(!(((rTop18 == NoReg) - || (rNext7 == NoReg)))); - valueLow2 = rTop18; - valueHigh2 = rNext7; + assert(!(((rTop10 == NoReg) + || (rNext3 == NoReg)))); + valueLow2 = rTop10; + valueHigh2 = rNext3; nativePopToRegsecondReg(ssNativeTop(), valueLow2, valueHigh2); ssNativePop(1); /* begin NotR: */ @@ -33683,35 +33958,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 145: /* begin genLowcodeOr32 */ - topRegistersMask6 = 0; - rTop20 = (rNext8 = NoReg); - rResult8 = NoReg; + topRegistersMask4 = 0; + rTop14 = (rNext4 = NoReg); + rResult6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop20 = nativeRegisterOrNone(ssNativeTop()); + rTop14 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext8 == NoReg) { + if (rNext4 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg7 = (rNext8 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask6 = 1U << reg7; + reg5 = (rNext4 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask4 = 1U << reg5; } } - if (rTop20 == NoReg) { - rTop20 = allocateRegNotConflictingWith(topRegistersMask6); + if (rTop14 == NoReg) { + rTop14 = allocateRegNotConflictingWith(topRegistersMask4); } - if (rNext8 == NoReg) { - rNext8 = allocateRegNotConflictingWith(1U << rTop20); + if (rNext4 == NoReg) { + rNext4 = allocateRegNotConflictingWith(1U << rTop14); } - assert(!(((rTop20 == NoReg) - || (rNext8 == NoReg)))); - rResult8 = allocateFloatRegNotConflictingWith((1U << rTop20) | (1U << rNext8)); - assert(!((rResult8 == NoReg))); - second2 = rTop20; - first2 = rNext8; - result1 = rResult8; + assert(!(((rTop14 == NoReg) + || (rNext4 == NoReg)))); + rResult6 = allocateFloatRegNotConflictingWith((1U << rTop14) | (1U << rNext4)); + assert(!((rResult6 == NoReg))); + second2 = rTop14; + first2 = rNext4; + result1 = rResult6; nativePopToReg(ssNativeTop(), second2); ssNativePop(1); nativePopToReg(ssNativeTop(), first2); @@ -33724,83 +33999,83 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 146: /* begin genLowcodeOr64 */ /* begin allocateRegistersForLowcodeInteger4: */ - rTop21 = (rNext9 = (rNextNext2 = (rNextNextNext = NoReg))); - nativeValueIndex2 = 1; + rTop16 = (rNext5 = (rNextNext = (rNextNextNext = NoReg))); + nativeValueIndex = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop21 = nativeRegisterOrNone(ssNativeTop()); + rTop16 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext9 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNext9 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); + if (rNext5 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNext5 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); } - nativeValueIndex2 += 1; + nativeValueIndex += 1; } } - if (rNextNext2 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNextNext = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2)); + if (rNextNext == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNextNext = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex)); } - nativeValueIndex2 += 1; + nativeValueIndex += 1; } } if (rNextNextNext == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); - nativeValueIndex2 += 1; + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + nativeValueIndex += 1; } } - if (rTop21 == NoReg) { - nextRegisterMask2 = 0; - if (rNext9 != NoReg) { + if (rTop16 == NoReg) { + nextRegisterMask = 0; + if (rNext5 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask2 = 1U << rNext9; + nextRegisterMask = 1U << rNext5; } - if (rNextNext2 != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); + if (rNextNext != NoReg) { + nextRegisterMask = nextRegisterMask | (1U << rNextNext); } if (rNextNextNext != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNextNext); + nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rTop21 = allocateRegNotConflictingWith(nextRegisterMask2); + rTop16 = allocateRegNotConflictingWith(nextRegisterMask); } - if (rNext9 == NoReg) { + if (rNext5 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask2 = 1U << rTop21; - if (rNextNext2 != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); + nextRegisterMask = 1U << rTop16; + if (rNextNext != NoReg) { + nextRegisterMask = nextRegisterMask | (1U << rNextNext); } if (rNextNextNext != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNextNext); + nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rNext9 = allocateRegNotConflictingWith(nextRegisterMask2); + rNext5 = allocateRegNotConflictingWith(nextRegisterMask); } - if (rNextNext2 == NoReg) { + if (rNextNext == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask2 = (1U << rTop21) | (1U << rNext9); + nextRegisterMask = (1U << rTop16) | (1U << rNext5); if (rNextNextNext != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNextNext); + nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rNextNext2 = allocateRegNotConflictingWith(nextRegisterMask2); + rNextNext = allocateRegNotConflictingWith(nextRegisterMask); } if (rNextNextNext == NoReg) { /* begin registerMaskFor:and:and: */ - nextRegisterMask2 = ((1U << rTop21) | (1U << rNext9)) | (1U << rNextNext2); - rNextNextNext = allocateRegNotConflictingWith(nextRegisterMask2); + nextRegisterMask = ((1U << rTop16) | (1U << rNext5)) | (1U << rNextNext); + rNextNextNext = allocateRegNotConflictingWith(nextRegisterMask); } - assert(!(((rTop21 == NoReg) - || ((rNext9 == NoReg) - || ((rNextNext2 == NoReg) + assert(!(((rTop16 == NoReg) + || ((rNext5 == NoReg) + || ((rNextNext == NoReg) || (rNextNextNext == NoReg)))))); - secondLow1 = rTop21; - secondHigh1 = rNext9; - firstLow1 = rNextNext2; + secondLow1 = rTop16; + secondHigh1 = rNext5; + firstLow1 = rNextNext; firstHigh1 = rNextNextNext; nativePopToRegsecondReg(ssNativeTop(), secondLow1, secondHigh1); ssNativePop(1); @@ -33817,7 +34092,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodePerformCallout */ callSwitchToCStack(); /* begin checkLiteral:forInstruction: */ - anInstruction16 = genoperandoperand(MoveCwR, extA, TempReg); + anInstruction14 = genoperandoperand(MoveCwR, extA, TempReg); /* begin CallRT: */ abstractInstruction = genoperand(Call, ceFFICalloutTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -33833,11 +34108,11 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) ssNativePop(1); callSwitchToCStack(); /* begin CallRT: */ - abstractInstruction4 = genoperand(Call, ceFFICalloutTrampoline); - (abstractInstruction4->annotation = IsRelativeCall); + abstractInstruction2 = genoperand(Call, ceFFICalloutTrampoline); + (abstractInstruction2->annotation = IsRelativeCall); /* begin annotateBytecode: */ - abstractInstruction12 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); - (abstractInstruction12->annotation = HasBytecodePC); + abstractInstruction11 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); + (abstractInstruction11->annotation = HasBytecodePC); return 0; case 149: @@ -33886,19 +34161,19 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodePointerAddConstantOffset */ offset4 = extB; /* begin allocateRegistersForLowcodeInteger: */ - rTop22 = NoReg; + rTop17 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop22 = nativeRegisterOrNone(ssNativeTop()); + rTop17 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop22 == NoReg) { - rTop22 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop17 == NoReg) { + rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop22 == NoReg))); - base = rTop22; + assert(!((rTop17 == NoReg))); + base = rTop17; nativePopToReg(ssNativeTop(), base); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction17 = genoperandoperand(AddCqR, offset4, base); + anInstruction15 = genoperandoperand(AddCqR, offset4, base); ssPushNativeRegister(base); extB = 0; numExtB = 0; @@ -33906,31 +34181,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 163: /* begin genLowcodePointerAddOffset32 */ - topRegistersMask8 = 0; - rTop23 = (rNext10 = NoReg); + topRegistersMask6 = 0; + rTop18 = (rNext6 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop23 = nativeRegisterOrNone(ssNativeTop()); + rTop18 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext6 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext10 == NoReg) { + if (rNext6 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg9 = (rNext10 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask8 = 1U << reg9; + reg7 = (rNext6 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask6 = 1U << reg7; } } - if (rTop23 == NoReg) { - rTop23 = allocateRegNotConflictingWith(topRegistersMask8); + if (rTop18 == NoReg) { + rTop18 = allocateRegNotConflictingWith(topRegistersMask6); } - if (rNext10 == NoReg) { - rNext10 = allocateRegNotConflictingWith(1U << rTop23); + if (rNext6 == NoReg) { + rNext6 = allocateRegNotConflictingWith(1U << rTop18); } - assert(!(((rTop23 == NoReg) - || (rNext10 == NoReg)))); - offset5 = rTop23; - base1 = rNext10; + assert(!(((rTop18 == NoReg) + || (rNext6 == NoReg)))); + offset5 = rTop18; + base1 = rNext6; nativePopToReg(ssNativeTop(), offset5); ssNativePop(1); nativePopToReg(ssNativeTop(), base1); @@ -33943,58 +34218,58 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 164: /* begin genLowcodePointerAddOffset64 */ /* begin allocateRegistersForLowcodeInteger3: */ - rTop24 = (rNext12 = (rNextNext3 = NoReg)); - nativeValueIndex3 = 1; + rTop20 = (rNext7 = (rNextNext1 = NoReg)); + nativeValueIndex1 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop24 = nativeRegisterOrNone(ssNativeTop()); + rTop20 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext12 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext7 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext12 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { - rNext12 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { - rNextNext3 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3)); + if (rNext7 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { + rNext7 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { + rNextNext1 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1)); } - nativeValueIndex3 += 1; + nativeValueIndex1 += 1; } } - if (rNextNext3 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { - rNextNext3 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); + if (rNextNext1 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { + rNextNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); } } - if (rTop24 == NoReg) { - nextRegisterMask3 = 0; - if (rNext12 != NoReg) { + if (rTop20 == NoReg) { + nextRegisterMask1 = 0; + if (rNext7 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask3 = 1U << rNext12; + nextRegisterMask1 = 1U << rNext7; } - if (rNextNext3 != NoReg) { - nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); + if (rNextNext1 != NoReg) { + nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); } - rTop24 = allocateRegNotConflictingWith(nextRegisterMask3); + rTop20 = allocateRegNotConflictingWith(nextRegisterMask1); } - if (rNext12 == NoReg) { + if (rNext7 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask3 = 1U << rTop24; - if (rNextNext3 != NoReg) { - nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); + nextRegisterMask1 = 1U << rTop20; + if (rNextNext1 != NoReg) { + nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); } - rNext12 = allocateRegNotConflictingWith(nextRegisterMask3); + rNext7 = allocateRegNotConflictingWith(nextRegisterMask1); } - if (rNextNext3 == NoReg) { + if (rNextNext1 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask3 = (1U << rTop24) | (1U << rNext12); - rNextNext3 = allocateRegNotConflictingWith(nextRegisterMask3); + nextRegisterMask1 = (1U << rTop20) | (1U << rNext7); + rNextNext1 = allocateRegNotConflictingWith(nextRegisterMask1); } - assert(!(((rTop24 == NoReg) - || ((rNext12 == NoReg) - || (rNextNext3 == NoReg))))); - offsetLow = rTop24; - offsetHigh = rNext12; - base2 = rNextNext3; + assert(!(((rTop20 == NoReg) + || ((rNext7 == NoReg) + || (rNextNext1 == NoReg))))); + offsetLow = rTop20; + offsetHigh = rNext7; + base2 = rNextNext1; nativePopToRegsecondReg(ssNativeTop(), offsetLow, offsetHigh); ssNativePop(1); nativePopToReg(ssNativeTop(), base2); @@ -34006,31 +34281,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 165: /* begin genLowcodePointerEqual */ - topRegistersMask10 = 0; - rTop25 = (rNext14 = NoReg); + topRegistersMask8 = 0; + rTop21 = (rNext8 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop25 = nativeRegisterOrNone(ssNativeTop()); + rTop21 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext14 == NoReg) { + if (rNext8 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg15 = (rNext14 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask10 = 1U << reg15; + reg9 = (rNext8 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask8 = 1U << reg9; } } - if (rTop25 == NoReg) { - rTop25 = allocateRegNotConflictingWith(topRegistersMask10); + if (rTop21 == NoReg) { + rTop21 = allocateRegNotConflictingWith(topRegistersMask8); } - if (rNext14 == NoReg) { - rNext14 = allocateRegNotConflictingWith(1U << rTop25); + if (rNext8 == NoReg) { + rNext8 = allocateRegNotConflictingWith(1U << rTop21); } - assert(!(((rTop25 == NoReg) - || (rNext14 == NoReg)))); - second4 = rTop25; - first4 = rNext14; + assert(!(((rTop21 == NoReg) + || (rNext8 == NoReg)))); + second4 = rTop21; + first4 = rNext8; nativePopToReg(ssNativeTop(), second4); ssNativePop(1); nativePopToReg(ssNativeTop(), first4); @@ -34040,43 +34315,43 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin JumpNonZero: */ falseJump = genConditionalBranchoperand(JumpNonZero, ((sqInt)0)); /* begin checkQuickConstant:forInstruction: */ - anInstruction19 = genoperandoperand(MoveCqR, 1, first4); + anInstruction17 = genoperandoperand(MoveCqR, 1, first4); /* begin Jump: */ contJump = genoperand(Jump, ((sqInt)0)); jmpTarget(falseJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); /* begin checkQuickConstant:forInstruction: */ - anInstruction18 = genoperandoperand(MoveCqR, 0, first4); + anInstruction16 = genoperandoperand(MoveCqR, 0, first4); jmpTarget(contJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); ssPushNativeRegister(first4); return 0; case 166: /* begin genLowcodePointerNotEqual */ - topRegistersMask11 = 0; - rTop26 = (rNext15 = NoReg); + topRegistersMask9 = 0; + rTop22 = (rNext9 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop26 = nativeRegisterOrNone(ssNativeTop()); + rTop22 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext15 == NoReg) { + if (rNext9 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg16 = (rNext15 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask11 = 1U << reg16; + reg10 = (rNext9 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask9 = 1U << reg10; } } - if (rTop26 == NoReg) { - rTop26 = allocateRegNotConflictingWith(topRegistersMask11); + if (rTop22 == NoReg) { + rTop22 = allocateRegNotConflictingWith(topRegistersMask9); } - if (rNext15 == NoReg) { - rNext15 = allocateRegNotConflictingWith(1U << rTop26); + if (rNext9 == NoReg) { + rNext9 = allocateRegNotConflictingWith(1U << rTop22); } - assert(!(((rTop26 == NoReg) - || (rNext15 == NoReg)))); - second5 = rTop26; - first5 = rNext15; + assert(!(((rTop22 == NoReg) + || (rNext9 == NoReg)))); + second5 = rTop22; + first5 = rNext9; nativePopToReg(ssNativeTop(), second5); ssNativePop(1); nativePopToReg(ssNativeTop(), first5); @@ -34086,69 +34361,69 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin JumpZero: */ falseJump1 = genConditionalBranchoperand(JumpZero, ((sqInt)0)); /* begin checkQuickConstant:forInstruction: */ - anInstruction20 = genoperandoperand(MoveCqR, 1, first5); + anInstruction19 = genoperandoperand(MoveCqR, 1, first5); /* begin Jump: */ contJump1 = genoperand(Jump, ((sqInt)0)); jmpTarget(falseJump1, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); /* begin checkQuickConstant:forInstruction: */ - anInstruction110 = genoperandoperand(MoveCqR, 0, first5); + anInstruction18 = genoperandoperand(MoveCqR, 0, first5); jmpTarget(contJump1, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); ssPushNativeRegister(first5); return 0; case 167: /* begin genLowcodePointerToInt32 */ - rTop27 = NoReg; + rTop23 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop27 = nativeRegisterOrNone(ssNativeTop()); + rTop23 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop27 == NoReg) { - rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop23 == NoReg) { + rTop23 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop27 == NoReg))); - pointer7 = rTop27; - nativePopToReg(ssNativeTop(), pointer7); + assert(!((rTop23 == NoReg))); + pointer5 = rTop23; + nativePopToReg(ssNativeTop(), pointer5); ssNativePop(1); - ssPushNativeRegister(pointer7); + ssPushNativeRegister(pointer5); return 0; case 168: /* begin genLowcodePointerToInt64 */ /* begin allocateRegistersForLowcodeIntegerResultInteger2: */ - rTop28 = NoReg; - rResult9 = (rResult9 = NoReg); + rTop24 = NoReg; + rResult7 = (rResult7 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop28 = nativeRegisterOrNone(ssNativeTop()); + rTop24 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop28 == NoReg) { - rTop28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop24 == NoReg) { + rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult9 = allocateRegNotConflictingWith(1U << rTop28); - rResult22 = allocateRegNotConflictingWith((1U << rTop28) | (1U << rResult9)); - assert(!(((rTop28 == NoReg) - || ((rResult9 == NoReg) + rResult7 = allocateRegNotConflictingWith(1U << rTop24); + rResult22 = allocateRegNotConflictingWith((1U << rTop24) | (1U << rResult7)); + assert(!(((rTop24 == NoReg) + || ((rResult7 == NoReg) || (rResult22 == NoReg))))); - pointer8 = rTop28; - resultLow1 = rResult9; + pointer6 = rTop24; + resultLow1 = rResult7; resultHigh1 = rResult22; - nativePopToReg(ssNativeTop(), pointer8); + nativePopToReg(ssNativeTop(), pointer6); ssNativePop(1); /* begin MoveR:R: */ - genoperandoperand(MoveRR, pointer8, resultLow1); + genoperandoperand(MoveRR, pointer6, resultLow1); /* begin checkQuickConstant:forInstruction: */ - anInstruction23 = genoperandoperand(MoveCqR, 0, resultHigh1); + anInstruction20 = genoperandoperand(MoveCqR, 0, resultHigh1); ssPushNativeRegistersecondRegister(resultLow1, resultHigh1); return 0; case 169: /* begin genLowcodePopFloat32 */ - topRegistersMask12 = 0; + topRegistersMask10 = 0; frTop = NoReg; if ((nativeFloatRegisterOrNone(ssNativeTop())) != NoReg) { frTop = nativeFloatRegisterOrNone(ssNativeTop()); } if (frTop == NoReg) { - frTop = allocateFloatRegNotConflictingWith(topRegistersMask12); + frTop = allocateFloatRegNotConflictingWith(topRegistersMask10); } assert(!((frTop == NoReg))); value8 = frTop; @@ -34158,13 +34433,13 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 170: /* begin genLowcodePopFloat64 */ - topRegistersMask13 = 0; + topRegistersMask11 = 0; frTop1 = NoReg; if ((nativeFloatRegisterOrNone(ssNativeTop())) != NoReg) { frTop1 = nativeFloatRegisterOrNone(ssNativeTop()); } if (frTop1 == NoReg) { - frTop1 = allocateFloatRegNotConflictingWith(topRegistersMask13); + frTop1 = allocateFloatRegNotConflictingWith(topRegistersMask11); } assert(!((frTop1 == NoReg))); value9 = frTop1; @@ -34174,30 +34449,30 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 171: /* begin genLowcodePopInt32 */ - rTop29 = NoReg; + rTop25 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop29 = nativeRegisterOrNone(ssNativeTop()); + rTop25 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop29 == NoReg) { - rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop25 == NoReg) { + rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop29 == NoReg))); - value10 = rTop29; + assert(!((rTop25 == NoReg))); + value10 = rTop25; nativePopToReg(ssNativeTop(), value10); ssNativePop(1); return 0; case 172: /* begin genLowcodePopInt64 */ - rTop30 = NoReg; + rTop26 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop30 = nativeRegisterOrNone(ssNativeTop()); + rTop26 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop30 == NoReg) { - rTop30 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop26 == NoReg) { + rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop30 == NoReg))); - value11 = rTop30; + assert(!((rTop26 == NoReg))); + value11 = rTop26; nativePopToReg(ssNativeTop(), value11); ssNativePop(1); return 0; @@ -34210,16 +34485,16 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 174: /* begin genLowcodePopPointer */ - rTop31 = NoReg; + rTop27 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop31 = nativeRegisterOrNone(ssNativeTop()); + rTop27 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop31 == NoReg) { - rTop31 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop27 == NoReg) { + rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop31 == NoReg))); - pointerValue9 = rTop31; - nativePopToReg(ssNativeTop(), pointerValue9); + assert(!((rTop27 == NoReg))); + pointerValue7 = rTop27; + nativePopToReg(ssNativeTop(), pointerValue7); ssNativePop(1); return 0; @@ -39081,7 +39356,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -39567,6 +39842,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -39574,7 +39850,15 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -39601,11 +39885,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -39692,7 +39975,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -39704,9 +39987,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -39805,6 +40088,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -39824,7 +40108,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -39867,7 +40151,15 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -40042,6 +40334,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -40059,14 +40352,22 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -40239,6 +40540,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -40262,7 +40564,15 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -40288,6 +40598,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -40316,8 +40627,87 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI /* begin annotateBytecode: */ abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); - /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + /* begin putSelfInReceiverResultReg */ + storeToReg(simSelf(), ReceiverResultReg); + /* begin Jump: */ + immutabilityFailure = genoperand(Jump, ((sqInt)0)); + jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + } +# endif /* IMMUTABILITY */ + ssPop(1); + ssAllocateCallRegand(ClassReg, SendNumArgsReg); + ssPush(1); + genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); + ssStoreAndReplacePoptoReg(popBoolean, ClassReg); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } + /* begin checkQuickConstant:forInstruction: */ + anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); + /* begin CallRT: */ + abstractInstruction = genoperand(Call, ceStoreContextInstVarTrampoline); + (abstractInstruction->annotation = IsRelativeCall); + +# if IMMUTABILITY + if (needsImmCheck) { + jmpTarget(immutabilityFailure, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + } +# endif /* IMMUTABILITY */ + return 0; +} + + +/* The reason we need a frame here is that assigning to an inst var of a + context may + involve wholesale reorganization of stack pages, and the only way to + preserve the + execution state of an activation in that case is if it has a frame. */ + + /* StackToRegisterMappingCogit>>#genStorePop:MaybeContextRemoteInstVar:ofObjectAt:needsStoreCheck:needsImmutabilityCheck: */ +static sqInt NoDbgRegParms +genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) +{ + AbstractInstruction *abstractInstruction; + AbstractInstruction *abstractInstruction1; + AbstractInstruction *abstractInstruction2; + AbstractInstruction *abstractInstruction3; + AbstractInstruction *anInstruction; + AbstractInstruction *anInstruction1; + sqInt i; + AbstractInstruction *immutabilityFailure; + AbstractInstruction *mutableJump; + + assert(needsFrame); + genLoadTempin(objectIndex, ReceiverResultReg); + /* begin genGenericStorePop:MaybeContextSlotIndex:needsStoreCheck:needsRestoreRcvr:needsImmutabilityCheck: */ + assert(needsFrame); + +# if IMMUTABILITY + if (needsImmCheck) { + mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); + /* begin genStoreTrampolineCall: */ + if (slotIndex >= (NumStoreTrampolines - 1)) { + /* begin checkQuickConstant:forInstruction: */ + anInstruction = genoperandoperand(MoveCqR, slotIndex, TempReg); + /* begin CallRT: */ + abstractInstruction3 = genoperand(Call, ceStoreTrampolines[NumStoreTrampolines - 1]); + (abstractInstruction3->annotation = IsRelativeCall); + } + else { + /* begin CallRT: */ + abstractInstruction1 = genoperand(Call, ceStoreTrampolines[slotIndex]); + (abstractInstruction1->annotation = IsRelativeCall); + } + /* begin annotateBytecode: */ + abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); + (abstractInstruction2->annotation = HasBytecodePC); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -40329,77 +40719,15 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); - /* begin checkQuickConstant:forInstruction: */ - anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); - /* begin CallRT: */ - abstractInstruction = genoperand(Call, ceStoreContextInstVarTrampoline); - (abstractInstruction->annotation = IsRelativeCall); - -# if IMMUTABILITY - if (needsImmCheck) { - jmpTarget(immutabilityFailure, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); - } -# endif /* IMMUTABILITY */ - return 0; -} - - -/* The reason we need a frame here is that assigning to an inst var of a - context may - involve wholesale reorganization of stack pages, and the only way to - preserve the - execution state of an activation in that case is if it has a frame. */ - - /* StackToRegisterMappingCogit>>#genStorePop:MaybeContextRemoteInstVar:ofObjectAt:needsStoreCheck:needsImmutabilityCheck: */ -static sqInt NoDbgRegParms -genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) -{ - AbstractInstruction *abstractInstruction; - AbstractInstruction *abstractInstruction1; - AbstractInstruction *abstractInstruction2; - AbstractInstruction *abstractInstruction3; - AbstractInstruction *anInstruction; - AbstractInstruction *anInstruction1; - AbstractInstruction *immutabilityFailure; - AbstractInstruction *mutableJump; - - assert(needsFrame); - genLoadTempin(objectIndex, ReceiverResultReg); - /* begin genGenericStorePop:MaybeContextSlotIndex:needsStoreCheck:needsRestoreRcvr:needsImmutabilityCheck: */ - assert(needsFrame); - -# if IMMUTABILITY - if (needsImmCheck) { - mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); - /* begin genStoreTrampolineCall: */ - if (slotIndex >= (NumStoreTrampolines - 1)) { - /* begin checkQuickConstant:forInstruction: */ - anInstruction = genoperandoperand(MoveCqR, slotIndex, TempReg); - /* begin CallRT: */ - abstractInstruction3 = genoperand(Call, ceStoreTrampolines[NumStoreTrampolines - 1]); - (abstractInstruction3->annotation = IsRelativeCall); - } - else { - /* begin CallRT: */ - abstractInstruction1 = genoperand(Call, ceStoreTrampolines[slotIndex]); - (abstractInstruction1->annotation = IsRelativeCall); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); } - /* begin annotateBytecode: */ - abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); - (abstractInstruction2->annotation = HasBytecodePC); - /* begin Jump: */ - immutabilityFailure = genoperand(Jump, ((sqInt)0)); - jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + simSpillBase = simStackPtr + 1; } -# endif /* IMMUTABILITY */ - ssPop(1); - ssAllocateCallRegand(ClassReg, SendNumArgsReg); - ssPush(1); - genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); - ssStoreAndReplacePoptoReg(popBoolean, ClassReg); - /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -40418,6 +40746,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -40435,7 +40764,15 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -40448,6 +40785,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -40459,7 +40797,15 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -40516,7 +40862,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -40541,6 +40887,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -40549,7 +40896,15 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -40587,64 +40942,40 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - (fixup->simNativeStackPtr) = UnknownSimStackPtrFlag; - (fixup->simNativeStackSize) = 0; -} - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -40654,32 +40985,36 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; } @@ -40688,25 +41023,25 @@ initSimStackForFramelessBlock(sqInt startpc) static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -40714,16 +41049,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; } @@ -40833,10 +41169,21 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -40847,7 +41194,15 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -40856,7 +41211,15 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -40927,7 +41290,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -40935,7 +41297,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; + sqInt i1; + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -40948,14 +41321,11 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); simNativeStackPtr = (fixup->simNativeStackPtr); simNativeStackSize = (fixup->simNativeStackSize); } @@ -40963,10 +41333,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); (fixup->simNativeStackPtr = simNativeStackPtr); (fixup->simNativeStackSize = simNativeStackSize); @@ -40976,18 +41354,17 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) assert(simNativeStackPtr == ((fixup->simNativeStackPtr))); assert(simNativeStackSize == ((fixup->simNativeStackSize))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } - for (i = 0; i <= simNativeStackPtr; i += 1) { - ensureIsMarkedAsSpilled(simNativeStackAt(i)); + simSpillBase = simStackPtr + 1; + for (i1 = 0; i1 <= simNativeStackPtr; i1 += 1) { + ensureIsMarkedAsSpilled(simNativeStackAt(i1)); } simNativeSpillBase = simNativeStackPtr + 1; return 0; @@ -41000,6 +41377,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -41075,6 +41468,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -41085,6 +41489,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -41105,7 +41510,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -41225,6 +41635,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -41301,7 +41712,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -41379,7 +41795,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredFloatRegMask:upThrough:upThroughNative: */ @@ -41387,6 +41803,7 @@ static void NoDbgRegParms ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -41404,6 +41821,7 @@ ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, s lastRequired = i; } } + assert(lastRequiredNative == simNativeStackPtr); for (i = (((simNativeSpillBase < 0) ? 0 : simNativeSpillBase)); i <= nativeStackPtr; i += 1) { liveRegs = liveRegs | (nativeRegisterMask(simNativeStackAt(i))); if ((0 /* floatRegisterMask */ & requiredRegsMask) != 0) { @@ -41413,7 +41831,16 @@ ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, s if (!((liveRegs & requiredRegsMask) == 0)) { /* Some live, must spill */ - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(((liveFloatRegisters()) & requiredRegsMask) == 0); } } @@ -41437,6 +41864,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -41451,10 +41879,11 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } + assert(nativeStackPtr == simNativeStackPtr); for (i = (((simNativeSpillBase < 0) ? 0 : simNativeSpillBase)); i <= nativeStackPtr; i += 1) { liveRegs = liveRegs | (nativeRegisterMask(simNativeStackAt(i))); if ((nativeRegisterMask(simNativeStackAt(i))) & requiredRegsMask) { @@ -41462,7 +41891,16 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -41488,31 +41926,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - ssNativeFlushTo(nativeIndex); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -41522,16 +41935,26 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; ssNativeFlushTo(simNativeStackPtr); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -41547,16 +41970,29 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; ssNativeFlushTo(simNativeStackPtr); + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -41671,11 +42107,33 @@ ssPopNativeSize(sqInt popSize) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -41683,18 +42141,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -41713,18 +42161,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -41733,17 +42198,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -41751,6 +42233,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -41758,8 +42242,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -41968,17 +42468,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -41989,6 +42506,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -42056,13 +42580,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -42080,6 +42597,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -42154,6 +42702,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -42163,18 +42718,27 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spurlowcodesrc/vm/cogitMIPSEL.c b/spurlowcodesrc/vm/cogitMIPSEL.c index 317ffeaf04..ab5a29dc02 100644 --- a/spurlowcodesrc/vm/cogitMIPSEL.c +++ b/spurlowcodesrc/vm/cogitMIPSEL.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -399,7 +399,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define V0 2 #define ValueIndex 1 #define VarBaseReg 22 @@ -491,7 +490,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -651,7 +651,7 @@ static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static CogMethod * NoDbgRegParms fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -730,7 +730,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -1252,7 +1252,6 @@ static CogSimStackNativeEntry * NoDbgRegParms nativeStackPopToReg(CogSimStackNat static CogSimStackNativeEntry * NoDbgRegParms nativeStackPopToRegsecondReg(CogSimStackNativeEntry * self_in_nativeStackPopToRegsecondReg, sqInt reg, sqInt secondReg); static sqInt NoDbgRegParms spillingNeedsScratchRegister(CogSimStackNativeEntry * self_in_spillingNeedsScratchRegister); static sqInt NoDbgRegParms stackSpillSize(CogSimStackNativeEntry * self_in_stackSpillSize); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); static AbstractInstruction * NoDbgRegParms checkQuickConstantforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1473,7 +1472,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1485,11 +1483,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1505,7 +1505,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssNativeFlushTo(sqInt index); @@ -1530,14 +1529,16 @@ static sqInt NoDbgRegParms ssPushNativeRegister(sqInt reg); static sqInt NoDbgRegParms ssPushNativeRegistersecondRegister(sqInt reg, sqInt secondReg); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -2217,7 +2218,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -2241,7 +2241,6 @@ static sqInt simNativeSpillBase; static CogSimStackNativeEntry simNativeStack[70]; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2322,6 +2321,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -2853,7 +2853,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -4235,12 +4235,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -5549,7 +5555,7 @@ configureMNUCPICmethodOperandnumArgsdelta(CogMethod *cPIC, sqInt methodOperand, static sqInt NoDbgRegParms cPICCompactAndIsNowEmpty(CogMethod *cPIC) { - usqInt entryPoint; + sqInt entryPoint; sqInt followingAddress; sqInt i; sqInt methods[MaxCPICCases]; @@ -5650,7 +5656,7 @@ cPICHasForwardedClass(CogMethod *cPIC) static sqInt NoDbgRegParms cPICHasFreedTargets(CogMethod *cPIC) { - usqInt entryPoint; + sqInt entryPoint; sqInt i; sqInt pc; CogMethod *targetMethod; @@ -6087,7 +6093,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -7980,7 +7986,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -21749,7 +21755,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -21799,7 +21805,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -22084,8 +22090,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -22767,13 +22774,6 @@ stackSpillSize(CogSimStackNativeEntry * self_in_stackSpillSize) return 0; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -25944,11 +25944,20 @@ beginHighLevelCall(sqInt alignment) AbstractInstruction *anInstruction4; AbstractInstruction *anInstruction5; AbstractInstruction *anInstruction6; + sqInt i; sqInt mask; sqInt offset; /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); /* begin MoveR:Aw: */ address1 = stackPointerAddress(); @@ -26065,10 +26074,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -26463,6 +26469,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -27034,7 +27043,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -27082,7 +27092,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simNativeStackSize = simNativeStackSize); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -27127,18 +27137,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -27210,7 +27219,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -27436,12 +27445,21 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -27576,7 +27594,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -27870,6 +27888,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -27981,7 +28000,15 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -28212,11 +28239,20 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -28252,13 +28288,22 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -28330,10 +28375,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -28343,13 +28390,29 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -28396,7 +28459,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt i114; sqInt i115; sqInt i116; - sqInt i117; + sqInt i118; sqInt i119; sqInt i12; sqInt i120; @@ -28412,6 +28475,13 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt i17; sqInt i18; sqInt i19; + sqInt i210; + sqInt i211; + sqInt i212; + sqInt i214; + sqInt i29; + sqInt i34; + sqInt i37; sqInt index1; sqInt index11; sqInt index110; @@ -28421,7 +28491,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt index115; sqInt index116; sqInt index117; - sqInt index118; + sqInt index119; sqInt index12; sqInt index120; sqInt index121; @@ -28470,7 +28540,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt rOopTop15; sqInt rOopTop16; sqInt rOopTop17; - sqInt rOopTop18; + sqInt rOopTop19; sqInt rOopTop2; sqInt rOopTop20; sqInt rOopTop21; @@ -28513,7 +28583,7 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) sqInt value4; sqInt value5; sqInt value6; - sqInt value8; + sqInt value9; sqInt valueHigh; sqInt valueHigh1; sqInt valueHigh2; @@ -28527,36 +28597,44 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) switch (prim) { case 0: /* begin genLowcodeByteSizeOf */ - rOopTop16 = NoReg; - rResult9 = NoReg; + rOopTop19 = NoReg; + rResult10 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop16 = registerOrNone(ssTop()); - index116 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i116 = index116; i116 <= (simStackPtr); i116 += 1) { - if ((registerOrNone(simStackAt(index116))) == rOopTop16) { - goto l51; + rOopTop19 = registerOrNone(ssTop()); + index119 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i119 = index119; i119 <= (simStackPtr); i119 += 1) { + if ((registerOrNone(simStackAt(index119))) == rOopTop19) { + goto l62; } } - l51: ; - rOopTop16 = NoReg; - l50: ; + l62: ; + rOopTop19 = NoReg; + l61: ; } - if (rOopTop16 == NoReg) { - rOopTop16 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop19 == NoReg) { + rOopTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult9 = allocateRegNotConflictingWith(1U << rOopTop16); - assert(!(((rOopTop16 == NoReg) - || (rResult9 == NoReg)))); - object15 = rOopTop16; - value8 = rResult9; - popToReg(ssTop(), object15); + rResult10 = allocateRegNotConflictingWith(1U << rOopTop19); + assert(!(((rOopTop19 == NoReg) + || (rResult10 == NoReg)))); + object17 = rOopTop19; + value9 = rResult10; + popToReg(ssTop(), object17); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i29 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i29 <= simStackPtr; i29 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i29), frameOffsetOfTemporary(i29 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - genLcByteSizeOfto(object15, value8); + genLcByteSizeOfto(object17, value9); return 0; case 1: @@ -28897,67 +28975,67 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) case 12: /* begin genLowcodeOopToBoolean32 */ - rOopTop17 = NoReg; + rOopTop16 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop17 = registerOrNone(ssTop()); - index117 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i117 = index117; i117 <= (simStackPtr); i117 += 1) { - if ((registerOrNone(simStackAt(index117))) == rOopTop17) { - goto l55; + rOopTop16 = registerOrNone(ssTop()); + index116 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i116 = index116; i116 <= (simStackPtr); i116 += 1) { + if ((registerOrNone(simStackAt(index116))) == rOopTop16) { + goto l52; } } - l55: ; - rOopTop17 = NoReg; - l54: ; + l52: ; + rOopTop16 = NoReg; + l51: ; } - if (rOopTop17 == NoReg) { - rOopTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop16 == NoReg) { + rOopTop16 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rOopTop17 == NoReg))); - object16 = rOopTop17; - popToReg(ssTop(), object16); + assert(!((rOopTop16 == NoReg))); + object15 = rOopTop16; + popToReg(ssTop(), object15); ssPop(1); - annotateobjRef(gSubCwR(falseObject(), object16), falseObject()); - ssPushNativeRegister(object16); + annotateobjRef(gSubCwR(falseObject(), object15), falseObject()); + ssPushNativeRegister(object15); return 0; case 13: /* begin genLowcodeOopToBoolean64 */ /* begin allocateRegistersForLowcodeOopResultInteger2: */ - rOopTop18 = NoReg; - rResult10 = (rResult22 = NoReg); + rOopTop17 = NoReg; + rResult9 = (rResult22 = NoReg); if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop18 = registerOrNone(ssTop()); - index118 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i119 = index118; i119 <= (simStackPtr); i119 += 1) { - if ((registerOrNone(simStackAt(index118))) == rOopTop18) { - goto l62; + rOopTop17 = registerOrNone(ssTop()); + index117 = ((simSpillBase < 0) ? 0 : simSpillBase); + for (i118 = index117; i118 <= (simStackPtr); i118 += 1) { + if ((registerOrNone(simStackAt(index117))) == rOopTop17) { + goto l59; } } - l62: ; - rOopTop18 = NoReg; l59: ; + rOopTop17 = NoReg; + l56: ; } - if (rOopTop18 == NoReg) { - rOopTop18 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop17 == NoReg) { + rOopTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult10 = allocateRegNotConflictingWith(1U << rOopTop18); - rResult22 = allocateRegNotConflictingWith((1U << rOopTop18) | (1U << rResult10)); - assert(!(((rOopTop18 == NoReg) - || (rResult10 == NoReg)))); - object17 = rOopTop18; - valueLow1 = rResult10; + rResult9 = allocateRegNotConflictingWith(1U << rOopTop17); + rResult22 = allocateRegNotConflictingWith((1U << rOopTop17) | (1U << rResult9)); + assert(!(((rOopTop17 == NoReg) + || (rResult9 == NoReg)))); + object16 = rOopTop17; + valueLow1 = rResult9; valueHigh1 = rResult22; - popToReg(ssTop(), object17); + popToReg(ssTop(), object16); ssPop(1); /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, 0, valueHigh1); - annotateobjRef(gSubCwR(falseObject(), object17), falseObject()); - ssPushNativeRegistersecondRegister(object17, valueHigh1); + annotateobjRef(gSubCwR(falseObject(), object16), falseObject()); + ssPushNativeRegistersecondRegister(object16, valueHigh1); return 0; case 14: @@ -28989,7 +29067,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object18); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i210 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i210 <= simStackPtr; i210 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i210), frameOffsetOfTemporary(i210 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoFloat32(object18, value10); return 0; @@ -29023,7 +29109,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object19); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i211 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i211 <= simStackPtr; i211 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i211), frameOffsetOfTemporary(i211 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoFloat64(object19, value11); return 0; @@ -29053,7 +29147,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object20); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i212 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i212 <= simStackPtr; i212 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i212), frameOffsetOfTemporary(i212 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToInt32(object20); return 0; @@ -29090,7 +29192,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object21); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i34 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i34 <= simStackPtr; i34 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i34), frameOffsetOfTemporary(i34 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoInt64highPart(object21, valueLow2, valueHigh2); return 0; @@ -29182,7 +29292,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object22); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i214 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i214 <= simStackPtr; i214 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i214), frameOffsetOfTemporary(i214 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOopToUInt32(object22); return 0; @@ -29219,7 +29337,15 @@ genLowcodeBinaryInlinePrimitive(sqInt prim) popToReg(ssTop(), object23); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i37 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i37 <= simStackPtr; i37 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i37), frameOffsetOfTemporary(i37 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcOoptoUInt64highPart(object23, valueLow3, valueHigh3); return 0; @@ -29300,6 +29426,13 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) sqInt floatValue; sqInt frTop; sqInt frTop1; + sqInt i; + sqInt i1; + sqInt i2; + sqInt i3; + sqInt i4; + sqInt i5; + sqInt i6; AbstractInstruction * inst; AbstractInstruction * inst1; sqInt object; @@ -29458,7 +29591,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), singleFloatValue); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcFloat32toOop(singleFloatValue, object2); return 0; @@ -29483,7 +29624,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), floatValue); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcFloat64toOop(floatValue, object3); return 0; @@ -29502,7 +29651,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value2); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInt32ToOop(value2); return 0; @@ -29538,7 +29695,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToRegsecondReg(ssNativeTop(), valueLow1, valueHigh1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 <= simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInt64ToOophighPart(valueLow1, valueHigh1); return 0; @@ -29547,51 +29712,59 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) /* begin genLowcodePointerToOop */ pointerClassLiteral = getLiteral(extA); /* begin allocateRegistersForLowcodeInteger: */ - rTop5 = NoReg; + rTop7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop5 == NoReg))); - pointer = rTop5; - nativePopToReg(ssNativeTop(), pointer); + assert(!((rTop7 == NoReg))); + pointer1 = rTop7; + nativePopToReg(ssNativeTop(), pointer1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 <= simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - genLcPointerToOopclass(pointer, pointerClassLiteral); + genLcPointerToOopclass(pointer1, pointerClassLiteral); extA = 0; return 0; case 7: /* begin genLowcodePointerToOopReinterprer */ - rTop6 = NoReg; + rTop5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop6 == NoReg))); - pointer1 = rTop6; - nativePopToReg(ssNativeTop(), pointer1); + assert(!((rTop5 == NoReg))); + pointer = rTop5; + nativePopToReg(ssNativeTop(), pointer); ssNativePop(1); - ssPushRegister(pointer1); + ssPushRegister(pointer); return 0; case 8: /* begin genLowcodeSmallInt32ToOop */ - rTop7 = NoReg; + rTop6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop7 == NoReg) { - rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop7 == NoReg))); - value4 = rTop7; + assert(!((rTop6 == NoReg))); + value4 = rTop6; nativePopToReg(ssNativeTop(), value4); ssNativePop(1); genConvertIntegerToSmallIntegerInReg(value4); @@ -29612,7 +29785,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToReg(ssNativeTop(), value5); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i5 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i5 <= simStackPtr; i5 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i5), frameOffsetOfTemporary(i5 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcUInt32ToOop(value5); return 0; @@ -29652,7 +29833,15 @@ genLowcodeNullaryInlinePrimitive(sqInt prim) nativePopToRegsecondReg(ssNativeTop(), valueLow2, valueHigh2); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i6 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i6 <= simStackPtr; i6 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i6), frameOffsetOfTemporary(i6 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcUInt64ToOophighPart(valueLow2, valueHigh2); return 0; @@ -30097,8 +30286,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt frTop2; sqInt frTop3; sqInt frTop4; + sqInt i; sqInt i1; sqInt i11; + sqInt i12; + sqInt i2; + sqInt i21; sqInt index1; sqInt index11; sqInt indexableSize; @@ -30209,12 +30402,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) sqInt rTop; sqInt rTop1; sqInt rTop10; - sqInt rTop11; + sqInt rTop12; sqInt rTop13; sqInt rTop14; sqInt rTop15; - sqInt rTop16; sqInt rTop17; + sqInt rTop18; sqInt rTop19; sqInt rTop2; sqInt rTop20; @@ -30423,23 +30616,31 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 65: /* begin genLowcodeFree */ - rTop = NoReg; + rTop29 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop = nativeRegisterOrNone(ssNativeTop()); + rTop29 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop == NoReg) { - rTop = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop29 == NoReg) { + rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop == NoReg))); - pointer2 = rTop; - nativePopToReg(ssNativeTop(), pointer2); + assert(!((rTop29 == NoReg))); + pointer8 = rTop29; + nativePopToReg(ssNativeTop(), pointer8); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); - if (pointer2 != ReceiverResultReg) { + if (pointer8 != ReceiverResultReg) { /* begin MoveR:R: */ - genoperandoperand(MoveRR, pointer2, ReceiverResultReg); + genoperandoperand(MoveRR, pointer8, ReceiverResultReg); } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceFreeTrampoline); @@ -30448,36 +30649,44 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 66: /* begin genLowcodeInstantiateIndexable32Oop */ - rTop1 = (rOopTop = NoReg); + rTop30 = (rOopTop1 = NoReg); rOopResult = NoReg; - topRegisterMask = 0; + topRegisterMask1 = 0; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop1 = nativeRegisterOrNone(ssNativeTop()); + rTop30 = nativeRegisterOrNone(ssNativeTop()); } if ((registerOrNone(ssTop())) != NoReg) { - rOopTop = registerOrNone(ssTop()); + rOopTop1 = registerOrNone(ssTop()); /* begin registerMaskFor: */ - topRegisterMask = 1U << rOopTop; + topRegisterMask1 = 1U << rOopTop1; } - if (rTop1 == NoReg) { - rTop1 = allocateRegNotConflictingWith(topRegisterMask); + if (rTop30 == NoReg) { + rTop30 = allocateRegNotConflictingWith(topRegisterMask1); } - if (rOopTop == NoReg) { - rOopTop = allocateRegNotConflictingWith(1U << rTop1); + if (rOopTop1 == NoReg) { + rOopTop1 = allocateRegNotConflictingWith(1U << rTop30); } - rOopResult = allocateRegNotConflictingWith((1U << rTop1) | (1U << rOopTop)); - assert(!(((rTop1 == NoReg) - || ((rOopTop == NoReg) + rOopResult = allocateRegNotConflictingWith((1U << rTop30) | (1U << rOopTop1)); + assert(!(((rTop30 == NoReg) + || ((rOopTop1 == NoReg) || (rOopResult == NoReg))))); - indexableSize = rTop1; - classOop = rOopTop; - object = rOopResult; + indexableSize = rTop30; + classOop = rOopTop1; + object1 = rOopResult; nativePopToReg(ssNativeTop(), indexableSize); ssNativePop(1); popToReg(ssTop(), classOop); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOopindexableSize(classOop, indexableSize); return 0; @@ -30486,34 +30695,42 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInstantiateIndexableOop */ indexableSize1 = extA; /* begin allocateRegistersForLowcodeOopResultOop: */ - rOopTop1 = NoReg; - rResult20 = NoReg; + rOopTop2 = NoReg; + rResult35 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop1 = registerOrNone(ssTop()); + rOopTop2 = registerOrNone(ssTop()); index1 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i1 = index1; i1 <= (simStackPtr); i1 += 1) { - if ((registerOrNone(simStackAt(index1))) == rOopTop1) { - goto l40; + for (i11 = index1; i11 <= (simStackPtr); i11 += 1) { + if ((registerOrNone(simStackAt(index1))) == rOopTop2) { + goto l200; } } - l40: ; - rOopTop1 = NoReg; - l39: ; + l200: ; + rOopTop2 = NoReg; + l199: ; } - if (rOopTop1 == NoReg) { - rOopTop1 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop2 == NoReg) { + rOopTop2 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult20 = allocateRegNotConflictingWith(1U << rOopTop1); - assert(!(((rOopTop1 == NoReg) - || (rResult20 == NoReg)))); - classOop1 = rOopTop1; - object1 = rResult20; + rResult35 = allocateRegNotConflictingWith(1U << rOopTop2); + assert(!(((rOopTop2 == NoReg) + || (rResult35 == NoReg)))); + classOop1 = rOopTop2; + object2 = rResult35; popToReg(ssTop(), classOop1); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOopconstantIndexableSize(classOop1, indexableSize1); extA = 0; @@ -30521,30 +30738,38 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 68: /* begin genLowcodeInstantiateOop */ - rOopTop2 = NoReg; + rOopTop3 = NoReg; if ((registerOrNone(ssTop())) != NoReg) { /* Ensure we are not using a duplicated register. */ - rOopTop2 = registerOrNone(ssTop()); + rOopTop3 = registerOrNone(ssTop()); index11 = ((simSpillBase < 0) ? 0 : simSpillBase); - for (i11 = index11; i11 <= (simStackPtr); i11 += 1) { - if ((registerOrNone(simStackAt(index11))) == rOopTop2) { - goto l43; + for (i12 = index11; i12 <= (simStackPtr); i12 += 1) { + if ((registerOrNone(simStackAt(index11))) == rOopTop3) { + goto l203; } } - l43: ; - rOopTop2 = NoReg; - l42: ; + l203: ; + rOopTop3 = NoReg; + l202: ; } - if (rOopTop2 == NoReg) { - rOopTop2 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rOopTop3 == NoReg) { + rOopTop3 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rOopTop2 == NoReg))); - classOop2 = rOopTop2; + assert(!((rOopTop3 == NoReg))); + classOop2 = rOopTop3; popToReg(ssTop(), classOop2); ssPop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i21 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i21 <= simStackPtr; i21 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i21), frameOffsetOfTemporary(i21 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genLcInstantiateOop(classOop2); return 0; @@ -30552,9 +30777,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 69: /* begin genLowcodeInt32Equal */ topRegistersMask1 = 0; - rTop2 = (rNext = NoReg); + rTop = (rNext = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop2 = nativeRegisterOrNone(ssNativeTop()); + rTop = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -30566,15 +30791,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask1 = 1U << reg; } } - if (rTop2 == NoReg) { - rTop2 = allocateRegNotConflictingWith(topRegistersMask1); + if (rTop == NoReg) { + rTop = allocateRegNotConflictingWith(topRegistersMask1); } if (rNext == NoReg) { - rNext = allocateRegNotConflictingWith(1U << rTop2); + rNext = allocateRegNotConflictingWith(1U << rTop); } - assert(!(((rTop2 == NoReg) + assert(!(((rTop == NoReg) || (rNext == NoReg)))); - second = rTop2; + second = rTop; first = rNext; nativePopToReg(ssNativeTop(), second); ssNativePop(1); @@ -30598,9 +30823,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 70: /* begin genLowcodeInt32Great */ topRegistersMask2 = 0; - rTop3 = (rNext1 = NoReg); + rTop1 = (rNext1 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop3 = nativeRegisterOrNone(ssNativeTop()); + rTop1 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -30612,15 +30837,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask2 = 1U << reg1; } } - if (rTop3 == NoReg) { - rTop3 = allocateRegNotConflictingWith(topRegistersMask2); + if (rTop1 == NoReg) { + rTop1 = allocateRegNotConflictingWith(topRegistersMask2); } if (rNext1 == NoReg) { - rNext1 = allocateRegNotConflictingWith(1U << rTop3); + rNext1 = allocateRegNotConflictingWith(1U << rTop1); } - assert(!(((rTop3 == NoReg) + assert(!(((rTop1 == NoReg) || (rNext1 == NoReg)))); - second1 = rTop3; + second1 = rTop1; first1 = rNext1; nativePopToReg(ssNativeTop(), second1); ssNativePop(1); @@ -30644,9 +30869,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 71: /* begin genLowcodeInt32GreatEqual */ topRegistersMask3 = 0; - rTop4 = (rNext2 = NoReg); + rTop2 = (rNext2 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop4 = nativeRegisterOrNone(ssNativeTop()); + rTop2 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -30658,15 +30883,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask3 = 1U << reg2; } } - if (rTop4 == NoReg) { - rTop4 = allocateRegNotConflictingWith(topRegistersMask3); + if (rTop2 == NoReg) { + rTop2 = allocateRegNotConflictingWith(topRegistersMask3); } if (rNext2 == NoReg) { - rNext2 = allocateRegNotConflictingWith(1U << rTop4); + rNext2 = allocateRegNotConflictingWith(1U << rTop2); } - assert(!(((rTop4 == NoReg) + assert(!(((rTop2 == NoReg) || (rNext2 == NoReg)))); - second2 = rTop4; + second2 = rTop2; first2 = rNext2; nativePopToReg(ssNativeTop(), second2); ssNativePop(1); @@ -30690,9 +30915,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 72: /* begin genLowcodeInt32Less */ topRegistersMask4 = 0; - rTop5 = (rNext3 = NoReg); + rTop3 = (rNext3 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop3 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -30704,15 +30929,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask4 = 1U << reg3; } } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(topRegistersMask4); + if (rTop3 == NoReg) { + rTop3 = allocateRegNotConflictingWith(topRegistersMask4); } if (rNext3 == NoReg) { - rNext3 = allocateRegNotConflictingWith(1U << rTop5); + rNext3 = allocateRegNotConflictingWith(1U << rTop3); } - assert(!(((rTop5 == NoReg) + assert(!(((rTop3 == NoReg) || (rNext3 == NoReg)))); - second3 = rTop5; + second3 = rTop3; first3 = rNext3; nativePopToReg(ssNativeTop(), second3); ssNativePop(1); @@ -30736,9 +30961,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 73: /* begin genLowcodeInt32LessEqual */ topRegistersMask5 = 0; - rTop6 = (rNext4 = NoReg); + rTop4 = (rNext4 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop4 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -30750,15 +30975,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask5 = 1U << reg4; } } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(topRegistersMask5); + if (rTop4 == NoReg) { + rTop4 = allocateRegNotConflictingWith(topRegistersMask5); } if (rNext4 == NoReg) { - rNext4 = allocateRegNotConflictingWith(1U << rTop6); + rNext4 = allocateRegNotConflictingWith(1U << rTop4); } - assert(!(((rTop6 == NoReg) + assert(!(((rTop4 == NoReg) || (rNext4 == NoReg)))); - second4 = rTop6; + second4 = rTop4; first4 = rNext4; nativePopToReg(ssNativeTop(), second4); ssNativePop(1); @@ -30782,9 +31007,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 74: /* begin genLowcodeInt32NotEqual */ topRegistersMask6 = 0; - rTop7 = (rNext5 = NoReg); + rTop5 = (rNext5 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -30796,15 +31021,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask6 = 1U << reg5; } } - if (rTop7 == NoReg) { - rTop7 = allocateRegNotConflictingWith(topRegistersMask6); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(topRegistersMask6); } if (rNext5 == NoReg) { - rNext5 = allocateRegNotConflictingWith(1U << rTop7); + rNext5 = allocateRegNotConflictingWith(1U << rTop5); } - assert(!(((rTop7 == NoReg) + assert(!(((rTop5 == NoReg) || (rNext5 == NoReg)))); - second5 = rTop7; + second5 = rTop5; first5 = rNext5; nativePopToReg(ssNativeTop(), second5); ssNativePop(1); @@ -30827,18 +31052,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 75: /* begin genLowcodeInt32ToFloat32 */ - rTop8 = NoReg; + rTop6 = NoReg; frResult4 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop8 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop8 == NoReg) { - rTop8 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult4 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop8 == NoReg) + assert(!(((rTop6 == NoReg) || (frResult4 == NoReg)))); - value12 = rTop8; + value12 = rTop6; result = frResult4; nativePopToReg(ssNativeTop(), value12); ssNativePop(1); @@ -30849,18 +31074,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 76: /* begin genLowcodeInt32ToFloat64 */ - rTop9 = NoReg; + rTop7 = NoReg; frResult5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop9 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop9 == NoReg) { - rTop9 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult5 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop9 == NoReg) + assert(!(((rTop7 == NoReg) || (frResult5 == NoReg)))); - value13 = rTop9; + value13 = rTop7; result1 = frResult5; nativePopToReg(ssNativeTop(), value13); ssNativePop(1); @@ -30871,15 +31096,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 77: /* begin genLowcodeInt32ToPointer */ - rTop10 = NoReg; + rTop8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop10 = nativeRegisterOrNone(ssNativeTop()); + rTop8 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop10 == NoReg) { - rTop10 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop8 == NoReg) { + rTop8 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop10 == NoReg))); - value14 = rTop10; + assert(!((rTop8 == NoReg))); + value14 = rTop8; nativePopToReg(ssNativeTop(), value14); ssNativePop(1); ssPushNativeRegister(value14); @@ -30888,10 +31113,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 78: /* begin genLowcodeInt64Equal */ /* begin allocateRegistersForLowcodeInteger4: */ - rTop11 = (rNext6 = (rNextNext = (rNextNextNext = NoReg))); + rTop9 = (rNext6 = (rNextNext = (rNextNextNext = NoReg))); nativeValueIndex = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop11 = nativeRegisterOrNone(ssNativeTop()); + rTop9 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext6 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -30920,7 +31145,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) nativeValueIndex += 1; } } - if (rTop11 == NoReg) { + if (rTop9 == NoReg) { nextRegisterMask = 0; if (rNext6 != NoReg) { /* begin registerMaskFor: */ @@ -30932,11 +31157,11 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) if (rNextNextNext != NoReg) { nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rTop11 = allocateRegNotConflictingWith(nextRegisterMask); + rTop9 = allocateRegNotConflictingWith(nextRegisterMask); } if (rNext6 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1U << rTop11; + nextRegisterMask = 1U << rTop9; if (rNextNext != NoReg) { nextRegisterMask = nextRegisterMask | (1U << rNextNext); } @@ -30947,7 +31172,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNext == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask = (1U << rTop11) | (1U << rNext6); + nextRegisterMask = (1U << rTop9) | (1U << rNext6); if (rNextNextNext != NoReg) { nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } @@ -30955,14 +31180,14 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNextNext == NoReg) { /* begin registerMaskFor:and:and: */ - nextRegisterMask = ((1U << rTop11) | (1U << rNext6)) | (1U << rNextNext); + nextRegisterMask = ((1U << rTop9) | (1U << rNext6)) | (1U << rNextNext); rNextNextNext = allocateRegNotConflictingWith(nextRegisterMask); } - assert(!(((rTop11 == NoReg) + assert(!(((rTop9 == NoReg) || ((rNext6 == NoReg) || ((rNextNext == NoReg) || (rNextNextNext == NoReg)))))); - secondLow = rTop11; + secondLow = rTop9; secondHigh = rNext6; firstLow = rNextNext; firstHigh = rNextNextNext; @@ -30994,10 +31219,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 79: /* begin genLowcodeInt64Great */ topRegistersMask8 = 0; - rTop13 = (rNext7 = NoReg); - rResult21 = NoReg; + rTop10 = (rNext7 = NoReg); + rResult20 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop13 = nativeRegisterOrNone(ssNativeTop()); + rTop10 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext7 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31009,19 +31234,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask8 = 1U << reg7; } } - if (rTop13 == NoReg) { - rTop13 = allocateRegNotConflictingWith(topRegistersMask8); + if (rTop10 == NoReg) { + rTop10 = allocateRegNotConflictingWith(topRegistersMask8); } if (rNext7 == NoReg) { - rNext7 = allocateRegNotConflictingWith(1U << rTop13); + rNext7 = allocateRegNotConflictingWith(1U << rTop10); } - assert(!(((rTop13 == NoReg) + assert(!(((rTop10 == NoReg) || (rNext7 == NoReg)))); - rResult21 = allocateFloatRegNotConflictingWith((1U << rTop13) | (1U << rNext7)); - assert(!((rResult21 == NoReg))); - second7 = rTop13; + rResult20 = allocateFloatRegNotConflictingWith((1U << rTop10) | (1U << rNext7)); + assert(!((rResult20 == NoReg))); + second7 = rTop10; first7 = rNext7; - value15 = rResult21; + value15 = rResult20; nativePopToReg(ssNativeTop(), second7); ssNativePop(1); nativePopToReg(ssNativeTop(), first7); @@ -31032,10 +31257,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 80: /* begin genLowcodeInt64GreatEqual */ topRegistersMask9 = 0; - rTop14 = (rNext8 = NoReg); - rResult22 = NoReg; + rTop12 = (rNext8 = NoReg); + rResult21 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop14 = nativeRegisterOrNone(ssNativeTop()); + rTop12 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31047,19 +31272,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask9 = 1U << reg8; } } - if (rTop14 == NoReg) { - rTop14 = allocateRegNotConflictingWith(topRegistersMask9); + if (rTop12 == NoReg) { + rTop12 = allocateRegNotConflictingWith(topRegistersMask9); } if (rNext8 == NoReg) { - rNext8 = allocateRegNotConflictingWith(1U << rTop14); + rNext8 = allocateRegNotConflictingWith(1U << rTop12); } - assert(!(((rTop14 == NoReg) + assert(!(((rTop12 == NoReg) || (rNext8 == NoReg)))); - rResult22 = allocateFloatRegNotConflictingWith((1U << rTop14) | (1U << rNext8)); - assert(!((rResult22 == NoReg))); - second8 = rTop14; + rResult21 = allocateFloatRegNotConflictingWith((1U << rTop12) | (1U << rNext8)); + assert(!((rResult21 == NoReg))); + second8 = rTop12; first8 = rNext8; - value16 = rResult22; + value16 = rResult21; nativePopToReg(ssNativeTop(), second8); ssNativePop(1); nativePopToReg(ssNativeTop(), first8); @@ -31070,10 +31295,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 81: /* begin genLowcodeInt64Less */ topRegistersMask10 = 0; - rTop15 = (rNext9 = NoReg); - rResult23 = NoReg; + rTop13 = (rNext9 = NoReg); + rResult22 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop15 = nativeRegisterOrNone(ssNativeTop()); + rTop13 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31085,19 +31310,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask10 = 1U << reg9; } } - if (rTop15 == NoReg) { - rTop15 = allocateRegNotConflictingWith(topRegistersMask10); + if (rTop13 == NoReg) { + rTop13 = allocateRegNotConflictingWith(topRegistersMask10); } if (rNext9 == NoReg) { - rNext9 = allocateRegNotConflictingWith(1U << rTop15); + rNext9 = allocateRegNotConflictingWith(1U << rTop13); } - assert(!(((rTop15 == NoReg) + assert(!(((rTop13 == NoReg) || (rNext9 == NoReg)))); - rResult23 = allocateFloatRegNotConflictingWith((1U << rTop15) | (1U << rNext9)); - assert(!((rResult23 == NoReg))); - second9 = rTop15; + rResult22 = allocateFloatRegNotConflictingWith((1U << rTop13) | (1U << rNext9)); + assert(!((rResult22 == NoReg))); + second9 = rTop13; first9 = rNext9; - value17 = rResult23; + value17 = rResult22; nativePopToReg(ssNativeTop(), second9); ssNativePop(1); nativePopToReg(ssNativeTop(), first9); @@ -31108,10 +31333,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 82: /* begin genLowcodeInt64LessEqual */ topRegistersMask11 = 0; - rTop16 = (rNext10 = NoReg); - rResult24 = NoReg; + rTop14 = (rNext10 = NoReg); + rResult23 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop16 = nativeRegisterOrNone(ssNativeTop()); + rTop14 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31123,19 +31348,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask11 = 1U << reg10; } } - if (rTop16 == NoReg) { - rTop16 = allocateRegNotConflictingWith(topRegistersMask11); + if (rTop14 == NoReg) { + rTop14 = allocateRegNotConflictingWith(topRegistersMask11); } if (rNext10 == NoReg) { - rNext10 = allocateRegNotConflictingWith(1U << rTop16); + rNext10 = allocateRegNotConflictingWith(1U << rTop14); } - assert(!(((rTop16 == NoReg) + assert(!(((rTop14 == NoReg) || (rNext10 == NoReg)))); - rResult24 = allocateFloatRegNotConflictingWith((1U << rTop16) | (1U << rNext10)); - assert(!((rResult24 == NoReg))); - second10 = rTop16; + rResult23 = allocateFloatRegNotConflictingWith((1U << rTop14) | (1U << rNext10)); + assert(!((rResult23 == NoReg))); + second10 = rTop14; first10 = rNext10; - value18 = rResult24; + value18 = rResult23; nativePopToReg(ssNativeTop(), second10); ssNativePop(1); nativePopToReg(ssNativeTop(), first10); @@ -31146,10 +31371,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 83: /* begin genLowcodeInt64NotEqual */ /* begin allocateRegistersForLowcodeInteger4: */ - rTop17 = (rNext12 = (rNextNext1 = (rNextNextNext1 = NoReg))); + rTop15 = (rNext12 = (rNextNext1 = (rNextNextNext1 = NoReg))); nativeValueIndex1 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop17 = nativeRegisterOrNone(ssNativeTop()); + rTop15 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext12 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31178,7 +31403,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) nativeValueIndex1 += 1; } } - if (rTop17 == NoReg) { + if (rTop15 == NoReg) { nextRegisterMask1 = 0; if (rNext12 != NoReg) { /* begin registerMaskFor: */ @@ -31190,11 +31415,11 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) if (rNextNextNext1 != NoReg) { nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNextNext1); } - rTop17 = allocateRegNotConflictingWith(nextRegisterMask1); + rTop15 = allocateRegNotConflictingWith(nextRegisterMask1); } if (rNext12 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1U << rTop17; + nextRegisterMask1 = 1U << rTop15; if (rNextNext1 != NoReg) { nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); } @@ -31205,7 +31430,7 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNext1 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask1 = (1U << rTop17) | (1U << rNext12); + nextRegisterMask1 = (1U << rTop15) | (1U << rNext12); if (rNextNextNext1 != NoReg) { nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNextNext1); } @@ -31213,14 +31438,14 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) } if (rNextNextNext1 == NoReg) { /* begin registerMaskFor:and:and: */ - nextRegisterMask1 = ((1U << rTop17) | (1U << rNext12)) | (1U << rNextNext1); + nextRegisterMask1 = ((1U << rTop15) | (1U << rNext12)) | (1U << rNextNext1); rNextNextNext1 = allocateRegNotConflictingWith(nextRegisterMask1); } - assert(!(((rTop17 == NoReg) + assert(!(((rTop15 == NoReg) || ((rNext12 == NoReg) || ((rNextNext1 == NoReg) || (rNextNextNext1 == NoReg)))))); - secondLow5 = rTop17; + secondLow5 = rTop15; secondHigh5 = rNext12; firstLow5 = rNextNext1; firstHigh5 = rNextNextNext1; @@ -31251,18 +31476,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 84: /* begin genLowcodeInt64ToFloat32 */ - rTop19 = NoReg; + rTop17 = NoReg; frResult6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop19 = nativeRegisterOrNone(ssNativeTop()); + rTop17 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop19 == NoReg) { - rTop19 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop17 == NoReg) { + rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult6 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop19 == NoReg) + assert(!(((rTop17 == NoReg) || (frResult6 == NoReg)))); - value19 = rTop19; + value19 = rTop17; result2 = frResult6; nativePopToReg(ssNativeTop(), value19); ssNativePop(1); @@ -31271,18 +31496,18 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 85: /* begin genLowcodeInt64ToFloat64 */ - rTop20 = NoReg; + rTop18 = NoReg; frResult7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop20 = nativeRegisterOrNone(ssNativeTop()); + rTop18 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop20 == NoReg) { - rTop20 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop18 == NoReg) { + rTop18 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult7 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop20 == NoReg) + assert(!(((rTop18 == NoReg) || (frResult7 == NoReg)))); - value20 = rTop20; + value20 = rTop18; result3 = frResult7; nativePopToReg(ssNativeTop(), value20); ssNativePop(1); @@ -31293,9 +31518,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeInt64ToPointer */ /* begin allocateRegistersForLowcodeInteger2: */ topRegistersMask13 = 0; - rTop21 = (rNext14 = NoReg); + rTop19 = (rNext14 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop21 = nativeRegisterOrNone(ssNativeTop()); + rTop19 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31307,15 +31532,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask13 = 1U << reg12; } } - if (rTop21 == NoReg) { - rTop21 = allocateRegNotConflictingWith(topRegistersMask13); + if (rTop19 == NoReg) { + rTop19 = allocateRegNotConflictingWith(topRegistersMask13); } if (rNext14 == NoReg) { - rNext14 = allocateRegNotConflictingWith(1U << rTop21); + rNext14 = allocateRegNotConflictingWith(1U << rTop19); } - assert(!(((rTop21 == NoReg) + assert(!(((rTop19 == NoReg) || (rNext14 == NoReg)))); - valueLow2 = rTop21; + valueLow2 = rTop19; valueHigh2 = rNext14; nativePopToRegsecondReg(ssNativeTop(), valueLow2, valueHigh2); ssNativePop(1); @@ -31325,9 +31550,9 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 87: /* begin genLowcodeLeftShift32 */ topRegistersMask14 = 0; - rTop22 = (rNext15 = NoReg); + rTop20 = (rNext15 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop22 = nativeRegisterOrNone(ssNativeTop()); + rTop20 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31339,15 +31564,15 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask14 = 1U << reg13; } } - if (rTop22 == NoReg) { - rTop22 = allocateRegNotConflictingWith(topRegistersMask14); + if (rTop20 == NoReg) { + rTop20 = allocateRegNotConflictingWith(topRegistersMask14); } if (rNext15 == NoReg) { - rNext15 = allocateRegNotConflictingWith(1U << rTop22); + rNext15 = allocateRegNotConflictingWith(1U << rTop20); } - assert(!(((rTop22 == NoReg) + assert(!(((rTop20 == NoReg) || (rNext15 == NoReg)))); - shiftAmount = rTop22; + shiftAmount = rTop20; value22 = rNext15; nativePopToReg(ssNativeTop(), shiftAmount); ssNativePop(1); @@ -31361,10 +31586,10 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 88: /* begin genLowcodeLeftShift64 */ topRegistersMask15 = 0; - rTop23 = (rNext16 = NoReg); - rResult25 = NoReg; + rTop21 = (rNext16 = NoReg); + rResult24 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop23 = nativeRegisterOrNone(ssNativeTop()); + rTop21 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { rNext16 = nativeRegisterSecondOrNone(ssNativeTop()); } @@ -31376,19 +31601,19 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) topRegistersMask15 = 1U << reg14; } } - if (rTop23 == NoReg) { - rTop23 = allocateRegNotConflictingWith(topRegistersMask15); + if (rTop21 == NoReg) { + rTop21 = allocateRegNotConflictingWith(topRegistersMask15); } if (rNext16 == NoReg) { - rNext16 = allocateRegNotConflictingWith(1U << rTop23); + rNext16 = allocateRegNotConflictingWith(1U << rTop21); } - assert(!(((rTop23 == NoReg) + assert(!(((rTop21 == NoReg) || (rNext16 == NoReg)))); - rResult25 = allocateFloatRegNotConflictingWith((1U << rTop23) | (1U << rNext16)); - assert(!((rResult25 == NoReg))); - shiftAmount1 = rTop23; + rResult24 = allocateFloatRegNotConflictingWith((1U << rTop21) | (1U << rNext16)); + assert(!((rResult24 == NoReg))); + shiftAmount1 = rTop21; value23 = rNext16; - result4 = rResult25; + result4 = rResult24; nativePopToReg(ssNativeTop(), shiftAmount1); ssNativePop(1); nativePopToReg(ssNativeTop(), value23); @@ -31475,13 +31700,13 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadArgumentInt64 */ baseOffset20 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult26 = (rResult27 = NoReg); - rResult26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult27 = allocateRegNotConflictingWith(1U << rResult26); - assert(!(((rResult26 == NoReg) - || (rResult27 == NoReg)))); - valueLow4 = rResult26; - valueHigh4 = rResult27; + rResult25 = (rResult26 = NoReg); + rResult25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult26 = allocateRegNotConflictingWith(1U << rResult25); + assert(!(((rResult25 == NoReg) + || (rResult26 == NoReg)))); + valueLow4 = rResult25; + valueHigh4 = rResult26; loadNativeArgumentAddressto(baseOffset20, TempReg); /* begin checkQuickConstant:forInstruction: */ anInstruction20 = genoperandoperandoperand(MoveM32rR, 0, TempReg, valueLow4); @@ -31557,13 +31782,13 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadArgumentUInt64 */ baseOffset21 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult28 = (rResult29 = NoReg); - rResult28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult29 = allocateRegNotConflictingWith(1U << rResult28); - assert(!(((rResult28 == NoReg) - || (rResult29 == NoReg)))); - valueLow5 = rResult28; - valueHigh5 = rResult29; + rResult27 = (rResult28 = NoReg); + rResult27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult28 = allocateRegNotConflictingWith(1U << rResult27); + assert(!(((rResult27 == NoReg) + || (rResult28 == NoReg)))); + valueLow5 = rResult27; + valueHigh5 = rResult28; loadNativeArgumentAddressto(baseOffset21, TempReg); /* begin checkQuickConstant:forInstruction: */ anInstruction28 = genoperandoperandoperand(MoveM32rR, 0, TempReg, valueLow5); @@ -31590,67 +31815,67 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 101: /* begin genLowcodeLoadFloat32FromMemory */ - rTop24 = NoReg; + rTop22 = NoReg; frResult8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop24 = nativeRegisterOrNone(ssNativeTop()); + rTop22 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop24 == NoReg) { - rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop22 == NoReg) { + rTop22 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult8 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop24 == NoReg) + assert(!(((rTop22 == NoReg) || (frResult8 == NoReg)))); - pointer3 = rTop24; + pointer2 = rTop22; value26 = frResult8; - nativePopToReg(ssNativeTop(), pointer3); + nativePopToReg(ssNativeTop(), pointer2); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction33 = genoperandoperandoperand(MoveM32rRs, 0, pointer3, value26); + anInstruction33 = genoperandoperandoperand(MoveM32rRs, 0, pointer2, value26); ssPushNativeRegisterSingleFloat(value26); return 0; case 102: /* begin genLowcodeLoadFloat64FromMemory */ - rTop25 = NoReg; + rTop23 = NoReg; frResult9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop25 = nativeRegisterOrNone(ssNativeTop()); + rTop23 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop25 == NoReg) { - rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop23 == NoReg) { + rTop23 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } frResult9 = allocateFloatRegNotConflictingWith(0 /* emptyRegisterMask */); - assert(!(((rTop25 == NoReg) + assert(!(((rTop23 == NoReg) || (frResult9 == NoReg)))); - pointer4 = rTop25; + pointer3 = rTop23; value27 = frResult9; - nativePopToReg(ssNativeTop(), pointer4); + nativePopToReg(ssNativeTop(), pointer3); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction34 = genoperandoperandoperand(MoveM64rRd, 0, pointer4, value27); + anInstruction34 = genoperandoperandoperand(MoveM64rRd, 0, pointer3, value27); ssPushNativeRegisterDoubleFloat(value27); return 0; case 103: /* begin genLowcodeLoadInt16FromMemory */ - rTop26 = NoReg; - rResult30 = NoReg; + rTop24 = NoReg; + rResult29 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop26 = nativeRegisterOrNone(ssNativeTop()); + rTop24 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop26 == NoReg) { - rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop24 == NoReg) { + rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult30 = allocateRegNotConflictingWith(1U << rTop26); - assert(!(((rTop26 == NoReg) - || (rResult30 == NoReg)))); - pointer5 = rTop26; - value28 = rResult30; - nativePopToReg(ssNativeTop(), pointer5); + rResult29 = allocateRegNotConflictingWith(1U << rTop24); + assert(!(((rTop24 == NoReg) + || (rResult29 == NoReg)))); + pointer4 = rTop24; + value28 = rResult29; + nativePopToReg(ssNativeTop(), pointer4); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction35 = genoperandoperandoperand(MoveM16rR, 0, pointer5, value28); + anInstruction35 = genoperandoperandoperand(MoveM16rR, 0, pointer4, value28); /* begin SignExtend16R:R: */ genoperandoperand(SignExtend16RR, value28, value28); ssPushNativeRegister(value28); @@ -31658,73 +31883,73 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 104: /* begin genLowcodeLoadInt32FromMemory */ - rTop27 = NoReg; - rResult31 = NoReg; + rTop25 = NoReg; + rResult30 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop27 = nativeRegisterOrNone(ssNativeTop()); + rTop25 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop27 == NoReg) { - rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop25 == NoReg) { + rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult31 = allocateRegNotConflictingWith(1U << rTop27); - assert(!(((rTop27 == NoReg) - || (rResult31 == NoReg)))); - pointer6 = rTop27; - value29 = rResult31; - nativePopToReg(ssNativeTop(), pointer6); + rResult30 = allocateRegNotConflictingWith(1U << rTop25); + assert(!(((rTop25 == NoReg) + || (rResult30 == NoReg)))); + pointer5 = rTop25; + value29 = rResult30; + nativePopToReg(ssNativeTop(), pointer5); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction36 = genoperandoperandoperand(MoveM32rR, 0, pointer6, value29); + anInstruction36 = genoperandoperandoperand(MoveM32rR, 0, pointer5, value29); ssPushNativeRegister(value29); return 0; case 105: /* begin genLowcodeLoadInt64FromMemory */ /* begin allocateRegistersForLowcodeIntegerResultInteger2: */ - rTop28 = NoReg; - rResult32 = (rResult32 = NoReg); + rTop26 = NoReg; + rResult31 = (rResult31 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop28 = nativeRegisterOrNone(ssNativeTop()); + rTop26 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop28 == NoReg) { - rTop28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop26 == NoReg) { + rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult32 = allocateRegNotConflictingWith(1U << rTop28); - rResult210 = allocateRegNotConflictingWith((1U << rTop28) | (1U << rResult32)); - assert(!(((rTop28 == NoReg) - || ((rResult32 == NoReg) + rResult31 = allocateRegNotConflictingWith(1U << rTop26); + rResult210 = allocateRegNotConflictingWith((1U << rTop26) | (1U << rResult31)); + assert(!(((rTop26 == NoReg) + || ((rResult31 == NoReg) || (rResult210 == NoReg))))); - pointer7 = rTop28; - valueLow6 = rResult32; + pointer6 = rTop26; + valueLow6 = rResult31; valueHigh6 = rResult210; - nativePopToReg(ssNativeTop(), pointer7); + nativePopToReg(ssNativeTop(), pointer6); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction37 = genoperandoperandoperand(MoveM32rR, 0, pointer7, valueLow6); + anInstruction37 = genoperandoperandoperand(MoveM32rR, 0, pointer6, valueLow6); /* begin checkQuickConstant:forInstruction: */ - anInstruction112 = genoperandoperandoperand(MoveM32rR, 4, pointer7, valueHigh6); + anInstruction112 = genoperandoperandoperand(MoveM32rR, 4, pointer6, valueHigh6); ssPushNativeRegistersecondRegister(valueLow6, valueHigh6); return 0; case 106: /* begin genLowcodeLoadInt8FromMemory */ - rTop29 = NoReg; - rResult33 = NoReg; + rTop27 = NoReg; + rResult32 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop29 = nativeRegisterOrNone(ssNativeTop()); + rTop27 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop29 == NoReg) { - rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop27 == NoReg) { + rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult33 = allocateRegNotConflictingWith(1U << rTop29); - assert(!(((rTop29 == NoReg) - || (rResult33 == NoReg)))); - pointer8 = rTop29; - value31 = rResult33; - nativePopToReg(ssNativeTop(), pointer8); + rResult32 = allocateRegNotConflictingWith(1U << rTop27); + assert(!(((rTop27 == NoReg) + || (rResult32 == NoReg)))); + pointer7 = rTop27; + value31 = rResult32; + nativePopToReg(ssNativeTop(), pointer7); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction38 = genoperandoperandoperand(MoveM8rR, 0, pointer8, value31); + anInstruction38 = genoperandoperandoperand(MoveM8rR, 0, pointer7, value31); /* begin SignExtend8R:R: */ genoperandoperand(SignExtend8RR, value31, value31); ssPushNativeRegister(value31); @@ -31809,12 +32034,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadLocalInt64 */ baseOffset22 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult34 = (rResult211 = NoReg); - rResult34 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult211 = allocateRegNotConflictingWith(1U << rResult34); - assert(!(((rResult34 == NoReg) + rResult33 = (rResult211 = NoReg); + rResult33 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult211 = allocateRegNotConflictingWith(1U << rResult33); + assert(!(((rResult33 == NoReg) || (rResult211 == NoReg)))); - valueLow7 = rResult34; + valueLow7 = rResult33; valueHigh7 = rResult211; loadNativeLocalAddressto(baseOffset22, TempReg); /* begin checkQuickConstant:forInstruction: */ @@ -31891,12 +32116,12 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) /* begin genLowcodeLoadLocalUInt64 */ baseOffset23 = extA; /* begin allocateRegistersForLowcodeResultInteger2: */ - rResult35 = (rResult212 = NoReg); - rResult35 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); - rResult212 = allocateRegNotConflictingWith(1U << rResult35); - assert(!(((rResult35 == NoReg) + rResult34 = (rResult212 = NoReg); + rResult34 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + rResult212 = allocateRegNotConflictingWith(1U << rResult34); + assert(!(((rResult34 == NoReg) || (rResult212 == NoReg)))); - valueLow8 = rResult35; + valueLow8 = rResult34; valueHigh8 = rResult212; loadNativeLocalAddressto(baseOffset23, TempReg); /* begin checkQuickConstant:forInstruction: */ @@ -31924,31 +32149,31 @@ genLowcodeUnaryInlinePrimitive2(sqInt prim) case 119: /* begin genLowcodeLoadObjectAt */ - rTop30 = (rOopTop3 = NoReg); - topRegisterMask1 = 0; + rTop28 = (rOopTop = NoReg); + topRegisterMask = 0; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop30 = nativeRegisterOrNone(ssNativeTop()); + rTop28 = nativeRegisterOrNone(ssNativeTop()); } if ((registerOrNone(ssTop())) != NoReg) { - rOopTop3 = registerOrNone(ssTop()); + rOopTop = registerOrNone(ssTop()); /* begin registerMaskFor: */ - topRegisterMask1 = 1U << rOopTop3; + topRegisterMask = 1U << rOopTop; } - if (rTop30 == NoReg) { - rTop30 = allocateRegNotConflictingWith(topRegisterMask1); + if (rTop28 == NoReg) { + rTop28 = allocateRegNotConflictingWith(topRegisterMask); } - if (rOopTop3 == NoReg) { - rOopTop3 = allocateRegNotConflictingWith(1U << rTop30); + if (rOopTop == NoReg) { + rOopTop = allocateRegNotConflictingWith(1U << rTop28); } - assert(!(((rTop30 == NoReg) - || (rOopTop3 == NoReg)))); - fieldIndex = rTop30; - object2 = rOopTop3; + assert(!(((rTop28 == NoReg) + || (rOopTop == NoReg)))); + fieldIndex = rTop28; + object = rOopTop; nativePopToReg(ssNativeTop(), fieldIndex); ssNativePop(1); - popToReg(ssTop(), object2); + popToReg(ssTop(), object); ssPop(1); - genLcLoadObjectat(object2, fieldIndex); + genLcLoadObjectat(object, fieldIndex); return 0; default: @@ -31967,7 +32192,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; - AbstractInstruction *abstractInstruction12; + AbstractInstruction *abstractInstruction11; AbstractInstruction *abstractInstruction2; AbstractInstruction *abstractInstruction3; AbstractInstruction *abstractInstruction4; @@ -32023,6 +32248,12 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt frTop; sqInt frTop1; sqInt i1; + sqInt i2; + sqInt i3; + sqInt i4; + sqInt i5; + sqInt i6; + sqInt i7; sqInt index1; sqInt nativeValueIndex; sqInt nativeValueIndex1; @@ -32051,10 +32282,11 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt pointer7; sqInt pointer8; sqInt pointerResult; - sqInt pointerValue9; + sqInt pointerValue7; sqInt quickConstant; sqInt reg; sqInt reg1; + sqInt reg10; sqInt reg11; sqInt reg13; sqInt reg14; @@ -32064,7 +32296,6 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt reg3; sqInt reg4; sqInt reg5; - sqInt reg6; sqInt reg7; sqInt reg9; sqInt registerID; @@ -32079,7 +32310,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt rNext; sqInt rNext1; sqInt rNext10; - sqInt rNext12; + sqInt rNext13; sqInt rNext14; sqInt rNext15; sqInt rNext2; @@ -32111,9 +32342,8 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt rTop; sqInt rTop1; sqInt rTop10; - sqInt rTop13; sqInt rTop14; - sqInt rTop15; + sqInt rTop16; sqInt rTop17; sqInt rTop18; sqInt rTop2; @@ -32130,6 +32360,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt rTop3; sqInt rTop30; sqInt rTop31; + sqInt rTop32; sqInt rTop4; sqInt rTop5; sqInt rTop6; @@ -32163,9 +32394,9 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) sqInt topRegistersMask2; sqInt topRegistersMask3; sqInt topRegistersMask4; - sqInt topRegistersMask5; sqInt topRegistersMask6; sqInt topRegistersMask8; + sqInt topRegistersMask9; sqInt value; sqInt value1; sqInt value10; @@ -32379,7 +32610,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 0x7F: /* begin genLowcodeLockRegisters */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 <= simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); return 0; @@ -32390,139 +32629,155 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 129: /* begin genLowcodeMalloc32 */ - rTop5 = NoReg; - rResult5 = NoReg; + rTop28 = NoReg; + rResult8 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop5 = nativeRegisterOrNone(ssNativeTop()); + rTop28 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop5 == NoReg) { - rTop5 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop28 == NoReg) { + rTop28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult5 = allocateRegNotConflictingWith(1U << rTop5); - assert(!(((rTop5 == NoReg) - || (rResult5 == NoReg)))); - size1 = rTop5; - pointer5 = rResult5; + rResult8 = allocateRegNotConflictingWith(1U << rTop28); + assert(!(((rTop28 == NoReg) + || (rResult8 == NoReg)))); + size1 = rTop28; + pointer7 = rResult8; nativePopToReg(ssNativeTop(), size1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 <= simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); if (size1 != ReceiverResultReg) { /* begin MoveR:R: */ genoperandoperand(MoveRR, size1, ReceiverResultReg); } /* begin CallRT: */ - abstractInstruction2 = genoperand(Call, ceMallocTrampoline); - (abstractInstruction2->annotation = IsRelativeCall); + abstractInstruction3 = genoperand(Call, ceMallocTrampoline); + (abstractInstruction3->annotation = IsRelativeCall); /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, pointer5); - ssPushNativeRegister(pointer5); + genoperandoperand(MoveRR, TempReg, pointer7); + ssPushNativeRegister(pointer7); return 0; case 130: /* begin genLowcodeMalloc64 */ /* begin allocateRegistersForLowcodeInteger2ResultInteger: */ - topRegistersMask = 0; - rTop6 = (rNext = NoReg); - rResult6 = NoReg; + topRegistersMask12 = 0; + rTop29 = (rNext10 = NoReg); + rResult9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop6 = nativeRegisterOrNone(ssNativeTop()); + rTop29 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext = nativeRegisterSecondOrNone(ssNativeTop()); + rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext == NoReg) { + if (rNext10 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg = (rNext = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask = 1U << reg; + reg15 = (rNext10 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask12 = 1U << reg15; } } - if (rTop6 == NoReg) { - rTop6 = allocateRegNotConflictingWith(topRegistersMask); + if (rTop29 == NoReg) { + rTop29 = allocateRegNotConflictingWith(topRegistersMask12); } - if (rNext == NoReg) { - rNext = allocateRegNotConflictingWith(1U << rTop6); + if (rNext10 == NoReg) { + rNext10 = allocateRegNotConflictingWith(1U << rTop29); } - assert(!(((rTop6 == NoReg) - || (rNext == NoReg)))); - rResult6 = allocateFloatRegNotConflictingWith((1U << rTop6) | (1U << rNext)); - assert(!((rResult6 == NoReg))); - sizeLow = rTop6; - sizeHigh = rNext; - pointer6 = rResult6; + assert(!(((rTop29 == NoReg) + || (rNext10 == NoReg)))); + rResult9 = allocateFloatRegNotConflictingWith((1U << rTop29) | (1U << rNext10)); + assert(!((rResult9 == NoReg))); + sizeLow = rTop29; + sizeHigh = rNext10; + pointer8 = rResult9; nativePopToRegsecondReg(ssNativeTop(), sizeLow, sizeHigh); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 <= simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); if (sizeLow != ReceiverResultReg) { /* begin MoveR:R: */ genoperandoperand(MoveRR, sizeLow, ReceiverResultReg); } /* begin CallRT: */ - abstractInstruction3 = genoperand(Call, ceMallocTrampoline); - (abstractInstruction3->annotation = IsRelativeCall); + abstractInstruction4 = genoperand(Call, ceMallocTrampoline); + (abstractInstruction4->annotation = IsRelativeCall); /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, pointer6); - ssPushNativeRegister(pointer6); + genoperandoperand(MoveRR, TempReg, pointer8); + ssPushNativeRegister(pointer8); return 0; case 131: /* begin genLowcodeMemcpy32 */ - rTop7 = (rNext1 = (rNextNext = NoReg)); - nativeValueIndex = 1; + rTop30 = (rNext13 = (rNextNext2 = NoReg)); + nativeValueIndex2 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop7 = nativeRegisterOrNone(ssNativeTop()); + rTop30 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext13 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext1 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNextNext = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex)); + if (rNext13 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNext13 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNextNext2 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2)); } - nativeValueIndex += 1; + nativeValueIndex2 += 1; } } - if (rNextNext == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { - rNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + if (rNextNext2 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { + rNextNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); } } - if (rTop7 == NoReg) { - nextRegisterMask = 0; - if (rNext1 != NoReg) { + if (rTop30 == NoReg) { + nextRegisterMask2 = 0; + if (rNext13 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1U << rNext1; + nextRegisterMask2 = 1U << rNext13; } - if (rNextNext != NoReg) { - nextRegisterMask = nextRegisterMask | (1U << rNextNext); + if (rNextNext2 != NoReg) { + nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); } - rTop7 = allocateRegNotConflictingWith(nextRegisterMask); + rTop30 = allocateRegNotConflictingWith(nextRegisterMask2); } - if (rNext1 == NoReg) { + if (rNext13 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask = 1U << rTop7; - if (rNextNext != NoReg) { - nextRegisterMask = nextRegisterMask | (1U << rNextNext); + nextRegisterMask2 = 1U << rTop30; + if (rNextNext2 != NoReg) { + nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); } - rNext1 = allocateRegNotConflictingWith(nextRegisterMask); + rNext13 = allocateRegNotConflictingWith(nextRegisterMask2); } - if (rNextNext == NoReg) { + if (rNextNext2 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask = (1U << rTop7) | (1U << rNext1); - rNextNext = allocateRegNotConflictingWith(nextRegisterMask); + nextRegisterMask2 = (1U << rTop30) | (1U << rNext13); + rNextNext2 = allocateRegNotConflictingWith(nextRegisterMask2); } - assert(!(((rTop7 == NoReg) - || ((rNext1 == NoReg) - || (rNextNext == NoReg))))); - size3 = rTop7; - source = rNext1; - dest = rNextNext; + assert(!(((rTop30 == NoReg) + || ((rNext13 == NoReg) + || (rNextNext2 == NoReg))))); + size3 = rTop30; + source = rNext13; + dest = rNextNext2; nativePopToReg(ssNativeTop(), size3); ssNativePop(1); nativePopToReg(ssNativeTop(), source); @@ -32530,65 +32785,73 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) nativePopToReg(ssNativeTop(), dest); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i5 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i5 <= simStackPtr; i5 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i5), frameOffsetOfTemporary(i5 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytosize(backEnd, source, dest, size3); return 0; case 132: /* begin genLowcodeMemcpy64 */ - rTop8 = (rNext2 = (rNextNext1 = NoReg)); - nativeValueIndex1 = 1; + rTop31 = (rNext14 = (rNextNext3 = NoReg)); + nativeValueIndex3 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop8 = nativeRegisterOrNone(ssNativeTop()); + rTop31 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext2 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNextNext1 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1)); + if (rNext14 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNext14 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNextNext3 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3)); } - nativeValueIndex1 += 1; + nativeValueIndex3 += 1; } } - if (rNextNext1 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { - rNextNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); + if (rNextNext3 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { + rNextNext3 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); } } - if (rTop8 == NoReg) { - nextRegisterMask1 = 0; - if (rNext2 != NoReg) { + if (rTop31 == NoReg) { + nextRegisterMask3 = 0; + if (rNext14 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1U << rNext2; + nextRegisterMask3 = 1U << rNext14; } - if (rNextNext1 != NoReg) { - nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); + if (rNextNext3 != NoReg) { + nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); } - rTop8 = allocateRegNotConflictingWith(nextRegisterMask1); + rTop31 = allocateRegNotConflictingWith(nextRegisterMask3); } - if (rNext2 == NoReg) { + if (rNext14 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask1 = 1U << rTop8; - if (rNextNext1 != NoReg) { - nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); + nextRegisterMask3 = 1U << rTop31; + if (rNextNext3 != NoReg) { + nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); } - rNext2 = allocateRegNotConflictingWith(nextRegisterMask1); + rNext14 = allocateRegNotConflictingWith(nextRegisterMask3); } - if (rNextNext1 == NoReg) { + if (rNextNext3 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask1 = (1U << rTop8) | (1U << rNext2); - rNextNext1 = allocateRegNotConflictingWith(nextRegisterMask1); + nextRegisterMask3 = (1U << rTop31) | (1U << rNext14); + rNextNext3 = allocateRegNotConflictingWith(nextRegisterMask3); } - assert(!(((rTop8 == NoReg) - || ((rNext2 == NoReg) - || (rNextNext1 == NoReg))))); - size4 = rTop8; - source1 = rNext2; - dest1 = rNextNext1; + assert(!(((rTop31 == NoReg) + || ((rNext14 == NoReg) + || (rNextNext3 == NoReg))))); + size4 = rTop31; + source1 = rNext14; + dest1 = rNextNext3; nativePopToReg(ssNativeTop(), size4); ssNativePop(1); nativePopToReg(ssNativeTop(), source1); @@ -32596,7 +32859,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) nativePopToReg(ssNativeTop(), dest1); ssNativePop(1); /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i6 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i6 <= simStackPtr; i6 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i6), frameOffsetOfTemporary(i6 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytosize(backEnd, source1, dest1, sizeLow1); return 0; @@ -32605,44 +32876,52 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodeMemcpyFixed */ size5 = extA; /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask1 = 0; - rTop9 = (rNext3 = NoReg); + topRegistersMask13 = 0; + rTop32 = (rNext15 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop9 = nativeRegisterOrNone(ssNativeTop()); + rTop32 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext3 == NoReg) { + if (rNext15 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg2 = (rNext3 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask1 = 1U << reg2; + reg16 = (rNext15 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask13 = 1U << reg16; } } - if (rTop9 == NoReg) { - rTop9 = allocateRegNotConflictingWith(topRegistersMask1); + if (rTop32 == NoReg) { + rTop32 = allocateRegNotConflictingWith(topRegistersMask13); } - if (rNext3 == NoReg) { - rNext3 = allocateRegNotConflictingWith(1U << rTop9); + if (rNext15 == NoReg) { + rNext15 = allocateRegNotConflictingWith(1U << rTop32); } - assert(!(((rTop9 == NoReg) - || (rNext3 == NoReg)))); - source2 = rTop9; - dest2 = rNext3; + assert(!(((rTop32 == NoReg) + || (rNext15 == NoReg)))); + source2 = rTop32; + dest2 = rNext15; nativePopToReg(ssNativeTop(), source2); ssNativePop(1); nativePopToReg(ssNativeTop(), dest2); ssNativePop(1); if (size5 == BytesPerWord) { /* begin checkQuickConstant:forInstruction: */ - anInstruction10 = genoperandoperandoperand(MoveMwrR, 0, source2, TempReg); + anInstruction23 = genoperandoperandoperand(MoveMwrR, 0, source2, TempReg); /* begin checkQuickConstant:forInstruction: */ - anInstruction13 = genoperandoperandoperand(MoveRMwr, TempReg, 0, dest2); + anInstruction110 = genoperandoperandoperand(MoveRMwr, TempReg, 0, dest2); } else { /* begin ssFlushAll */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i7 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i7 <= simStackPtr; i7 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i7), frameOffsetOfTemporary(i7 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } voidReceiverResultRegContainsSelf(); genMemCopytoconstantSize(backEnd, source2, dest2, size5); } @@ -32691,31 +32970,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 139: /* begin genLowcodeMul32 */ - topRegistersMask2 = 0; - rTop10 = (rNext4 = NoReg); + topRegistersMask = 0; + rTop5 = (rNext = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop10 = nativeRegisterOrNone(ssNativeTop()); + rTop5 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext4 == NoReg) { + if (rNext == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg3 = (rNext4 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask2 = 1U << reg3; + reg = (rNext = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask = 1U << reg; } } - if (rTop10 == NoReg) { - rTop10 = allocateRegNotConflictingWith(topRegistersMask2); + if (rTop5 == NoReg) { + rTop5 = allocateRegNotConflictingWith(topRegistersMask); } - if (rNext4 == NoReg) { - rNext4 = allocateRegNotConflictingWith(1U << rTop10); + if (rNext == NoReg) { + rNext = allocateRegNotConflictingWith(1U << rTop5); } - assert(!(((rTop10 == NoReg) - || (rNext4 == NoReg)))); - second = rTop10; - first = rNext4; + assert(!(((rTop5 == NoReg) + || (rNext == NoReg)))); + second = rTop5; + first = rNext; nativePopToReg(ssNativeTop(), second); ssNativePop(1); nativePopToReg(ssNativeTop(), first); @@ -32727,35 +33006,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 140: /* begin genLowcodeMul64 */ - topRegistersMask3 = 0; - rTop13 = (rNext5 = NoReg); - rResult7 = NoReg; + topRegistersMask1 = 0; + rTop6 = (rNext1 = NoReg); + rResult5 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop13 = nativeRegisterOrNone(ssNativeTop()); + rTop6 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext1 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext5 == NoReg) { + if (rNext1 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg4 = (rNext5 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask3 = 1U << reg4; + reg2 = (rNext1 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask1 = 1U << reg2; } } - if (rTop13 == NoReg) { - rTop13 = allocateRegNotConflictingWith(topRegistersMask3); + if (rTop6 == NoReg) { + rTop6 = allocateRegNotConflictingWith(topRegistersMask1); } - if (rNext5 == NoReg) { - rNext5 = allocateRegNotConflictingWith(1U << rTop13); + if (rNext1 == NoReg) { + rNext1 = allocateRegNotConflictingWith(1U << rTop6); } - assert(!(((rTop13 == NoReg) - || (rNext5 == NoReg)))); - rResult7 = allocateFloatRegNotConflictingWith((1U << rTop13) | (1U << rNext5)); - assert(!((rResult7 == NoReg))); - second1 = rTop13; - first1 = rNext5; - result = rResult7; + assert(!(((rTop6 == NoReg) + || (rNext1 == NoReg)))); + rResult5 = allocateFloatRegNotConflictingWith((1U << rTop6) | (1U << rNext1)); + assert(!((rResult5 == NoReg))); + second1 = rTop6; + first1 = rNext1; + result = rResult5; nativePopToReg(ssNativeTop(), second1); ssNativePop(1); nativePopToReg(ssNativeTop(), first1); @@ -32765,15 +33044,15 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 141: /* begin genLowcodeNeg32 */ - rTop14 = NoReg; + rTop7 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop14 = nativeRegisterOrNone(ssNativeTop()); + rTop7 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop14 == NoReg) { - rTop14 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop7 == NoReg) { + rTop7 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop14 == NoReg))); - value4 = rTop14; + assert(!((rTop7 == NoReg))); + value4 = rTop7; nativePopToReg(ssNativeTop(), value4); ssNativePop(1); /* begin NegateR: */ @@ -32784,31 +33063,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 142: /* begin genLowcodeNeg64 */ /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask4 = 0; - rTop15 = (rNext6 = NoReg); + topRegistersMask2 = 0; + rTop8 = (rNext2 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop15 = nativeRegisterOrNone(ssNativeTop()); + rTop8 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext6 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext2 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext6 == NoReg) { + if (rNext2 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg5 = (rNext6 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask4 = 1U << reg5; + reg3 = (rNext2 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask2 = 1U << reg3; } } - if (rTop15 == NoReg) { - rTop15 = allocateRegNotConflictingWith(topRegistersMask4); + if (rTop8 == NoReg) { + rTop8 = allocateRegNotConflictingWith(topRegistersMask2); } - if (rNext6 == NoReg) { - rNext6 = allocateRegNotConflictingWith(1U << rTop15); + if (rNext2 == NoReg) { + rNext2 = allocateRegNotConflictingWith(1U << rTop8); } - assert(!(((rTop15 == NoReg) - || (rNext6 == NoReg)))); - valueLow1 = rTop15; - valueHigh1 = rNext6; + assert(!(((rTop8 == NoReg) + || (rNext2 == NoReg)))); + valueLow1 = rTop8; + valueHigh1 = rNext2; nativePopToRegsecondReg(ssNativeTop(), valueLow1, valueHigh1); ssNativePop(1); /* begin NotR: */ @@ -32816,23 +33095,23 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin NotR: */ genoperand(NotR, valueHigh1); /* begin checkQuickConstant:forInstruction: */ - anInstruction15 = genoperandoperand(AddCqR, 1, valueLow1); + anInstruction10 = genoperandoperand(AddCqR, 1, valueLow1); /* begin checkQuickConstant:forInstruction: */ - anInstruction14 = genoperandoperand(AddcCqR, 0, valueHigh1); + anInstruction13 = genoperandoperand(AddcCqR, 0, valueHigh1); ssPushNativeRegistersecondRegister(valueLow1, valueHigh1); return 0; case 143: /* begin genLowcodeNot32 */ - rTop17 = NoReg; + rTop9 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop17 = nativeRegisterOrNone(ssNativeTop()); + rTop9 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop17 == NoReg) { - rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop9 == NoReg) { + rTop9 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop17 == NoReg))); - value6 = rTop17; + assert(!((rTop9 == NoReg))); + value6 = rTop9; nativePopToReg(ssNativeTop(), value6); ssNativePop(1); /* begin NotR: */ @@ -32843,31 +33122,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 144: /* begin genLowcodeNot64 */ /* begin allocateRegistersForLowcodeInteger2: */ - topRegistersMask5 = 0; - rTop18 = (rNext7 = NoReg); + topRegistersMask3 = 0; + rTop10 = (rNext3 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop18 = nativeRegisterOrNone(ssNativeTop()); + rTop10 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext7 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext3 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext7 == NoReg) { + if (rNext3 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg6 = (rNext7 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask5 = 1U << reg6; + reg4 = (rNext3 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask3 = 1U << reg4; } } - if (rTop18 == NoReg) { - rTop18 = allocateRegNotConflictingWith(topRegistersMask5); + if (rTop10 == NoReg) { + rTop10 = allocateRegNotConflictingWith(topRegistersMask3); } - if (rNext7 == NoReg) { - rNext7 = allocateRegNotConflictingWith(1U << rTop18); + if (rNext3 == NoReg) { + rNext3 = allocateRegNotConflictingWith(1U << rTop10); } - assert(!(((rTop18 == NoReg) - || (rNext7 == NoReg)))); - valueLow2 = rTop18; - valueHigh2 = rNext7; + assert(!(((rTop10 == NoReg) + || (rNext3 == NoReg)))); + valueLow2 = rTop10; + valueHigh2 = rNext3; nativePopToRegsecondReg(ssNativeTop(), valueLow2, valueHigh2); ssNativePop(1); /* begin NotR: */ @@ -32879,35 +33158,35 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 145: /* begin genLowcodeOr32 */ - topRegistersMask6 = 0; - rTop20 = (rNext8 = NoReg); - rResult8 = NoReg; + topRegistersMask4 = 0; + rTop14 = (rNext4 = NoReg); + rResult6 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop20 = nativeRegisterOrNone(ssNativeTop()); + rTop14 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext4 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext8 == NoReg) { + if (rNext4 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg7 = (rNext8 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask6 = 1U << reg7; + reg5 = (rNext4 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask4 = 1U << reg5; } } - if (rTop20 == NoReg) { - rTop20 = allocateRegNotConflictingWith(topRegistersMask6); + if (rTop14 == NoReg) { + rTop14 = allocateRegNotConflictingWith(topRegistersMask4); } - if (rNext8 == NoReg) { - rNext8 = allocateRegNotConflictingWith(1U << rTop20); + if (rNext4 == NoReg) { + rNext4 = allocateRegNotConflictingWith(1U << rTop14); } - assert(!(((rTop20 == NoReg) - || (rNext8 == NoReg)))); - rResult8 = allocateFloatRegNotConflictingWith((1U << rTop20) | (1U << rNext8)); - assert(!((rResult8 == NoReg))); - second2 = rTop20; - first2 = rNext8; - result1 = rResult8; + assert(!(((rTop14 == NoReg) + || (rNext4 == NoReg)))); + rResult6 = allocateFloatRegNotConflictingWith((1U << rTop14) | (1U << rNext4)); + assert(!((rResult6 == NoReg))); + second2 = rTop14; + first2 = rNext4; + result1 = rResult6; nativePopToReg(ssNativeTop(), second2); ssNativePop(1); nativePopToReg(ssNativeTop(), first2); @@ -32920,83 +33199,83 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 146: /* begin genLowcodeOr64 */ /* begin allocateRegistersForLowcodeInteger4: */ - rTop21 = (rNext9 = (rNextNext2 = (rNextNextNext = NoReg))); - nativeValueIndex2 = 1; + rTop16 = (rNext5 = (rNextNext = (rNextNextNext = NoReg))); + nativeValueIndex = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop21 = nativeRegisterOrNone(ssNativeTop()); + rTop16 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext5 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext9 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNext9 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); + if (rNext5 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNext5 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); } - nativeValueIndex2 += 1; + nativeValueIndex += 1; } } - if (rNextNext2 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNext2 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNextNext = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex2)); + if (rNextNext == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNextNext = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex)); } - nativeValueIndex2 += 1; + nativeValueIndex += 1; } } if (rNextNextNext == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex2))) != NoReg) { - rNextNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex2)); - nativeValueIndex2 += 1; + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex))) != NoReg) { + rNextNextNext = nativeRegisterOrNone(ssNativeValue(nativeValueIndex)); + nativeValueIndex += 1; } } - if (rTop21 == NoReg) { - nextRegisterMask2 = 0; - if (rNext9 != NoReg) { + if (rTop16 == NoReg) { + nextRegisterMask = 0; + if (rNext5 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask2 = 1U << rNext9; + nextRegisterMask = 1U << rNext5; } - if (rNextNext2 != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); + if (rNextNext != NoReg) { + nextRegisterMask = nextRegisterMask | (1U << rNextNext); } if (rNextNextNext != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNextNext); + nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rTop21 = allocateRegNotConflictingWith(nextRegisterMask2); + rTop16 = allocateRegNotConflictingWith(nextRegisterMask); } - if (rNext9 == NoReg) { + if (rNext5 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask2 = 1U << rTop21; - if (rNextNext2 != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNext2); + nextRegisterMask = 1U << rTop16; + if (rNextNext != NoReg) { + nextRegisterMask = nextRegisterMask | (1U << rNextNext); } if (rNextNextNext != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNextNext); + nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rNext9 = allocateRegNotConflictingWith(nextRegisterMask2); + rNext5 = allocateRegNotConflictingWith(nextRegisterMask); } - if (rNextNext2 == NoReg) { + if (rNextNext == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask2 = (1U << rTop21) | (1U << rNext9); + nextRegisterMask = (1U << rTop16) | (1U << rNext5); if (rNextNextNext != NoReg) { - nextRegisterMask2 = nextRegisterMask2 | (1U << rNextNextNext); + nextRegisterMask = nextRegisterMask | (1U << rNextNextNext); } - rNextNext2 = allocateRegNotConflictingWith(nextRegisterMask2); + rNextNext = allocateRegNotConflictingWith(nextRegisterMask); } if (rNextNextNext == NoReg) { /* begin registerMaskFor:and:and: */ - nextRegisterMask2 = ((1U << rTop21) | (1U << rNext9)) | (1U << rNextNext2); - rNextNextNext = allocateRegNotConflictingWith(nextRegisterMask2); + nextRegisterMask = ((1U << rTop16) | (1U << rNext5)) | (1U << rNextNext); + rNextNextNext = allocateRegNotConflictingWith(nextRegisterMask); } - assert(!(((rTop21 == NoReg) - || ((rNext9 == NoReg) - || ((rNextNext2 == NoReg) + assert(!(((rTop16 == NoReg) + || ((rNext5 == NoReg) + || ((rNextNext == NoReg) || (rNextNextNext == NoReg)))))); - secondLow1 = rTop21; - secondHigh1 = rNext9; - firstLow1 = rNextNext2; + secondLow1 = rTop16; + secondHigh1 = rNext5; + firstLow1 = rNextNext; firstHigh1 = rNextNextNext; nativePopToRegsecondReg(ssNativeTop(), secondLow1, secondHigh1); ssNativePop(1); @@ -33013,7 +33292,7 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodePerformCallout */ callSwitchToCStack(); /* begin checkLiteral:forInstruction: */ - anInstruction16 = genoperandoperand(MoveCwR, extA, TempReg); + anInstruction14 = genoperandoperand(MoveCwR, extA, TempReg); /* begin CallRT: */ abstractInstruction = genoperand(Call, ceFFICalloutTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -33029,11 +33308,11 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) ssNativePop(1); callSwitchToCStack(); /* begin CallRT: */ - abstractInstruction4 = genoperand(Call, ceFFICalloutTrampoline); - (abstractInstruction4->annotation = IsRelativeCall); + abstractInstruction2 = genoperand(Call, ceFFICalloutTrampoline); + (abstractInstruction2->annotation = IsRelativeCall); /* begin annotateBytecode: */ - abstractInstruction12 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); - (abstractInstruction12->annotation = HasBytecodePC); + abstractInstruction11 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); + (abstractInstruction11->annotation = HasBytecodePC); return 0; case 149: @@ -33082,19 +33361,19 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin genLowcodePointerAddConstantOffset */ offset4 = extB; /* begin allocateRegistersForLowcodeInteger: */ - rTop22 = NoReg; + rTop17 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop22 = nativeRegisterOrNone(ssNativeTop()); + rTop17 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop22 == NoReg) { - rTop22 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop17 == NoReg) { + rTop17 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop22 == NoReg))); - base = rTop22; + assert(!((rTop17 == NoReg))); + base = rTop17; nativePopToReg(ssNativeTop(), base); ssNativePop(1); /* begin checkQuickConstant:forInstruction: */ - anInstruction17 = genoperandoperand(AddCqR, offset4, base); + anInstruction15 = genoperandoperand(AddCqR, offset4, base); ssPushNativeRegister(base); extB = 0; numExtB = 0; @@ -33102,31 +33381,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 163: /* begin genLowcodePointerAddOffset32 */ - topRegistersMask8 = 0; - rTop23 = (rNext10 = NoReg); + topRegistersMask6 = 0; + rTop18 = (rNext6 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop23 = nativeRegisterOrNone(ssNativeTop()); + rTop18 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext10 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext6 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext10 == NoReg) { + if (rNext6 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg9 = (rNext10 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask8 = 1U << reg9; + reg7 = (rNext6 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask6 = 1U << reg7; } } - if (rTop23 == NoReg) { - rTop23 = allocateRegNotConflictingWith(topRegistersMask8); + if (rTop18 == NoReg) { + rTop18 = allocateRegNotConflictingWith(topRegistersMask6); } - if (rNext10 == NoReg) { - rNext10 = allocateRegNotConflictingWith(1U << rTop23); + if (rNext6 == NoReg) { + rNext6 = allocateRegNotConflictingWith(1U << rTop18); } - assert(!(((rTop23 == NoReg) - || (rNext10 == NoReg)))); - offset5 = rTop23; - base1 = rNext10; + assert(!(((rTop18 == NoReg) + || (rNext6 == NoReg)))); + offset5 = rTop18; + base1 = rNext6; nativePopToReg(ssNativeTop(), offset5); ssNativePop(1); nativePopToReg(ssNativeTop(), base1); @@ -33139,58 +33418,58 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 164: /* begin genLowcodePointerAddOffset64 */ /* begin allocateRegistersForLowcodeInteger3: */ - rTop24 = (rNext12 = (rNextNext3 = NoReg)); - nativeValueIndex3 = 1; + rTop20 = (rNext7 = (rNextNext1 = NoReg)); + nativeValueIndex1 = 1; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop24 = nativeRegisterOrNone(ssNativeTop()); + rTop20 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext12 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext7 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext12 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { - rNext12 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); - if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { - rNextNext3 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex3)); + if (rNext7 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { + rNext7 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); + if ((nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { + rNextNext1 = nativeRegisterSecondOrNone(ssNativeValue(nativeValueIndex1)); } - nativeValueIndex3 += 1; + nativeValueIndex1 += 1; } } - if (rNextNext3 == NoReg) { - if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex3))) != NoReg) { - rNextNext3 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex3)); + if (rNextNext1 == NoReg) { + if ((nativeRegisterOrNone(ssNativeValue(nativeValueIndex1))) != NoReg) { + rNextNext1 = nativeRegisterOrNone(ssNativeValue(nativeValueIndex1)); } } - if (rTop24 == NoReg) { - nextRegisterMask3 = 0; - if (rNext12 != NoReg) { + if (rTop20 == NoReg) { + nextRegisterMask1 = 0; + if (rNext7 != NoReg) { /* begin registerMaskFor: */ - nextRegisterMask3 = 1U << rNext12; + nextRegisterMask1 = 1U << rNext7; } - if (rNextNext3 != NoReg) { - nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); + if (rNextNext1 != NoReg) { + nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); } - rTop24 = allocateRegNotConflictingWith(nextRegisterMask3); + rTop20 = allocateRegNotConflictingWith(nextRegisterMask1); } - if (rNext12 == NoReg) { + if (rNext7 == NoReg) { /* begin registerMaskFor: */ - nextRegisterMask3 = 1U << rTop24; - if (rNextNext3 != NoReg) { - nextRegisterMask3 = nextRegisterMask3 | (1U << rNextNext3); + nextRegisterMask1 = 1U << rTop20; + if (rNextNext1 != NoReg) { + nextRegisterMask1 = nextRegisterMask1 | (1U << rNextNext1); } - rNext12 = allocateRegNotConflictingWith(nextRegisterMask3); + rNext7 = allocateRegNotConflictingWith(nextRegisterMask1); } - if (rNextNext3 == NoReg) { + if (rNextNext1 == NoReg) { /* begin registerMaskFor:and: */ - nextRegisterMask3 = (1U << rTop24) | (1U << rNext12); - rNextNext3 = allocateRegNotConflictingWith(nextRegisterMask3); + nextRegisterMask1 = (1U << rTop20) | (1U << rNext7); + rNextNext1 = allocateRegNotConflictingWith(nextRegisterMask1); } - assert(!(((rTop24 == NoReg) - || ((rNext12 == NoReg) - || (rNextNext3 == NoReg))))); - offsetLow = rTop24; - offsetHigh = rNext12; - base2 = rNextNext3; + assert(!(((rTop20 == NoReg) + || ((rNext7 == NoReg) + || (rNextNext1 == NoReg))))); + offsetLow = rTop20; + offsetHigh = rNext7; + base2 = rNextNext1; nativePopToRegsecondReg(ssNativeTop(), offsetLow, offsetHigh); ssNativePop(1); nativePopToReg(ssNativeTop(), base2); @@ -33202,31 +33481,31 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 165: /* begin genLowcodePointerEqual */ - topRegistersMask10 = 0; - rTop25 = (rNext14 = NoReg); + topRegistersMask8 = 0; + rTop21 = (rNext8 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop25 = nativeRegisterOrNone(ssNativeTop()); + rTop21 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext14 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext8 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext14 == NoReg) { + if (rNext8 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg15 = (rNext14 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask10 = 1U << reg15; + reg9 = (rNext8 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask8 = 1U << reg9; } } - if (rTop25 == NoReg) { - rTop25 = allocateRegNotConflictingWith(topRegistersMask10); + if (rTop21 == NoReg) { + rTop21 = allocateRegNotConflictingWith(topRegistersMask8); } - if (rNext14 == NoReg) { - rNext14 = allocateRegNotConflictingWith(1U << rTop25); + if (rNext8 == NoReg) { + rNext8 = allocateRegNotConflictingWith(1U << rTop21); } - assert(!(((rTop25 == NoReg) - || (rNext14 == NoReg)))); - second4 = rTop25; - first4 = rNext14; + assert(!(((rTop21 == NoReg) + || (rNext8 == NoReg)))); + second4 = rTop21; + first4 = rNext8; nativePopToReg(ssNativeTop(), second4); ssNativePop(1); nativePopToReg(ssNativeTop(), first4); @@ -33236,43 +33515,43 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin JumpNonZero: */ falseJump = genConditionalBranchoperand(JumpNonZero, ((sqInt)0)); /* begin checkQuickConstant:forInstruction: */ - anInstruction19 = genoperandoperand(MoveCqR, 1, first4); + anInstruction17 = genoperandoperand(MoveCqR, 1, first4); /* begin Jump: */ contJump = genoperand(Jump, ((sqInt)0)); jmpTarget(falseJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); /* begin checkQuickConstant:forInstruction: */ - anInstruction18 = genoperandoperand(MoveCqR, 0, first4); + anInstruction16 = genoperandoperand(MoveCqR, 0, first4); jmpTarget(contJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); ssPushNativeRegister(first4); return 0; case 166: /* begin genLowcodePointerNotEqual */ - topRegistersMask11 = 0; - rTop26 = (rNext15 = NoReg); + topRegistersMask9 = 0; + rTop22 = (rNext9 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop26 = nativeRegisterOrNone(ssNativeTop()); + rTop22 = nativeRegisterOrNone(ssNativeTop()); if ((nativeRegisterSecondOrNone(ssNativeTop())) != NoReg) { - rNext15 = nativeRegisterSecondOrNone(ssNativeTop()); + rNext9 = nativeRegisterSecondOrNone(ssNativeTop()); } } - if (rNext15 == NoReg) { + if (rNext9 == NoReg) { if ((nativeRegisterOrNone(ssNativeValue(1))) != NoReg) { /* begin registerMaskFor: */ - reg16 = (rNext15 = nativeRegisterOrNone(ssNativeValue(1))); - topRegistersMask11 = 1U << reg16; + reg10 = (rNext9 = nativeRegisterOrNone(ssNativeValue(1))); + topRegistersMask9 = 1U << reg10; } } - if (rTop26 == NoReg) { - rTop26 = allocateRegNotConflictingWith(topRegistersMask11); + if (rTop22 == NoReg) { + rTop22 = allocateRegNotConflictingWith(topRegistersMask9); } - if (rNext15 == NoReg) { - rNext15 = allocateRegNotConflictingWith(1U << rTop26); + if (rNext9 == NoReg) { + rNext9 = allocateRegNotConflictingWith(1U << rTop22); } - assert(!(((rTop26 == NoReg) - || (rNext15 == NoReg)))); - second5 = rTop26; - first5 = rNext15; + assert(!(((rTop22 == NoReg) + || (rNext9 == NoReg)))); + second5 = rTop22; + first5 = rNext9; nativePopToReg(ssNativeTop(), second5); ssNativePop(1); nativePopToReg(ssNativeTop(), first5); @@ -33282,69 +33561,69 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) /* begin JumpZero: */ falseJump1 = genConditionalBranchoperand(JumpZero, ((sqInt)0)); /* begin checkQuickConstant:forInstruction: */ - anInstruction20 = genoperandoperand(MoveCqR, 1, first5); + anInstruction19 = genoperandoperand(MoveCqR, 1, first5); /* begin Jump: */ contJump1 = genoperand(Jump, ((sqInt)0)); jmpTarget(falseJump1, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); /* begin checkQuickConstant:forInstruction: */ - anInstruction110 = genoperandoperand(MoveCqR, 0, first5); + anInstruction18 = genoperandoperand(MoveCqR, 0, first5); jmpTarget(contJump1, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); ssPushNativeRegister(first5); return 0; case 167: /* begin genLowcodePointerToInt32 */ - rTop27 = NoReg; + rTop23 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop27 = nativeRegisterOrNone(ssNativeTop()); + rTop23 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop27 == NoReg) { - rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop23 == NoReg) { + rTop23 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop27 == NoReg))); - pointer7 = rTop27; - nativePopToReg(ssNativeTop(), pointer7); + assert(!((rTop23 == NoReg))); + pointer5 = rTop23; + nativePopToReg(ssNativeTop(), pointer5); ssNativePop(1); - ssPushNativeRegister(pointer7); + ssPushNativeRegister(pointer5); return 0; case 168: /* begin genLowcodePointerToInt64 */ /* begin allocateRegistersForLowcodeIntegerResultInteger2: */ - rTop28 = NoReg; - rResult9 = (rResult9 = NoReg); + rTop24 = NoReg; + rResult7 = (rResult7 = NoReg); if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop28 = nativeRegisterOrNone(ssNativeTop()); + rTop24 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop28 == NoReg) { - rTop28 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop24 == NoReg) { + rTop24 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - rResult9 = allocateRegNotConflictingWith(1U << rTop28); - rResult22 = allocateRegNotConflictingWith((1U << rTop28) | (1U << rResult9)); - assert(!(((rTop28 == NoReg) - || ((rResult9 == NoReg) + rResult7 = allocateRegNotConflictingWith(1U << rTop24); + rResult22 = allocateRegNotConflictingWith((1U << rTop24) | (1U << rResult7)); + assert(!(((rTop24 == NoReg) + || ((rResult7 == NoReg) || (rResult22 == NoReg))))); - pointer8 = rTop28; - resultLow1 = rResult9; + pointer6 = rTop24; + resultLow1 = rResult7; resultHigh1 = rResult22; - nativePopToReg(ssNativeTop(), pointer8); + nativePopToReg(ssNativeTop(), pointer6); ssNativePop(1); /* begin MoveR:R: */ - genoperandoperand(MoveRR, pointer8, resultLow1); + genoperandoperand(MoveRR, pointer6, resultLow1); /* begin checkQuickConstant:forInstruction: */ - anInstruction23 = genoperandoperand(MoveCqR, 0, resultHigh1); + anInstruction20 = genoperandoperand(MoveCqR, 0, resultHigh1); ssPushNativeRegistersecondRegister(resultLow1, resultHigh1); return 0; case 169: /* begin genLowcodePopFloat32 */ - topRegistersMask12 = 0; + topRegistersMask10 = 0; frTop = NoReg; if ((nativeFloatRegisterOrNone(ssNativeTop())) != NoReg) { frTop = nativeFloatRegisterOrNone(ssNativeTop()); } if (frTop == NoReg) { - frTop = allocateFloatRegNotConflictingWith(topRegistersMask12); + frTop = allocateFloatRegNotConflictingWith(topRegistersMask10); } assert(!((frTop == NoReg))); value8 = frTop; @@ -33354,13 +33633,13 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 170: /* begin genLowcodePopFloat64 */ - topRegistersMask13 = 0; + topRegistersMask11 = 0; frTop1 = NoReg; if ((nativeFloatRegisterOrNone(ssNativeTop())) != NoReg) { frTop1 = nativeFloatRegisterOrNone(ssNativeTop()); } if (frTop1 == NoReg) { - frTop1 = allocateFloatRegNotConflictingWith(topRegistersMask13); + frTop1 = allocateFloatRegNotConflictingWith(topRegistersMask11); } assert(!((frTop1 == NoReg))); value9 = frTop1; @@ -33370,30 +33649,30 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 171: /* begin genLowcodePopInt32 */ - rTop29 = NoReg; + rTop25 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop29 = nativeRegisterOrNone(ssNativeTop()); + rTop25 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop29 == NoReg) { - rTop29 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop25 == NoReg) { + rTop25 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop29 == NoReg))); - value10 = rTop29; + assert(!((rTop25 == NoReg))); + value10 = rTop25; nativePopToReg(ssNativeTop(), value10); ssNativePop(1); return 0; case 172: /* begin genLowcodePopInt64 */ - rTop30 = NoReg; + rTop26 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop30 = nativeRegisterOrNone(ssNativeTop()); + rTop26 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop30 == NoReg) { - rTop30 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop26 == NoReg) { + rTop26 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop30 == NoReg))); - value11 = rTop30; + assert(!((rTop26 == NoReg))); + value11 = rTop26; nativePopToReg(ssNativeTop(), value11); ssNativePop(1); return 0; @@ -33406,16 +33685,16 @@ genLowcodeUnaryInlinePrimitive3(sqInt prim) case 174: /* begin genLowcodePopPointer */ - rTop31 = NoReg; + rTop27 = NoReg; if ((nativeRegisterOrNone(ssNativeTop())) != NoReg) { - rTop31 = nativeRegisterOrNone(ssNativeTop()); + rTop27 = nativeRegisterOrNone(ssNativeTop()); } - if (rTop31 == NoReg) { - rTop31 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); + if (rTop27 == NoReg) { + rTop27 = allocateRegNotConflictingWith(0 /* emptyRegisterMask */); } - assert(!((rTop31 == NoReg))); - pointerValue9 = rTop31; - nativePopToReg(ssNativeTop(), pointerValue9); + assert(!((rTop27 == NoReg))); + pointerValue7 = rTop27; + nativePopToReg(ssNativeTop(), pointerValue7); ssNativePop(1); return 0; @@ -38277,7 +38556,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -38766,6 +39045,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -38773,7 +39053,15 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -38800,11 +39088,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -38891,7 +39178,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -38903,9 +39190,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -39004,6 +39291,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -39023,7 +39311,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -39066,7 +39354,15 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -39241,6 +39537,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -39258,14 +39555,22 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -39438,6 +39743,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -39461,7 +39767,15 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -39487,6 +39801,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -39515,8 +39830,87 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI /* begin annotateBytecode: */ abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); - /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + /* begin putSelfInReceiverResultReg */ + storeToReg(simSelf(), ReceiverResultReg); + /* begin Jump: */ + immutabilityFailure = genoperand(Jump, ((sqInt)0)); + jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + } +# endif /* IMMUTABILITY */ + ssPop(1); + ssAllocateCallRegand(ClassReg, SendNumArgsReg); + ssPush(1); + genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); + ssStoreAndReplacePoptoReg(popBoolean, ClassReg); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } + /* begin checkQuickConstant:forInstruction: */ + anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); + /* begin CallRT: */ + abstractInstruction = genoperand(Call, ceStoreContextInstVarTrampoline); + (abstractInstruction->annotation = IsRelativeCall); + +# if IMMUTABILITY + if (needsImmCheck) { + jmpTarget(immutabilityFailure, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + } +# endif /* IMMUTABILITY */ + return 0; +} + + +/* The reason we need a frame here is that assigning to an inst var of a + context may + involve wholesale reorganization of stack pages, and the only way to + preserve the + execution state of an activation in that case is if it has a frame. */ + + /* StackToRegisterMappingCogit>>#genStorePop:MaybeContextRemoteInstVar:ofObjectAt:needsStoreCheck:needsImmutabilityCheck: */ +static sqInt NoDbgRegParms +genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) +{ + AbstractInstruction *abstractInstruction; + AbstractInstruction *abstractInstruction1; + AbstractInstruction *abstractInstruction2; + AbstractInstruction *abstractInstruction3; + AbstractInstruction *anInstruction; + AbstractInstruction *anInstruction1; + sqInt i; + AbstractInstruction *immutabilityFailure; + AbstractInstruction *mutableJump; + + assert(needsFrame); + genLoadTempin(objectIndex, ReceiverResultReg); + /* begin genGenericStorePop:MaybeContextSlotIndex:needsStoreCheck:needsRestoreRcvr:needsImmutabilityCheck: */ + assert(needsFrame); + +# if IMMUTABILITY + if (needsImmCheck) { + mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); + /* begin genStoreTrampolineCall: */ + if (slotIndex >= (NumStoreTrampolines - 1)) { + /* begin checkQuickConstant:forInstruction: */ + anInstruction = genoperandoperand(MoveCqR, slotIndex, TempReg); + /* begin CallRT: */ + abstractInstruction3 = genoperand(Call, ceStoreTrampolines[NumStoreTrampolines - 1]); + (abstractInstruction3->annotation = IsRelativeCall); + } + else { + /* begin CallRT: */ + abstractInstruction1 = genoperand(Call, ceStoreTrampolines[slotIndex]); + (abstractInstruction1->annotation = IsRelativeCall); + } + /* begin annotateBytecode: */ + abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); + (abstractInstruction2->annotation = HasBytecodePC); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -39528,77 +39922,15 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); - /* begin checkQuickConstant:forInstruction: */ - anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); - /* begin CallRT: */ - abstractInstruction = genoperand(Call, ceStoreContextInstVarTrampoline); - (abstractInstruction->annotation = IsRelativeCall); - -# if IMMUTABILITY - if (needsImmCheck) { - jmpTarget(immutabilityFailure, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); - } -# endif /* IMMUTABILITY */ - return 0; -} - - -/* The reason we need a frame here is that assigning to an inst var of a - context may - involve wholesale reorganization of stack pages, and the only way to - preserve the - execution state of an activation in that case is if it has a frame. */ - - /* StackToRegisterMappingCogit>>#genStorePop:MaybeContextRemoteInstVar:ofObjectAt:needsStoreCheck:needsImmutabilityCheck: */ -static sqInt NoDbgRegParms -genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) -{ - AbstractInstruction *abstractInstruction; - AbstractInstruction *abstractInstruction1; - AbstractInstruction *abstractInstruction2; - AbstractInstruction *abstractInstruction3; - AbstractInstruction *anInstruction; - AbstractInstruction *anInstruction1; - AbstractInstruction *immutabilityFailure; - AbstractInstruction *mutableJump; - - assert(needsFrame); - genLoadTempin(objectIndex, ReceiverResultReg); - /* begin genGenericStorePop:MaybeContextSlotIndex:needsStoreCheck:needsRestoreRcvr:needsImmutabilityCheck: */ - assert(needsFrame); - -# if IMMUTABILITY - if (needsImmCheck) { - mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); - /* begin genStoreTrampolineCall: */ - if (slotIndex >= (NumStoreTrampolines - 1)) { - /* begin checkQuickConstant:forInstruction: */ - anInstruction = genoperandoperand(MoveCqR, slotIndex, TempReg); - /* begin CallRT: */ - abstractInstruction3 = genoperand(Call, ceStoreTrampolines[NumStoreTrampolines - 1]); - (abstractInstruction3->annotation = IsRelativeCall); - } - else { - /* begin CallRT: */ - abstractInstruction1 = genoperand(Call, ceStoreTrampolines[slotIndex]); - (abstractInstruction1->annotation = IsRelativeCall); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); } - /* begin annotateBytecode: */ - abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); - (abstractInstruction2->annotation = HasBytecodePC); - /* begin Jump: */ - immutabilityFailure = genoperand(Jump, ((sqInt)0)); - jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); + simSpillBase = simStackPtr + 1; } -# endif /* IMMUTABILITY */ - ssPop(1); - ssAllocateCallRegand(ClassReg, SendNumArgsReg); - ssPush(1); - genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); - ssStoreAndReplacePoptoReg(popBoolean, ClassReg); - /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -39617,6 +39949,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -39634,7 +39967,15 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -39647,6 +39988,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -39658,7 +40000,15 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -39715,7 +40065,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -39740,6 +40090,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -39748,7 +40099,15 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -39788,64 +40147,40 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - (fixup->simNativeStackPtr) = UnknownSimStackPtrFlag; - (fixup->simNativeStackSize) = 0; -} - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -39855,32 +40190,36 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; } @@ -39889,25 +40228,25 @@ initSimStackForFramelessBlock(sqInt startpc) static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -39915,16 +40254,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; simNativeSpillBase = (simNativeStackPtr = -1); simNativeStackSize = 0; } @@ -40034,10 +40374,21 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -40048,7 +40399,15 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -40057,7 +40416,15 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -40128,7 +40495,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -40136,7 +40502,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; + sqInt i1; + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -40149,14 +40526,11 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); simNativeStackPtr = (fixup->simNativeStackPtr); simNativeStackSize = (fixup->simNativeStackSize); } @@ -40164,10 +40538,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); (fixup->simNativeStackPtr = simNativeStackPtr); (fixup->simNativeStackSize = simNativeStackSize); @@ -40177,18 +40559,17 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) assert(simNativeStackPtr == ((fixup->simNativeStackPtr))); assert(simNativeStackSize == ((fixup->simNativeStackSize))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } - for (i = 0; i <= simNativeStackPtr; i += 1) { - ensureIsMarkedAsSpilled(simNativeStackAt(i)); + simSpillBase = simStackPtr + 1; + for (i1 = 0; i1 <= simNativeStackPtr; i1 += 1) { + ensureIsMarkedAsSpilled(simNativeStackAt(i1)); } simNativeSpillBase = simNativeStackPtr + 1; return 0; @@ -40201,6 +40582,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -40276,6 +40673,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -40286,6 +40694,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -40306,7 +40715,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -40426,6 +40840,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -40502,7 +40917,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -40580,7 +41000,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredFloatRegMask:upThrough:upThroughNative: */ @@ -40588,6 +41008,7 @@ static void NoDbgRegParms ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -40605,6 +41026,7 @@ ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, s lastRequired = i; } } + assert(lastRequiredNative == simNativeStackPtr); for (i = (((simNativeSpillBase < 0) ? 0 : simNativeSpillBase)); i <= nativeStackPtr; i += 1) { liveRegs = liveRegs | (nativeRegisterMask(simNativeStackAt(i))); if ((0 /* floatRegisterMask */ & requiredRegsMask) != 0) { @@ -40614,7 +41036,16 @@ ssAllocateRequiredFloatRegMaskupThroughupThroughNative(sqInt requiredRegsMask, s if (!((liveRegs & requiredRegsMask) == 0)) { /* Some live, must spill */ - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(((liveFloatRegisters()) & requiredRegsMask) == 0); } } @@ -40638,6 +41069,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -40652,10 +41084,11 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } + assert(nativeStackPtr == simNativeStackPtr); for (i = (((simNativeSpillBase < 0) ? 0 : simNativeSpillBase)); i <= nativeStackPtr; i += 1) { liveRegs = liveRegs | (nativeRegisterMask(simNativeStackAt(i))); if ((nativeRegisterMask(simNativeStackAt(i))) & requiredRegsMask) { @@ -40663,7 +41096,16 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -40689,31 +41131,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - ssNativeFlushTo(nativeIndex); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -40723,16 +41140,26 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; ssNativeFlushTo(simNativeStackPtr); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -40748,16 +41175,29 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; ssNativeFlushTo(simNativeStackPtr); + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -40872,11 +41312,33 @@ ssPopNativeSize(sqInt popSize) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -40884,18 +41346,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -40914,18 +41366,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -40934,17 +41403,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -40952,6 +41438,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -40959,8 +41447,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -41169,17 +41673,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -41190,6 +41711,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -41257,13 +41785,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -41281,6 +41802,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -41355,6 +41907,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -41364,18 +41923,27 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + ssNativeFlushTo(simNativeStackPtr); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spurlowcodesrc/vm/cointerp.c b/spurlowcodesrc/vm/cointerp.c index f723354d52..5beeb1ca1b 100644 --- a/spurlowcodesrc/vm/cointerp.c +++ b/spurlowcodesrc/vm/cointerp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -525,7 +525,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -918,7 +917,7 @@ static sqInt NoDbgRegParms changeClassOfto(sqInt rcvr, sqInt argClass); static double NoDbgRegParms dbgFloatValueOf(sqInt oop); static sqInt defaultEdenBytes(void); extern sqInt fetchClassTagOf(sqInt oop); -extern usqInt floatObjectOf(double aFloat); +extern sqInt floatObjectOf(double aFloat); extern double floatValueOf(sqInt oop); static sqInt hasSixtyFourBitImmediates(void); extern sqInt headerIndicatesAlternateBytecodeSet(sqInt methodHeader); @@ -1500,7 +1499,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2554,7 +2553,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -36203,24 +36202,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -43038,7 +43019,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -58179,7 +58168,7 @@ fetchClassTagOf(sqInt oop) } /* Spur32BitMemoryManager>>#floatObjectOf: */ -usqInt +sqInt floatObjectOf(double aFloat) { DECL_MAYBE_SQ_GLOBAL_STRUCT usqInt newFloatObj; @@ -84717,7 +84706,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -90767,7 +90756,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -90784,7 +90781,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -90792,11 +90789,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -90830,7 +90827,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -94361,7 +94366,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -94714,7 +94719,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -94744,18 +94748,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -94806,10 +94813,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -94817,22 +94824,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -94844,18 +94851,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -95118,7 +95125,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurlowcodesrc/vm/cointerp.h b/spurlowcodesrc/vm/cointerp.h index 75e32f559a..a201f93994 100644 --- a/spurlowcodesrc/vm/cointerp.h +++ b/spurlowcodesrc/vm/cointerp.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ @@ -148,7 +148,7 @@ extern usqInt scavengeThresholdAddress(void); extern sqInt withoutForwardingOnandwithsendToCogit(sqInt obj1, sqInt obj2, sqInt aBool, sqInt (*selector)(sqInt,sqInt,sqInt)); extern sqInt byteSwapped(sqInt w); extern sqInt fetchClassTagOf(sqInt oop); -extern usqInt floatObjectOf(double aFloat); +extern sqInt floatObjectOf(double aFloat); extern sqInt headerIndicatesAlternateBytecodeSet(sqInt methodHeader); extern sqInt instantiateClassindexableSize(sqInt classObj, usqInt nElements); extern sqInt isIntegerValue(sqInt intValue); @@ -326,6 +326,7 @@ extern sqInt literalofMethod(sqInt offset, sqInt methodPointer); extern void longPrintOop(sqInt oop); extern sqInt longStoreBytecodeForHeader(sqInt methodHeader); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodClassAssociationOf(sqInt methodPointer); extern sqInt methodClassOf(sqInt methodPointer); extern sqInt methodPrimitiveIndex(void); diff --git a/spurlowcodesrc/vm/gcc3x-cointerp.c b/spurlowcodesrc/vm/gcc3x-cointerp.c index d4661f85cf..cf401c9c0a 100644 --- a/spurlowcodesrc/vm/gcc3x-cointerp.c +++ b/spurlowcodesrc/vm/gcc3x-cointerp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -528,7 +528,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -921,7 +920,7 @@ static sqInt NoDbgRegParms changeClassOfto(sqInt rcvr, sqInt argClass); static double NoDbgRegParms dbgFloatValueOf(sqInt oop); static sqInt defaultEdenBytes(void); extern sqInt fetchClassTagOf(sqInt oop); -extern usqInt floatObjectOf(double aFloat); +extern sqInt floatObjectOf(double aFloat); extern double floatValueOf(sqInt oop); static sqInt hasSixtyFourBitImmediates(void); extern sqInt headerIndicatesAlternateBytecodeSet(sqInt methodHeader); @@ -1503,7 +1502,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2557,7 +2556,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -36212,24 +36211,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -43047,7 +43028,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -58188,7 +58177,7 @@ fetchClassTagOf(sqInt oop) } /* Spur32BitMemoryManager>>#floatObjectOf: */ -usqInt +sqInt floatObjectOf(double aFloat) { DECL_MAYBE_SQ_GLOBAL_STRUCT usqInt newFloatObj; @@ -84726,7 +84715,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -90776,7 +90765,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -90793,7 +90790,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -90801,11 +90798,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -90839,7 +90836,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -94370,7 +94375,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -94723,7 +94728,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -94753,18 +94757,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -94815,10 +94822,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -94826,22 +94833,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -94853,18 +94860,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -95127,7 +95134,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurlowcodestack64src/vm/gcc3x-interp.c b/spurlowcodestack64src/vm/gcc3x-interp.c index e29da86795..8cc654d28e 100644 --- a/spurlowcodestack64src/vm/gcc3x-interp.c +++ b/spurlowcodestack64src/vm/gcc3x-interp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1257,7 +1257,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2329,7 +2329,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2347]"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -66209,6 +66209,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -69259,7 +69261,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -76347,6 +76349,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -76401,6 +76405,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -80797,7 +80803,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -81101,7 +81107,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -81132,18 +81137,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -81194,10 +81202,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -81205,22 +81213,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -81232,18 +81240,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -81744,6 +81752,8 @@ primitiveTerminateTo(void) assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -81850,7 +81860,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurlowcodestack64src/vm/interp.c b/spurlowcodestack64src/vm/interp.c index b3376af6fd..84b94dbed4 100644 --- a/spurlowcodestack64src/vm/interp.c +++ b/spurlowcodestack64src/vm/interp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1254,7 +1254,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2326,7 +2326,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2347]"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -66200,6 +66200,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -69250,7 +69252,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -76338,6 +76340,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -76392,6 +76396,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -80788,7 +80794,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -81092,7 +81098,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -81123,18 +81128,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -81185,10 +81193,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -81196,22 +81204,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -81223,18 +81231,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -81735,6 +81743,8 @@ primitiveTerminateTo(void) assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -81841,7 +81851,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurlowcodestacksrc/vm/gcc3x-interp.c b/spurlowcodestacksrc/vm/gcc3x-interp.c index 358348071e..7bb56e975a 100644 --- a/spurlowcodestacksrc/vm/gcc3x-interp.c +++ b/spurlowcodestacksrc/vm/gcc3x-interp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1236,7 +1236,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2309,7 +2309,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2347]"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -64555,6 +64555,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -67611,7 +67613,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -74915,6 +74917,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -74969,6 +74973,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -79476,7 +79482,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -79829,7 +79835,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -79859,18 +79864,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -79921,10 +79929,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -79932,22 +79940,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -79959,18 +79967,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -80452,6 +80460,8 @@ primitiveTerminateTo(void) assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -80558,7 +80568,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurlowcodestacksrc/vm/interp.c b/spurlowcodestacksrc/vm/interp.c index d3857ac77f..3bb87a5db1 100644 --- a/spurlowcodestacksrc/vm/interp.c +++ b/spurlowcodestacksrc/vm/interp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1233,7 +1233,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2306,7 +2306,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2347]"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -64546,6 +64546,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -67602,7 +67604,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -74906,6 +74908,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -74960,6 +74964,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -79467,7 +79473,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -79820,7 +79826,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -79850,18 +79855,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -79912,10 +79920,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -79923,22 +79931,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -79950,18 +79958,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -80443,6 +80451,8 @@ primitiveTerminateTo(void) assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -80549,7 +80559,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spursista64src/vm/cogit.h b/spursista64src/vm/cogit.h index 937859de2a..dfd7104c0a 100644 --- a/spursista64src/vm/cogit.h +++ b/spursista64src/vm/cogit.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ diff --git a/spursista64src/vm/cogitX64SysV.c b/spursista64src/vm/cogitX64SysV.c index 4ceaa41821..8a37227b54 100644 --- a/spursista64src/vm/cogitX64SysV.c +++ b/spursista64src/vm/cogitX64SysV.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SistaCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + SistaCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "SistaCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "SistaCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -344,7 +344,6 @@ char *__cogitBuildInfo = __buildInfo; #define UnfailingPrimitive 3 #define UnimplementedOperation 2 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 3 #define XCHGRR 157 @@ -434,7 +433,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -580,7 +580,7 @@ static sqInt extBBytecode(void); static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -649,7 +649,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -955,7 +955,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static sqInt NoDbgRegParms availableRegisterOrNoneFor(AbstractInstruction * self_in_availableRegisterOrNoneFor, sqInt liveRegsMask); static sqInt NoDbgRegParms callFullTargetFromReturnAddress(AbstractInstruction * self_in_callFullTargetFromReturnAddress, sqInt callSiteReturnAddress); @@ -1255,7 +1254,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1265,11 +1263,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1283,7 +1283,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1293,14 +1292,16 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1982,7 +1983,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -2006,7 +2006,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2091,6 +2090,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -2848,7 +2848,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -4249,12 +4249,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -5699,7 +5705,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -7374,7 +7380,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -17264,7 +17270,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -17314,7 +17320,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -17884,8 +17890,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -18076,13 +18083,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -23591,11 +23591,7 @@ sizeImmediateGroup1at(AbstractInstruction * self_in_sizeImmediateGroup1at, sqInt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -26986,6 +26982,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -28461,6 +28460,7 @@ genCounterTripOnlyJumpIfto(sqInt boolean, sqInt targetBytecodePC) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; AbstractInstruction *anInstruction3; + sqInt i; void *jumpTarget; AbstractInstruction *mustBeBooleanTrampoline; AbstractInstruction *ok; @@ -28468,7 +28468,14 @@ genCounterTripOnlyJumpIfto(sqInt boolean, sqInt targetBytecodePC) extA = 0; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } popToReg(ssTop(), TempReg); ssPop(1); @@ -28532,6 +28539,7 @@ genExtJumpIfNotInstanceOfBehaviorsBytecode(void) sqInt classIndex; sqInt classIndex1; sqInt distance; + sqInt i; int inverse; AbstractInstruction *jmp; AbstractInstruction * jmpImmediate; @@ -28550,7 +28558,14 @@ genExtJumpIfNotInstanceOfBehaviorsBytecode(void) popToReg(ssTop(), reg); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } literal = getLiteral((extA * 256) + byte1); if ((inverse = extB < 0)) { extB += 128; @@ -28728,6 +28743,8 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) AbstractInstruction *countTripped1; BytecodeFixup *fixup; BytecodeFixup * fixup1; + sqInt i; + sqInt i1; AbstractInstruction *jumpEqual; AbstractInstruction *jumpNotEqual; void *jumpTarget; @@ -28866,7 +28883,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg1, !unforwardRcvr1, argReg1, rcvrReg1, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -29047,7 +29071,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= (simStackPtr - 2); i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } if (unforwardArg) { genEnsureOopInRegNotForwardedscratchReg(argReg, TempReg); } @@ -29250,6 +29281,11 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) BytecodeFixup *fixup1; BytecodeFixup *fixup2; BytecodeFixup *fixup3; + sqInt i; + sqInt i1; + sqInt i2; + sqInt i3; + sqInt i4; void *jumpTarget; void *jumpTarget1; void *jumpTarget2; @@ -29277,7 +29313,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (isOptimizedMethod(methodObj)) { eventualTarget1 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc1 = ssTop(); ssPop(1); if ((((desc1->type)) == SSConstant) @@ -29352,7 +29395,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (((nextDescriptor->generator)) == genPushConstantTrueBytecode) { eventualTarget2 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 < simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc2 = ssTop(); ssPop(1); if ((((desc2->type)) == SSConstant) @@ -29421,7 +29471,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (((nextDescriptor->generator)) == genPushConstantFalseBytecode) { eventualTarget3 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc3 = ssTop(); ssPop(1); if ((((desc3->type)) == SSConstant) @@ -29496,7 +29553,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) || (((desc->constant)) == (falseObject())))) { eventualTarget4 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 < simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc4 = ssTop(); ssPop(1); if ((((desc4->type)) == SSConstant) @@ -29562,7 +29626,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) } eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 < simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } popToReg(desc, TempReg); ssPop(1); ssAllocateRequiredReg(SendNumArgsReg); @@ -29995,6 +30066,7 @@ genSpecialSelectorComparison(void) sqInt counterReg; AbstractInstruction *countTripped; AbstractInstruction *countTripped1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -30018,7 +30090,14 @@ genSpecialSelectorComparison(void) return genSpecialSelectorComparisonWithoutCounters(); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((((argInt = ((ssTop())->constant)))) & 7) == 1)); @@ -30027,7 +30106,7 @@ genSpecialSelectorComparison(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((((ssValue(1))->constant))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -30177,6 +30256,7 @@ genSpecialSelectorComparisonWithoutCounters(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -30194,14 +30274,21 @@ genSpecialSelectorComparisonWithoutCounters(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((((argInt = ((ssTop())->constant)))) & 7) == 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((((ssValue(1))->constant))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -30425,9 +30512,17 @@ genUnconditionalTrapBytecode(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceTrapTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -31413,10 +31508,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -32026,7 +32118,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -32052,7 +32145,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -32093,18 +32186,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -32176,7 +32268,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -32331,12 +32423,20 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -32471,7 +32571,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -32904,11 +33004,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -32940,10 +33048,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -32953,13 +33063,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -33033,7 +33157,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -33521,6 +33645,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -33528,7 +33653,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -33555,11 +33687,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -33646,7 +33777,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -33658,9 +33789,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -33759,6 +33890,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -33778,7 +33910,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((((rcvrInt = ((ssValue(1))->constant)))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -33821,7 +33953,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -34041,6 +34180,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -34064,7 +34204,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -34090,6 +34237,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -34119,7 +34267,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -34131,7 +34279,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -34163,6 +34318,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -34201,7 +34357,14 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -34220,6 +34383,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -34237,7 +34401,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -34250,6 +34421,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -34261,7 +34433,14 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -34318,7 +34497,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -34343,6 +34522,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -34351,7 +34531,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -34386,60 +34573,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -34449,57 +34614,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -34507,16 +34676,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -34581,10 +34751,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -34595,7 +34775,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -34604,7 +34791,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -34675,7 +34869,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -34683,7 +34876,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; + sqInt i1; + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -34696,38 +34900,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -34738,6 +34945,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -34813,6 +35036,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -34823,6 +35057,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -34842,7 +35077,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -34961,6 +35201,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -35038,7 +35279,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -35118,7 +35364,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1ULL << requiredReg1) | ((1ULL << requiredReg2) | (1ULL << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1ULL << requiredReg1) | (1ULL << requiredReg2)) | (1ULL << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -35133,6 +35379,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -35147,12 +35394,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -35178,30 +35433,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1ULL << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -35211,15 +35442,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -35235,15 +35475,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -35254,11 +35506,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -35266,18 +35540,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -35296,18 +35560,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -35316,17 +35597,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -35334,6 +35632,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -35341,8 +35641,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -35352,17 +35668,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -35373,6 +35706,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -35440,13 +35780,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -35464,6 +35797,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -35538,6 +35902,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -35547,18 +35918,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spursista64src/vm/cogitX64WIN64.c b/spursista64src/vm/cogitX64WIN64.c index 44f73d5b79..468290b546 100644 --- a/spursista64src/vm/cogitX64WIN64.c +++ b/spursista64src/vm/cogitX64WIN64.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SistaCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + SistaCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "SistaCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "SistaCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -344,7 +344,6 @@ char *__cogitBuildInfo = __buildInfo; #define UnfailingPrimitive 3 #define UnimplementedOperation 2 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 3 #define XCHGRR 157 @@ -434,7 +433,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -955,7 +955,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static sqInt NoDbgRegParms availableRegisterOrNoneFor(AbstractInstruction * self_in_availableRegisterOrNoneFor, sqInt liveRegsMask); static sqInt NoDbgRegParms callFullTargetFromReturnAddress(AbstractInstruction * self_in_callFullTargetFromReturnAddress, sqInt callSiteReturnAddress); @@ -1255,7 +1254,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1265,11 +1263,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1283,7 +1283,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1293,14 +1292,16 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1982,7 +1983,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -2006,7 +2006,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2091,6 +2090,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -4249,12 +4249,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -17272,7 +17278,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -17322,7 +17328,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -17892,8 +17898,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -18084,13 +18091,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -23599,11 +23599,7 @@ sizeImmediateGroup1at(AbstractInstruction * self_in_sizeImmediateGroup1at, sqInt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -27015,6 +27011,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -28490,6 +28489,7 @@ genCounterTripOnlyJumpIfto(sqInt boolean, sqInt targetBytecodePC) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; AbstractInstruction *anInstruction3; + sqInt i; void *jumpTarget; AbstractInstruction *mustBeBooleanTrampoline; AbstractInstruction *ok; @@ -28497,7 +28497,14 @@ genCounterTripOnlyJumpIfto(sqInt boolean, sqInt targetBytecodePC) extA = 0; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } popToReg(ssTop(), TempReg); ssPop(1); @@ -28561,6 +28568,7 @@ genExtJumpIfNotInstanceOfBehaviorsBytecode(void) sqInt classIndex; sqInt classIndex1; sqInt distance; + sqInt i; int inverse; AbstractInstruction *jmp; AbstractInstruction * jmpImmediate; @@ -28579,7 +28587,14 @@ genExtJumpIfNotInstanceOfBehaviorsBytecode(void) popToReg(ssTop(), reg); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } literal = getLiteral((extA * 256) + byte1); if ((inverse = extB < 0)) { extB += 128; @@ -28757,6 +28772,8 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) AbstractInstruction *countTripped1; BytecodeFixup *fixup; BytecodeFixup * fixup1; + sqInt i; + sqInt i1; AbstractInstruction *jumpEqual; AbstractInstruction *jumpNotEqual; void *jumpTarget; @@ -28895,7 +28912,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg1, !unforwardRcvr1, argReg1, rcvrReg1, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -29076,7 +29100,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= (simStackPtr - 2); i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } if (unforwardArg) { genEnsureOopInRegNotForwardedscratchReg(argReg, TempReg); } @@ -29279,6 +29310,11 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) BytecodeFixup *fixup1; BytecodeFixup *fixup2; BytecodeFixup *fixup3; + sqInt i; + sqInt i1; + sqInt i2; + sqInt i3; + sqInt i4; void *jumpTarget; void *jumpTarget1; void *jumpTarget2; @@ -29306,7 +29342,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (isOptimizedMethod(methodObj)) { eventualTarget1 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc1 = ssTop(); ssPop(1); if ((((desc1->type)) == SSConstant) @@ -29381,7 +29424,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (((nextDescriptor->generator)) == genPushConstantTrueBytecode) { eventualTarget2 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 < simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc2 = ssTop(); ssPop(1); if ((((desc2->type)) == SSConstant) @@ -29450,7 +29500,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (((nextDescriptor->generator)) == genPushConstantFalseBytecode) { eventualTarget3 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc3 = ssTop(); ssPop(1); if ((((desc3->type)) == SSConstant) @@ -29525,7 +29582,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) || (((desc->constant)) == (falseObject())))) { eventualTarget4 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 < simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc4 = ssTop(); ssPop(1); if ((((desc4->type)) == SSConstant) @@ -29591,7 +29655,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) } eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 < simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } popToReg(desc, TempReg); ssPop(1); ssAllocateRequiredReg(SendNumArgsReg); @@ -30024,6 +30095,7 @@ genSpecialSelectorComparison(void) sqInt counterReg; AbstractInstruction *countTripped; AbstractInstruction *countTripped1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -30047,7 +30119,14 @@ genSpecialSelectorComparison(void) return genSpecialSelectorComparisonWithoutCounters(); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((((argInt = ((ssTop())->constant)))) & 7) == 1)); @@ -30056,7 +30135,7 @@ genSpecialSelectorComparison(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((((ssValue(1))->constant))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -30206,6 +30285,7 @@ genSpecialSelectorComparisonWithoutCounters(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -30223,14 +30303,21 @@ genSpecialSelectorComparisonWithoutCounters(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((((argInt = ((ssTop())->constant)))) & 7) == 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((((ssValue(1))->constant))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -30454,9 +30541,17 @@ genUnconditionalTrapBytecode(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceTrapTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -31442,10 +31537,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -32055,7 +32147,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -32081,7 +32174,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -32122,18 +32215,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -32205,7 +32297,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -32360,12 +32452,20 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -32500,7 +32600,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -32933,11 +33033,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -32969,10 +33077,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -32982,13 +33092,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -33062,7 +33186,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -33550,6 +33674,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -33557,7 +33682,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -33584,11 +33716,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -33675,7 +33806,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -33687,9 +33818,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -33788,6 +33919,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -33807,7 +33939,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((((rcvrInt = ((ssValue(1))->constant)))) & 7) == 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -33850,7 +33982,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -34070,6 +34209,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -34093,7 +34233,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -34119,6 +34266,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -34148,7 +34296,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -34160,7 +34308,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -34192,6 +34347,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -34230,7 +34386,14 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -34249,6 +34412,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -34266,7 +34430,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -34279,6 +34450,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -34290,7 +34462,14 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -34347,7 +34526,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -34372,6 +34551,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -34380,7 +34560,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -34415,60 +34602,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -34478,57 +34643,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -34536,16 +34705,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -34610,10 +34780,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -34624,7 +34804,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -34633,7 +34820,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -34704,7 +34898,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -34712,7 +34905,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; + sqInt i1; + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -34725,38 +34929,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -34767,6 +34974,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -34842,6 +35065,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -34852,6 +35086,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -34871,7 +35106,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -34990,6 +35230,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -35067,7 +35308,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -35147,7 +35393,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1ULL << requiredReg1) | ((1ULL << requiredReg2) | (1ULL << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1ULL << requiredReg1) | (1ULL << requiredReg2)) | (1ULL << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -35162,6 +35408,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -35176,12 +35423,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -35207,30 +35462,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1ULL << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -35240,15 +35471,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -35264,15 +35504,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -35283,11 +35535,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -35295,18 +35569,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -35325,18 +35589,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -35345,17 +35626,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -35363,6 +35661,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -35370,8 +35670,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -35381,17 +35697,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -35402,6 +35735,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -35469,13 +35809,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -35493,6 +35826,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -35567,6 +35931,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -35576,18 +35947,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spursista64src/vm/cointerp.c b/spursista64src/vm/cointerp.c index 26c95a2a54..601237418a 100644 --- a/spursista64src/vm/cointerp.c +++ b/spursista64src/vm/cointerp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -526,7 +526,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1516,7 +1515,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2570,7 +2569,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -20068,24 +20067,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -26782,7 +26763,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((sqInt)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -69460,7 +69449,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -75355,7 +75344,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -75372,7 +75369,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -75380,11 +75377,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -75418,7 +75415,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -78828,7 +78833,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -79132,7 +79137,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -79163,18 +79167,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -79225,10 +79232,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -79236,22 +79243,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -79263,18 +79270,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -79556,7 +79563,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spursista64src/vm/cointerp.h b/spursista64src/vm/cointerp.h index 88053de99c..e59fb6bc6e 100644 --- a/spursista64src/vm/cointerp.h +++ b/spursista64src/vm/cointerp.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ @@ -327,6 +327,7 @@ extern sqInt literalofMethod(sqInt offset, sqInt methodPointer); extern void longPrintOop(sqInt oop); extern sqInt longStoreBytecodeForHeader(sqInt methodHeader); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodClassAssociationOf(sqInt methodPointer); extern sqInt methodClassOf(sqInt methodPointer); extern sqInt methodPrimitiveIndex(void); diff --git a/spursista64src/vm/gcc3x-cointerp.c b/spursista64src/vm/gcc3x-cointerp.c index 257a0e1101..ecea024fae 100644 --- a/spursista64src/vm/gcc3x-cointerp.c +++ b/spursista64src/vm/gcc3x-cointerp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -529,7 +529,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1519,7 +1518,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2573,7 +2572,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -20077,24 +20076,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -26791,7 +26772,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((sqInt)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -69469,7 +69458,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -75364,7 +75353,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -75381,7 +75378,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -75389,11 +75386,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -75427,7 +75424,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -78837,7 +78842,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -79141,7 +79146,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -79172,18 +79176,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -79234,10 +79241,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -79245,22 +79252,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -79272,18 +79279,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -79565,7 +79572,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spursistasrc/vm/cogit.h b/spursistasrc/vm/cogit.h index 937859de2a..dfd7104c0a 100644 --- a/spursistasrc/vm/cogit.h +++ b/spursistasrc/vm/cogit.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ diff --git a/spursistasrc/vm/cogitARMv5.c b/spursistasrc/vm/cogitARMv5.c index 28b80cf85c..eb9a65130a 100644 --- a/spursistasrc/vm/cogitARMv5.c +++ b/spursistasrc/vm/cogitARMv5.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SistaCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + SistaCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "SistaCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "SistaCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -317,7 +317,6 @@ char *__cogitBuildInfo = __buildInfo; #define UnfailingPrimitive 3 #define UnimplementedOperation 2 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 10 #define VC 7 @@ -405,7 +404,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -650,7 +650,7 @@ static sqInt extBBytecode(void); static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -720,7 +720,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -1025,7 +1025,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms allocateLiteral(sqInt aLiteral); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1259,7 +1258,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1269,11 +1267,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1287,7 +1287,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1297,14 +1296,16 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1994,7 +1995,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -2018,7 +2018,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2100,6 +2099,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -7478,7 +7478,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -8892,12 +8892,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -10381,7 +10387,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -12114,7 +12120,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -22248,7 +22254,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -22300,7 +22306,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -23327,8 +23333,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -23537,13 +23544,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -26830,6 +26830,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -28455,6 +28458,7 @@ genCounterTripOnlyJumpIfto(sqInt boolean, sqInt targetBytecodePC) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; AbstractInstruction *anInstruction3; + sqInt i; void *jumpTarget; AbstractInstruction *mustBeBooleanTrampoline; AbstractInstruction *ok; @@ -28462,7 +28466,14 @@ genCounterTripOnlyJumpIfto(sqInt boolean, sqInt targetBytecodePC) extA = 0; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } popToReg(ssTop(), TempReg); ssPop(1); @@ -28538,6 +28549,7 @@ genExtJumpIfNotInstanceOfBehaviorsBytecode(void) sqInt classIndex; sqInt classIndex1; sqInt distance; + sqInt i; int inverse; AbstractInstruction *jmp; AbstractInstruction * jmpImmediate; @@ -28556,7 +28568,14 @@ genExtJumpIfNotInstanceOfBehaviorsBytecode(void) popToReg(ssTop(), reg); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } literal = getLiteral((extA * 256) + byte1); if ((inverse = extB < 0)) { extB += 128; @@ -28749,6 +28768,8 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) AbstractInstruction *countTripped1; BytecodeFixup *fixup; BytecodeFixup * fixup1; + sqInt i; + sqInt i1; AbstractInstruction *jumpEqual; AbstractInstruction *jumpNotEqual; void *jumpTarget; @@ -28887,7 +28908,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg1, !unforwardRcvr1, argReg1, rcvrReg1, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -29076,7 +29104,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= (simStackPtr - 2); i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } if (unforwardArg) { genEnsureOopInRegNotForwardedscratchReg(argReg, TempReg); } @@ -29294,6 +29329,11 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) BytecodeFixup *fixup1; BytecodeFixup *fixup2; BytecodeFixup *fixup3; + sqInt i; + sqInt i1; + sqInt i2; + sqInt i3; + sqInt i4; void *jumpTarget; void *jumpTarget1; void *jumpTarget2; @@ -29321,7 +29361,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (isOptimizedMethod(methodObj)) { eventualTarget1 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc1 = ssTop(); ssPop(1); if ((((desc1->type)) == SSConstant) @@ -29402,7 +29449,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (((nextDescriptor->generator)) == genPushConstantTrueBytecode) { eventualTarget2 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 < simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc2 = ssTop(); ssPop(1); if ((((desc2->type)) == SSConstant) @@ -29477,7 +29531,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (((nextDescriptor->generator)) == genPushConstantFalseBytecode) { eventualTarget3 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc3 = ssTop(); ssPop(1); if ((((desc3->type)) == SSConstant) @@ -29558,7 +29619,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) || (((desc->constant)) == (falseObject())))) { eventualTarget4 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 < simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc4 = ssTop(); ssPop(1); if ((((desc4->type)) == SSConstant) @@ -29630,7 +29698,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) } eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 < simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } popToReg(desc, TempReg); ssPop(1); ssAllocateRequiredReg(SendNumArgsReg); @@ -30124,6 +30199,7 @@ genSpecialSelectorComparison(void) sqInt counterReg; AbstractInstruction *countTripped; AbstractInstruction *countTripped1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -30147,7 +30223,14 @@ genSpecialSelectorComparison(void) return genSpecialSelectorComparisonWithoutCounters(); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); @@ -30156,7 +30239,7 @@ genSpecialSelectorComparison(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -30315,6 +30398,7 @@ genSpecialSelectorComparisonWithoutCounters(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -30332,14 +30416,21 @@ genSpecialSelectorComparisonWithoutCounters(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -30569,9 +30660,17 @@ genUnconditionalTrapBytecode(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceTrapTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -31554,10 +31653,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -32198,7 +32294,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -32224,7 +32321,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -32265,18 +32362,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -32348,7 +32444,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -32504,12 +32600,20 @@ genExtEnsureAllocableSlots(void) sqInt address1; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -32647,7 +32751,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -33097,11 +33201,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; sqInt address; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -33133,10 +33245,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -33146,13 +33260,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -33235,7 +33363,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -33770,6 +33898,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -33777,7 +33906,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -33804,11 +33940,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -33898,7 +34033,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -33910,9 +34045,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -34011,6 +34146,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -34026,7 +34162,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -34069,7 +34205,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -34309,6 +34452,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -34335,7 +34479,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -34361,6 +34512,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -34393,7 +34545,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -34405,7 +34557,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); if (usesOutOfLineLiteral(anInstruction1)) { @@ -34440,6 +34599,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -34481,7 +34641,14 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); if (usesOutOfLineLiteral(anInstruction1)) { @@ -34503,6 +34670,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -34520,7 +34688,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -34533,6 +34708,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -34544,7 +34720,14 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -34607,7 +34790,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) if (usesOutOfLineLiteral(anInstruction)) { (anInstruction->dependent = locateLiteral(offset)); } - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -34632,6 +34815,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -34640,7 +34824,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -34677,60 +34868,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -34740,57 +34909,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -34798,16 +34971,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -34872,10 +35046,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -34886,7 +35070,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -34895,7 +35086,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -34966,7 +35164,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -34974,7 +35171,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; + sqInt i1; + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -34987,38 +35195,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -35029,6 +35240,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -35104,6 +35331,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -35114,6 +35352,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -35133,7 +35372,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -35252,6 +35496,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -35329,7 +35574,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -35409,7 +35659,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -35424,6 +35674,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -35438,12 +35689,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -35469,30 +35728,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -35502,15 +35737,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -35526,15 +35770,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -35545,11 +35801,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -35557,18 +35835,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -35587,18 +35855,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -35607,17 +35892,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -35625,6 +35927,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -35632,8 +35936,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -35643,17 +35963,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -35664,6 +36001,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -35731,13 +36075,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -35755,6 +36092,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -35829,6 +36197,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -35838,18 +36213,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spursistasrc/vm/cogitIA32.c b/spursistasrc/vm/cogitIA32.c index 58a58b41fa..e7bfafcd85 100644 --- a/spursistasrc/vm/cogitIA32.c +++ b/spursistasrc/vm/cogitIA32.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SistaCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + SistaCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "SistaCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "SistaCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -332,7 +332,6 @@ char *__cogitBuildInfo = __buildInfo; #define UnfailingPrimitive 3 #define UnimplementedOperation 2 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #undef VarBaseReg #define XCHGAwR 155 @@ -421,7 +420,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -639,7 +639,7 @@ static sqInt extBBytecode(void); static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -994,7 +994,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); static AbstractInstruction * NoDbgRegParms checkQuickConstantforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1222,7 +1221,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1232,11 +1230,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1250,7 +1250,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1260,14 +1259,16 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1952,7 +1953,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -1976,7 +1976,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2059,6 +2058,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -7200,11 +7200,7 @@ stackPageInterruptHeadroomBytes(AbstractInstruction * self_in_stackPageInterrupt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -8915,12 +8911,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -10354,7 +10356,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -21268,7 +21270,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -21318,7 +21320,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -21828,8 +21830,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -22020,13 +22023,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -25009,6 +25005,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -26484,6 +26483,7 @@ genCounterTripOnlyJumpIfto(sqInt boolean, sqInt targetBytecodePC) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; AbstractInstruction *anInstruction3; + sqInt i; void *jumpTarget; AbstractInstruction *mustBeBooleanTrampoline; AbstractInstruction *ok; @@ -26491,7 +26491,14 @@ genCounterTripOnlyJumpIfto(sqInt boolean, sqInt targetBytecodePC) extA = 0; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } popToReg(ssTop(), TempReg); ssPop(1); @@ -26555,6 +26562,7 @@ genExtJumpIfNotInstanceOfBehaviorsBytecode(void) sqInt classIndex; sqInt classIndex1; sqInt distance; + sqInt i; int inverse; AbstractInstruction *jmp; AbstractInstruction * jmpImmediate; @@ -26573,7 +26581,14 @@ genExtJumpIfNotInstanceOfBehaviorsBytecode(void) popToReg(ssTop(), reg); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } literal = getLiteral((extA * 256) + byte1); if ((inverse = extB < 0)) { extB += 128; @@ -26751,6 +26766,8 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) AbstractInstruction *countTripped1; BytecodeFixup *fixup; BytecodeFixup * fixup1; + sqInt i; + sqInt i1; AbstractInstruction *jumpEqual; AbstractInstruction *jumpNotEqual; void *jumpTarget; @@ -26889,7 +26906,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg1, !unforwardRcvr1, argReg1, rcvrReg1, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -27070,7 +27094,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= (simStackPtr - 2); i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } if (unforwardArg) { genEnsureOopInRegNotForwardedscratchReg(argReg, TempReg); } @@ -27273,6 +27304,11 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) BytecodeFixup *fixup1; BytecodeFixup *fixup2; BytecodeFixup *fixup3; + sqInt i; + sqInt i1; + sqInt i2; + sqInt i3; + sqInt i4; void *jumpTarget; void *jumpTarget1; void *jumpTarget2; @@ -27300,7 +27336,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (isOptimizedMethod(methodObj)) { eventualTarget1 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc1 = ssTop(); ssPop(1); if ((((desc1->type)) == SSConstant) @@ -27375,7 +27418,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (((nextDescriptor->generator)) == genPushConstantTrueBytecode) { eventualTarget2 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 < simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc2 = ssTop(); ssPop(1); if ((((desc2->type)) == SSConstant) @@ -27444,7 +27494,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (((nextDescriptor->generator)) == genPushConstantFalseBytecode) { eventualTarget3 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc3 = ssTop(); ssPop(1); if ((((desc3->type)) == SSConstant) @@ -27519,7 +27576,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) || (((desc->constant)) == (falseObject())))) { eventualTarget4 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 < simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc4 = ssTop(); ssPop(1); if ((((desc4->type)) == SSConstant) @@ -27585,7 +27649,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) } eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 < simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } popToReg(desc, TempReg); ssPop(1); ssAllocateRequiredReg(SendNumArgsReg); @@ -28018,6 +28089,7 @@ genSpecialSelectorComparison(void) sqInt counterReg; AbstractInstruction *countTripped; AbstractInstruction *countTripped1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -28041,7 +28113,14 @@ genSpecialSelectorComparison(void) return genSpecialSelectorComparisonWithoutCounters(); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); @@ -28050,7 +28129,7 @@ genSpecialSelectorComparison(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -28200,6 +28279,7 @@ genSpecialSelectorComparisonWithoutCounters(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -28217,14 +28297,21 @@ genSpecialSelectorComparisonWithoutCounters(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -28448,9 +28535,17 @@ genUnconditionalTrapBytecode(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceTrapTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -29453,10 +29548,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -30066,7 +30158,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -30092,7 +30185,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -30133,18 +30226,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -30216,7 +30308,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -30365,12 +30457,20 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -30505,7 +30605,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -30938,11 +31038,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -30974,10 +31082,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -30987,13 +31097,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -31067,7 +31191,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -31553,6 +31677,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -31560,7 +31685,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -31587,11 +31719,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -31678,7 +31809,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -31690,9 +31821,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -31791,6 +31922,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -31810,7 +31942,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -31853,7 +31985,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -32073,6 +32212,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -32096,7 +32236,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -32122,6 +32269,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -32151,7 +32299,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -32163,7 +32311,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -32195,6 +32350,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -32233,7 +32389,14 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -32252,6 +32415,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -32269,7 +32433,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -32282,6 +32453,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -32293,7 +32465,14 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -32350,7 +32529,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -32375,6 +32554,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -32383,7 +32563,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -32418,60 +32605,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -32481,57 +32646,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -32539,16 +32708,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -32613,10 +32783,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -32627,7 +32807,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -32636,7 +32823,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -32707,7 +32901,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -32715,7 +32908,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -32728,38 +32932,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -32770,6 +32977,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -32845,6 +33068,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -32855,6 +33089,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -32874,7 +33109,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -32993,6 +33233,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -33070,7 +33311,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -33150,7 +33396,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -33165,6 +33411,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -33179,12 +33426,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -33210,30 +33465,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -33243,15 +33474,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -33267,15 +33507,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -33286,11 +33538,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -33298,18 +33572,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -33328,18 +33592,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -33348,17 +33629,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -33366,6 +33664,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -33373,8 +33673,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -33384,17 +33700,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -33405,6 +33738,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -33472,13 +33812,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -33496,6 +33829,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -33570,6 +33934,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -33579,18 +33950,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spursistasrc/vm/cogitMIPSEL.c b/spursistasrc/vm/cogitMIPSEL.c index 1daf06d79f..498c37564b 100644 --- a/spursistasrc/vm/cogitMIPSEL.c +++ b/spursistasrc/vm/cogitMIPSEL.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SistaCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + SistaCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "SistaCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "SistaCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -362,7 +362,6 @@ char *__cogitBuildInfo = __buildInfo; #define UnfailingPrimitive 3 #define UnimplementedOperation 2 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define V0 2 #define ValueIndex 1 #define VarBaseReg 22 @@ -449,7 +448,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -584,7 +584,7 @@ static sqInt extBBytecode(void); static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -653,7 +653,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -1141,7 +1141,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); static AbstractInstruction * NoDbgRegParms checkQuickConstantforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1368,7 +1367,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1378,11 +1376,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1396,7 +1396,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1406,14 +1405,16 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -2098,7 +2099,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -2122,7 +2122,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2203,6 +2202,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -2726,7 +2726,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - sqInt end; + usqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -4120,12 +4120,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -5082,7 +5088,7 @@ configureMNUCPICmethodOperandnumArgsdelta(CogMethod *cPIC, sqInt methodOperand, static sqInt NoDbgRegParms cPICCompactAndIsNowEmpty(CogMethod *cPIC) { - usqInt entryPoint; + sqInt entryPoint; sqInt followingAddress; sqInt i; sqInt methods[MaxCPICCases]; @@ -5183,7 +5189,7 @@ cPICHasForwardedClass(CogMethod *cPIC) static sqInt NoDbgRegParms cPICHasFreedTargets(CogMethod *cPIC) { - sqInt entryPoint; + usqInt entryPoint; sqInt i; sqInt pc; CogMethod *targetMethod; @@ -5557,7 +5563,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static sqInt NoDbgRegParms +static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -7228,7 +7234,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static sqInt NoDbgRegParms +static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -20639,7 +20645,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -20689,7 +20695,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -21199,8 +21205,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -21391,13 +21398,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -24372,6 +24372,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -25851,6 +25854,7 @@ genCounterTripOnlyJumpIfto(sqInt boolean, sqInt targetBytecodePC) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; AbstractInstruction *anInstruction3; + sqInt i; void *jumpTarget; AbstractInstruction *mustBeBooleanTrampoline; AbstractInstruction *ok; @@ -25858,7 +25862,14 @@ genCounterTripOnlyJumpIfto(sqInt boolean, sqInt targetBytecodePC) extA = 0; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } popToReg(ssTop(), TempReg); ssPop(1); @@ -25922,6 +25933,7 @@ genExtJumpIfNotInstanceOfBehaviorsBytecode(void) sqInt classIndex; sqInt classIndex1; sqInt distance; + sqInt i; int inverse; AbstractInstruction *jmp; AbstractInstruction * jmpImmediate; @@ -25940,7 +25952,14 @@ genExtJumpIfNotInstanceOfBehaviorsBytecode(void) popToReg(ssTop(), reg); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } literal = getLiteral((extA * 256) + byte1); if ((inverse = extB < 0)) { extB += 128; @@ -26118,6 +26137,8 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) AbstractInstruction *countTripped1; BytecodeFixup *fixup; BytecodeFixup * fixup1; + sqInt i; + sqInt i1; AbstractInstruction *jumpEqual; AbstractInstruction *jumpNotEqual; void *jumpTarget; @@ -26256,7 +26277,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg1, !unforwardRcvr1, argReg1, rcvrReg1, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -26437,7 +26465,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= (simStackPtr - 2); i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } if (unforwardArg) { genEnsureOopInRegNotForwardedscratchReg(argReg, TempReg); } @@ -26640,6 +26675,11 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) BytecodeFixup *fixup1; BytecodeFixup *fixup2; BytecodeFixup *fixup3; + sqInt i; + sqInt i1; + sqInt i2; + sqInt i3; + sqInt i4; void *jumpTarget; void *jumpTarget1; void *jumpTarget2; @@ -26667,7 +26707,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (isOptimizedMethod(methodObj)) { eventualTarget1 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc1 = ssTop(); ssPop(1); if ((((desc1->type)) == SSConstant) @@ -26742,7 +26789,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (((nextDescriptor->generator)) == genPushConstantTrueBytecode) { eventualTarget2 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 < simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc2 = ssTop(); ssPop(1); if ((((desc2->type)) == SSConstant) @@ -26811,7 +26865,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) if (((nextDescriptor->generator)) == genPushConstantFalseBytecode) { eventualTarget3 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < simStackPtr; i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc3 = ssTop(); ssPop(1); if ((((desc3->type)) == SSConstant) @@ -26886,7 +26947,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) || (((desc->constant)) == (falseObject())))) { eventualTarget4 = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i3 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i3 < simStackPtr; i3 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i3), frameOffsetOfTemporary(i3 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc4 = ssTop(); ssPop(1); if ((((desc4->type)) == SSConstant) @@ -26952,7 +27020,14 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) } eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i4 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i4 < simStackPtr; i4 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i4), frameOffsetOfTemporary(i4 - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } popToReg(desc, TempReg); ssPop(1); ssAllocateRequiredReg(SendNumArgsReg); @@ -27387,6 +27462,7 @@ genSpecialSelectorComparison(void) sqInt counterReg; AbstractInstruction *countTripped; AbstractInstruction *countTripped1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -27410,7 +27486,14 @@ genSpecialSelectorComparison(void) return genSpecialSelectorComparisonWithoutCounters(); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); @@ -27419,7 +27502,7 @@ genSpecialSelectorComparison(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -27569,6 +27652,7 @@ genSpecialSelectorComparisonWithoutCounters(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -27586,14 +27670,21 @@ genSpecialSelectorComparisonWithoutCounters(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -27817,9 +27908,17 @@ genUnconditionalTrapBytecode(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceTrapTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -28506,7 +28605,7 @@ picDataForinto(CogMethod *cogMethod, sqInt arrayObj) static void NoDbgRegParms populatewithPICInfoForfirstCacheTag(sqInt tuple, CogMethod *cPIC, sqInt firstCacheTag) { - sqInt cacheTag; + usqInt cacheTag; sqInt classOop; usqInt entryPoint; sqInt i; @@ -28793,10 +28892,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -29410,7 +29506,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -29436,7 +29533,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -29477,18 +29574,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -29560,7 +29656,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -29715,12 +29811,20 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -29855,7 +29959,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -30288,11 +30392,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -30324,10 +30436,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -30337,13 +30451,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -30417,7 +30545,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -30906,6 +31034,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -30913,7 +31042,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -30940,11 +31076,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -31031,7 +31166,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -31043,9 +31178,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -31144,6 +31279,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -31163,7 +31299,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -31206,7 +31342,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -31426,6 +31569,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -31449,7 +31593,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -31475,6 +31626,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -31504,7 +31656,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -31516,7 +31668,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -31548,6 +31707,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -31586,7 +31746,14 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -31605,6 +31772,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -31622,7 +31790,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -31635,6 +31810,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -31646,7 +31822,14 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -31703,7 +31886,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -31728,6 +31911,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -31736,7 +31920,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -31773,60 +31964,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -31836,57 +32005,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -31894,16 +32067,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -31968,10 +32142,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -31982,7 +32166,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -31991,7 +32182,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -32062,7 +32260,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -32070,7 +32267,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -32083,38 +32291,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -32125,6 +32336,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -32200,6 +32427,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -32210,6 +32448,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -32229,7 +32468,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -32348,6 +32592,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -32425,7 +32670,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -32505,7 +32755,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -32520,6 +32770,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -32534,12 +32785,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -32565,30 +32824,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -32598,15 +32833,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -32622,15 +32866,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -32641,11 +32897,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -32653,18 +32931,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -32683,18 +32951,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -32703,17 +32988,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -32721,6 +33023,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -32728,8 +33032,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -32739,17 +33059,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -32760,6 +33097,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -32827,13 +33171,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -32851,6 +33188,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -32925,6 +33293,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -32934,18 +33309,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spursistasrc/vm/cointerp.c b/spursistasrc/vm/cointerp.c index 0a48cd5b7d..60979154b1 100644 --- a/spursistasrc/vm/cointerp.c +++ b/spursistasrc/vm/cointerp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -525,7 +525,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1493,7 +1492,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2548,7 +2547,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -19226,24 +19225,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -21827,7 +21808,7 @@ printFrameWithSP(char *theFP, char *theSP) usqInt index; sqInt methodField; usqInt numArgs; - sqInt numTemps; + usqInt numTemps; char *rcvrAddress; sqInt rcvrOrClosure; sqInt theMethod; @@ -26096,7 +26077,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -65053,8 +65042,8 @@ void (*functionPointerForinClass(sqInt primIdx,sqInt theClass))(void) static sqInt getErrorObjectFromPrimFailCode(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqInt clone; - usqInt errObj; + sqInt clone; + sqInt errObj; sqInt fieldIndex; sqInt i; sqInt knownClassIndex; @@ -67726,7 +67715,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -73753,7 +73742,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -73770,7 +73767,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -73778,11 +73775,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -73816,7 +73813,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -77347,7 +77352,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -77700,7 +77705,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -77730,18 +77734,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -77792,10 +77799,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -77803,22 +77810,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -77830,18 +77837,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -78104,7 +78111,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spursistasrc/vm/cointerp.h b/spursistasrc/vm/cointerp.h index c7d846b2b8..5d99570e73 100644 --- a/spursistasrc/vm/cointerp.h +++ b/spursistasrc/vm/cointerp.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ @@ -325,6 +325,7 @@ extern sqInt literalofMethod(sqInt offset, sqInt methodPointer); extern void longPrintOop(sqInt oop); extern sqInt longStoreBytecodeForHeader(sqInt methodHeader); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodClassAssociationOf(sqInt methodPointer); extern sqInt methodClassOf(sqInt methodPointer); extern sqInt methodPrimitiveIndex(void); diff --git a/spursistasrc/vm/gcc3x-cointerp.c b/spursistasrc/vm/gcc3x-cointerp.c index 3e896f7707..49d4c61147 100644 --- a/spursistasrc/vm/gcc3x-cointerp.c +++ b/spursistasrc/vm/gcc3x-cointerp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -528,7 +528,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -1496,7 +1495,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2551,7 +2550,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -19235,24 +19234,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -21836,7 +21817,7 @@ printFrameWithSP(char *theFP, char *theSP) usqInt index; sqInt methodField; usqInt numArgs; - sqInt numTemps; + usqInt numTemps; char *rcvrAddress; sqInt rcvrOrClosure; sqInt theMethod; @@ -26105,7 +26086,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -65062,8 +65051,8 @@ void (*functionPointerForinClass(sqInt primIdx,sqInt theClass))(void) static sqInt getErrorObjectFromPrimFailCode(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqInt clone; - usqInt errObj; + sqInt clone; + sqInt errObj; sqInt fieldIndex; sqInt i; sqInt knownClassIndex; @@ -67735,7 +67724,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -73762,7 +73751,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -73779,7 +73776,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -73787,11 +73784,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -73825,7 +73822,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -77356,7 +77361,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -77709,7 +77714,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -77739,18 +77743,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -77801,10 +77808,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -77812,22 +77819,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -77839,18 +77846,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -78113,7 +78120,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spursrc/vm/cogit.h b/spursrc/vm/cogit.h index 7957f86f42..8e2b15a75d 100644 --- a/spursrc/vm/cogit.h +++ b/spursrc/vm/cogit.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ diff --git a/spursrc/vm/cogitARMv5.c b/spursrc/vm/cogitARMv5.c index b8e848bb74..18be64f8f2 100644 --- a/spursrc/vm/cogitARMv5.c +++ b/spursrc/vm/cogitARMv5.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -311,7 +311,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstOpcode 8 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 10 #define VC 7 @@ -399,7 +398,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -646,7 +646,7 @@ static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static CogMethod * NoDbgRegParms fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -717,7 +717,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -1005,7 +1005,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms allocateLiteral(sqInt aLiteral); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1208,7 +1207,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1218,11 +1216,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1236,7 +1236,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1246,14 +1245,16 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1936,7 +1937,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -1960,7 +1960,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2041,6 +2040,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -7411,7 +7411,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -8813,12 +8813,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -10358,7 +10364,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -12145,7 +12151,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -21733,7 +21739,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -21785,7 +21791,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -22587,8 +22593,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -22797,13 +22804,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -26189,10 +26189,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -26603,6 +26600,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -27192,7 +27192,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -27218,7 +27219,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -27259,18 +27260,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -27342,7 +27342,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -27523,12 +27523,20 @@ genExtEnsureAllocableSlots(void) sqInt address1; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -27666,7 +27674,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -27960,6 +27968,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -28072,7 +28081,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -28326,11 +28342,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; sqInt address; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -28366,13 +28390,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -28450,10 +28482,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -28463,13 +28497,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -28552,7 +28600,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -29087,6 +29135,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -29094,7 +29143,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -29121,11 +29177,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -29215,7 +29270,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -29227,9 +29282,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -29328,6 +29383,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -29343,7 +29399,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -29386,7 +29442,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -29581,6 +29644,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -29598,14 +29662,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -29784,6 +29855,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -29810,7 +29882,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -29836,6 +29915,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -29868,7 +29948,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -29880,7 +29960,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); if (usesOutOfLineLiteral(anInstruction1)) { @@ -29915,6 +30002,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -29956,7 +30044,14 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); if (usesOutOfLineLiteral(anInstruction1)) { @@ -29978,6 +30073,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -29995,7 +30091,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -30008,6 +30111,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -30019,7 +30123,14 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -30082,7 +30193,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) if (usesOutOfLineLiteral(anInstruction)) { (anInstruction->dependent = locateLiteral(offset)); } - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -30107,6 +30218,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -30115,7 +30227,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -30152,60 +30271,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -30215,57 +30312,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -30273,16 +30374,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -30347,10 +30449,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -30361,7 +30473,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -30370,7 +30489,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -30441,7 +30567,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -30449,7 +30574,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; + sqInt i1; + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -30462,38 +30598,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -30504,6 +30643,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -30579,6 +30734,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -30589,6 +30755,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -30608,7 +30775,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -30727,6 +30899,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -30802,7 +30975,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -30880,7 +31058,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -30895,6 +31073,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -30909,12 +31088,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -30940,30 +31127,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -30973,15 +31136,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -30997,15 +31169,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -31016,11 +31200,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -31028,18 +31234,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -31058,18 +31254,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -31078,17 +31291,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -31096,6 +31326,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -31103,8 +31335,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -31114,17 +31362,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -31135,6 +31400,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -31202,13 +31474,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -31226,6 +31491,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -31300,6 +31596,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -31309,18 +31612,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spursrc/vm/cogitIA32.c b/spursrc/vm/cogitIA32.c index ae2ddc6e1b..72b34a4e4b 100644 --- a/spursrc/vm/cogitIA32.c +++ b/spursrc/vm/cogitIA32.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -326,7 +326,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #undef VarBaseReg #define XCHGAwR 155 @@ -415,7 +414,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -635,7 +635,7 @@ static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static CogMethod * NoDbgRegParms fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -705,7 +705,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -975,7 +975,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); static AbstractInstruction * NoDbgRegParms checkQuickConstantforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1172,7 +1171,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1182,11 +1180,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1200,7 +1200,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1210,14 +1209,16 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1895,7 +1896,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -1919,7 +1919,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2001,6 +2000,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -7142,11 +7142,7 @@ stackPageInterruptHeadroomBytes(AbstractInstruction * self_in_stackPageInterrupt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -7455,7 +7451,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -8837,12 +8833,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -10333,7 +10335,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -12071,7 +12073,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -20829,7 +20831,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -20879,7 +20881,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -21164,8 +21166,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -21356,13 +21359,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -24448,10 +24444,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -24844,6 +24837,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -25409,7 +25405,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -25435,7 +25432,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -25476,18 +25473,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -25559,7 +25555,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -25733,12 +25729,20 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -25873,7 +25877,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -26167,6 +26171,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -26278,7 +26283,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -26509,11 +26521,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -26549,13 +26569,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -26627,10 +26655,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -26640,13 +26670,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -26720,7 +26764,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -27206,6 +27250,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -27213,7 +27258,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -27240,11 +27292,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -27331,7 +27382,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -27343,9 +27394,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -27444,6 +27495,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -27463,7 +27515,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -27506,7 +27558,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -27681,6 +27740,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -27698,14 +27758,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -27878,6 +27945,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -27901,7 +27969,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -27927,6 +28002,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -27956,7 +28032,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -27968,7 +28044,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -28000,6 +28083,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -28038,7 +28122,14 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -28057,6 +28148,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -28074,7 +28166,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -28087,6 +28186,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -28098,7 +28198,14 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -28155,7 +28262,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -28180,6 +28287,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -28188,7 +28296,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -28223,60 +28338,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -28286,57 +28379,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -28344,16 +28441,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -28418,10 +28516,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -28432,7 +28540,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -28441,7 +28556,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -28512,7 +28634,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -28520,7 +28641,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -28533,38 +28665,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -28575,6 +28710,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -28650,6 +28801,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -28660,6 +28822,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -28679,7 +28842,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -28798,6 +28966,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -28873,7 +29042,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -28951,7 +29125,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -28966,6 +29140,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -28980,12 +29155,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -29011,30 +29194,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -29044,15 +29203,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -29068,15 +29236,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -29087,11 +29267,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -29099,18 +29301,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -29129,18 +29321,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -29149,17 +29358,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -29167,6 +29393,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -29174,8 +29402,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -29185,17 +29429,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -29206,6 +29467,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -29273,13 +29541,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -29297,6 +29558,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -29371,6 +29663,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -29380,18 +29679,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spursrc/vm/cogitMIPSEL.c b/spursrc/vm/cogitMIPSEL.c index eeaf9d97e3..462f096a75 100644 --- a/spursrc/vm/cogitMIPSEL.c +++ b/spursrc/vm/cogitMIPSEL.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -356,7 +356,6 @@ char *__cogitBuildInfo = __buildInfo; #define TstCqR 105 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define V0 2 #define ValueIndex 1 #define VarBaseReg 22 @@ -443,7 +442,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -650,7 +650,7 @@ static BytecodeDescriptor * loadBytesAndGetDescriptor(void); static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor *descriptor, sqInt pc); static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); -static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -1120,7 +1120,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); static AbstractInstruction * NoDbgRegParms checkQuickConstantforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1316,7 +1315,6 @@ static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneed static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoolean, sqInt slotIndex, sqInt remoteTempIndex, sqInt needsStoreCheck); static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1326,11 +1324,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1344,7 +1344,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1354,14 +1353,16 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -2039,7 +2040,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -2063,7 +2063,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -2143,6 +2142,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -2658,7 +2658,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - sqInt end; + usqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -4040,12 +4040,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -4995,7 +5001,7 @@ configureMNUCPICmethodOperandnumArgsdelta(CogMethod *cPIC, sqInt methodOperand, static sqInt NoDbgRegParms cPICCompactAndIsNowEmpty(CogMethod *cPIC) { - sqInt entryPoint; + usqInt entryPoint; sqInt followingAddress; sqInt i; sqInt methods[MaxCPICCases]; @@ -7258,7 +7264,7 @@ gMoveCwR(sqInt wordConstant, sqInt reg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static sqInt NoDbgRegParms +static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -20113,7 +20119,7 @@ genStoreWithImmutabilityAndStoreCheckSourceRegslotIndexdestRegscratchRegneedRest (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } jmpTarget(jmpImmediate, jmpTarget(jmpDestYoung, jmpTarget(jmpSourceOld, genoperandoperand(Label, (labelCounter += 1), bytecodePC)))); if (!CheckRememberedInTrampoline) { @@ -20163,7 +20169,7 @@ genStoreWithImmutabilityButNoStoreCheckSourceRegslotIndexdestRegscratchRegneedRe (abstractInstruction2->annotation = HasBytecodePC); if (needRestoreRcvr) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); @@ -20448,8 +20454,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -20640,13 +20647,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -23716,10 +23716,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -24114,6 +24111,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -24685,7 +24685,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -24711,7 +24712,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -24752,18 +24753,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -24835,7 +24835,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -25015,12 +25015,20 @@ genExtEnsureAllocableSlots(void) AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction11; AbstractInstruction *anInstruction2; + sqInt i; sqInt quickConstant; AbstractInstruction * skip; sqInt slots; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } slots = (((usqInt) extA << 8)) + byte1; extA = 0; /* begin MoveAw:R: */ @@ -25155,7 +25163,7 @@ genExtPushFullClosureBytecode(void) reg = ssStorePoptoPreferredReg(1, TempReg); } else { - storeToReg((&simSelf), (reg = TempReg)); + storeToReg(simSelf(), (reg = TempReg)); } genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, FullClosureReceiverIndex, ReceiverResultReg); ssPushRegister(ReceiverResultReg); @@ -25449,6 +25457,7 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) sqInt constant; sqInt constant1; BytecodeFixup * fixup; + sqInt i; void *jumpTarget; void *jumpTarget1; AbstractInstruction *label; @@ -25560,7 +25569,14 @@ genForwardersInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(!unforwardArg, !unforwardRcvr, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin Label */ label = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ @@ -25791,11 +25807,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -25831,13 +25855,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -25909,10 +25941,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -25922,13 +25956,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -26002,7 +26050,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -26491,6 +26539,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -26498,7 +26547,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -26525,11 +26581,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -26616,7 +26671,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -26628,9 +26683,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -26729,6 +26784,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -26748,7 +26804,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -26791,7 +26847,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -26966,6 +27029,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -26983,14 +27047,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -27163,6 +27234,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -27186,7 +27258,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -27212,6 +27291,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -27241,7 +27321,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI abstractInstruction2 = genoperandoperand(Label, (labelCounter += 1), bytecodePC); (abstractInstruction2->annotation = HasBytecodePC); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -27253,7 +27333,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -27285,6 +27372,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh AbstractInstruction *abstractInstruction3; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -27323,7 +27411,14 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction1 = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -27342,6 +27437,7 @@ genStorePopMaybeContextRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCh static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -27359,7 +27455,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -27372,6 +27475,7 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea static sqInt NoDbgRegParms genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt objectIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt topReg; assert(needsFrame); @@ -27383,7 +27487,14 @@ genStorePopRemoteInstVarofObjectAtneedsStoreCheckneedsImmutabilityCheck(sqInt po ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -27440,7 +27551,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -27465,6 +27576,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -27473,7 +27585,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -27510,60 +27629,38 @@ genUpArrowReturn(void) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -27573,57 +27670,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 2 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -27631,16 +27732,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -27705,10 +27807,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 2 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -27719,7 +27831,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -27728,7 +27847,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -27799,7 +27925,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -27807,7 +27932,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -27820,38 +27956,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -27862,6 +28001,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (2 /* numRegArgs */ + 1)) ? numArgs : (2 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -27937,6 +28092,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -27947,6 +28113,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -27966,7 +28133,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -28085,6 +28257,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -28160,7 +28333,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -28238,7 +28416,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -28253,6 +28431,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -28267,12 +28446,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -28298,30 +28485,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -28331,15 +28494,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -28355,15 +28527,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -28374,11 +28558,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -28386,18 +28592,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -28416,18 +28612,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -28436,17 +28649,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -28454,6 +28684,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -28461,8 +28693,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -28472,17 +28720,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -28493,6 +28758,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -28560,13 +28832,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -28584,6 +28849,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -28658,6 +28954,13 @@ tryCollapseTempVectorInitializationOfSize(sqInt slots) return 1; } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -28667,18 +28970,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/spursrc/vm/cointerp.c b/spursrc/vm/cointerp.c index a55312ee4e..e50fa4e81a 100644 --- a/spursrc/vm/cointerp.c +++ b/spursrc/vm/cointerp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -521,7 +521,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -908,7 +907,7 @@ static sqInt NoDbgRegParms changeClassOfto(sqInt rcvr, sqInt argClass); static double NoDbgRegParms dbgFloatValueOf(sqInt oop); static sqInt defaultEdenBytes(void); extern sqInt fetchClassTagOf(sqInt oop); -extern sqInt floatObjectOf(double aFloat); +extern usqInt floatObjectOf(double aFloat); extern double floatValueOf(sqInt oop); static sqInt hasSixtyFourBitImmediates(void); extern sqInt headerIndicatesAlternateBytecodeSet(sqInt methodHeader); @@ -1484,7 +1483,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2539,7 +2538,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -17833,24 +17832,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -24600,7 +24581,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -39824,7 +39813,7 @@ fetchClassTagOf(sqInt oop) } /* Spur32BitMemoryManager>>#floatObjectOf: */ -sqInt +usqInt floatObjectOf(double aFloat) { DECL_MAYBE_SQ_GLOBAL_STRUCT usqInt newFloatObj; @@ -66201,7 +66190,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -72225,7 +72214,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -72242,7 +72239,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -72250,11 +72247,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -72288,7 +72285,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -75819,7 +75824,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -76172,7 +76177,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -76202,18 +76206,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -76264,10 +76271,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -76275,22 +76282,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -76302,18 +76309,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -76576,7 +76583,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spursrc/vm/cointerp.h b/spursrc/vm/cointerp.h index f26adc76a4..0bf1d71f34 100644 --- a/spursrc/vm/cointerp.h +++ b/spursrc/vm/cointerp.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ @@ -145,7 +145,7 @@ extern usqInt scavengeThresholdAddress(void); extern sqInt withoutForwardingOnandwithsendToCogit(sqInt obj1, sqInt obj2, sqInt aBool, sqInt (*selector)(sqInt,sqInt,sqInt)); extern sqInt byteSwapped(sqInt w); extern sqInt fetchClassTagOf(sqInt oop); -extern sqInt floatObjectOf(double aFloat); +extern usqInt floatObjectOf(double aFloat); extern sqInt headerIndicatesAlternateBytecodeSet(sqInt methodHeader); extern sqInt instantiateClassindexableSize(sqInt classObj, usqInt nElements); extern sqInt isIntegerValue(sqInt intValue); @@ -322,6 +322,7 @@ extern sqInt literalofMethod(sqInt offset, sqInt methodPointer); extern void longPrintOop(sqInt oop); extern sqInt longStoreBytecodeForHeader(sqInt methodHeader); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodClassAssociationOf(sqInt methodPointer); extern sqInt methodClassOf(sqInt methodPointer); extern sqInt methodPrimitiveIndex(void); diff --git a/spursrc/vm/gcc3x-cointerp.c b/spursrc/vm/gcc3x-cointerp.c index b451b58065..7128528086 100644 --- a/spursrc/vm/gcc3x-cointerp.c +++ b/spursrc/vm/gcc3x-cointerp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -524,7 +524,6 @@ static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameMethodObject(char *theFP); @@ -911,7 +910,7 @@ static sqInt NoDbgRegParms changeClassOfto(sqInt rcvr, sqInt argClass); static double NoDbgRegParms dbgFloatValueOf(sqInt oop); static sqInt defaultEdenBytes(void); extern sqInt fetchClassTagOf(sqInt oop); -extern sqInt floatObjectOf(double aFloat); +extern usqInt floatObjectOf(double aFloat); extern double floatValueOf(sqInt oop); static sqInt hasSixtyFourBitImmediates(void); extern sqInt headerIndicatesAlternateBytecodeSet(sqInt methodHeader); @@ -1487,7 +1486,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2542,7 +2541,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[Spur] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -17842,24 +17841,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -24609,7 +24590,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -39833,7 +39822,7 @@ fetchClassTagOf(sqInt oop) } /* Spur32BitMemoryManager>>#floatObjectOf: */ -sqInt +usqInt floatObjectOf(double aFloat) { DECL_MAYBE_SQ_GLOBAL_STRUCT usqInt newFloatObj; @@ -66210,7 +66199,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -72234,7 +72223,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -72251,7 +72248,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -72259,11 +72256,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -72297,7 +72294,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -75828,7 +75833,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -76181,7 +76186,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -76211,18 +76215,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -76273,10 +76280,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -76284,22 +76291,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -76311,18 +76318,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -76585,7 +76592,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurstack64src/vm/gcc3x-interp.c b/spurstack64src/vm/gcc3x-interp.c index 0b2cf5b228..483e793e88 100644 --- a/spurstack64src/vm/gcc3x-interp.c +++ b/spurstack64src/vm/gcc3x-interp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1248,7 +1248,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2313,7 +2313,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2347]"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -54777,6 +54777,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -57766,7 +57768,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -64750,6 +64752,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -64804,6 +64808,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -69200,7 +69206,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -69504,7 +69510,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -69535,18 +69540,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -69597,10 +69605,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -69608,22 +69616,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -69635,18 +69643,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -70147,6 +70155,8 @@ primitiveTerminateTo(void) assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -70253,7 +70263,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurstack64src/vm/interp.c b/spurstack64src/vm/interp.c index 16434eac75..517ef3a3fe 100644 --- a/spurstack64src/vm/interp.c +++ b/spurstack64src/vm/interp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1245,7 +1245,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2310,7 +2310,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2347]"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -54768,6 +54768,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -57757,7 +57759,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -64741,6 +64743,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -64795,6 +64799,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -69191,7 +69197,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -69495,7 +69501,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -69526,18 +69531,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -69588,10 +69596,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -69599,22 +69607,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -69626,18 +69634,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -70138,6 +70146,8 @@ primitiveTerminateTo(void) assert((((senderOop5) & 7) == 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -70244,7 +70254,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurstacksrc/vm/gcc3x-interp.c b/spurstacksrc/vm/gcc3x-interp.c index b0143907d5..de75a80833 100644 --- a/spurstacksrc/vm/gcc3x-interp.c +++ b/spurstacksrc/vm/gcc3x-interp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1227,7 +1227,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2293,7 +2293,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2347]"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -52964,6 +52964,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -55959,7 +55961,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -63159,6 +63161,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -63213,6 +63217,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -67720,7 +67726,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -68073,7 +68079,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -68103,18 +68108,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -68165,10 +68173,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -68176,22 +68184,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -68203,18 +68211,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -68696,6 +68704,8 @@ primitiveTerminateTo(void) assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -68802,7 +68812,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/spurstacksrc/vm/interp.c b/spurstacksrc/vm/interp.c index 8e59f843bc..976fb43251 100644 --- a/spurstacksrc/vm/interp.c +++ b/spurstacksrc/vm/interp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -1224,7 +1224,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2290,7 +2290,7 @@ static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2347]"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -52955,6 +52955,8 @@ followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags) referent3 = longAt((referent3 + BaseHeaderSize) + (0U << (shiftForWord()))); } aValue = referent3; + assert((aValue == (nilObject())) + || (isContext(aValue))); longAtput(theFP + FoxCallerContext, aValue); } } @@ -55950,7 +55952,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { sqInt maybeSelector; @@ -63150,6 +63152,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -63204,6 +63208,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -67711,7 +67717,7 @@ primitiveSetGCSemaphore(void) static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt sema; @@ -68064,7 +68070,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt fmt; @@ -68094,18 +68099,21 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - + if (rcvr & (tagMask())) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = (rcvr & (tagMask())) - || (((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0); + (/* begin isImmutable: */ + ((((usqInt) (longAt(rcvr))) >> (immutableBitShift())) & 1) != 0) # else /* IMMUTABILITY */ - /* begin isImmediate: */ - badRcvr = rcvr & (tagMask()); + 0 # endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } fmt = (((usqInt) (longAt(rcvr))) >> (formatShift())) & (formatMask()); @@ -68156,10 +68164,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l16; + goto l15; } value = value1; - goto l16; + goto l15; } if (newValue & (tagMask())) { /* begin primitiveFail */ @@ -68167,22 +68175,22 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ assert(!(isImmediate(newValue))); /* begin classIndexOf: */ ccIndex = (longAt(newValue)) & (classIndexMask()); ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l15; - l15: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + goto l14; + l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } /* begin numBytesOfBytes: */ fmt2 = (((usqInt) (longAt(newValue))) >> (formatShift())) & (formatMask()); @@ -68194,18 +68202,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l16; + goto l15; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((long64At((newValue + BaseHeaderSize) + (0U << 3)))); - goto l16; + goto l15; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l16; + goto l15; } - l16: /* end positiveMachineIntegerValueOf: */; + l15: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -68687,6 +68695,8 @@ primitiveTerminateTo(void) assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -68793,7 +68803,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/src/plugins/ADPCMCodecPlugin/ADPCMCodecPlugin.c b/src/plugins/ADPCMCodecPlugin/ADPCMCodecPlugin.c index 4c00c74e56..1edabe214d 100644 --- a/src/plugins/ADPCMCodecPlugin/ADPCMCodecPlugin.c +++ b/src/plugins/ADPCMCodecPlugin/ADPCMCodecPlugin.c @@ -1,14 +1,15 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - ADPCMCodecPlugin VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 + ADPCMCodecPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 ADPCMCodec Sound-pre.64 uuid: 1e82fad7-2c1d-ea42-9b55-cfa86185e99b */ -static char __buildInfo[] = "ADPCMCodecPlugin VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747\n\ +static char __buildInfo[] = "ADPCMCodecPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5\n\ ADPCMCodec Sound-pre.64 uuid: 1e82fad7-2c1d-ea42-9b55-cfa86185e99b " __DATE__ ; +#include "config.h" #include #include #include @@ -68,9 +69,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "ADPCMCodecPlugin VMMaker.oscog-eem.2293 (i)" + "ADPCMCodecPlugin VMMaker.oscog-eem.2347 (i)" #else - "ADPCMCodecPlugin VMMaker.oscog-eem.2293 (e)" + "ADPCMCodecPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/AioPlugin/AioPlugin.c b/src/plugins/AioPlugin/AioPlugin.c index dee0b1d198..ef0b4a97f0 100644 --- a/src/plugins/AioPlugin/AioPlugin.c +++ b/src/plugins/AioPlugin/AioPlugin.c @@ -1,5 +1,5 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2314 uuid: 0db879e4-e036-4956-a03e-a14b3923bbbc + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from UnixAioPlugin VMConstruction-Plugins-AioPlugin-eem.20 uuid: d996e325-2c19-49c7-a0a1-8f4619bfbe54 */ @@ -7,6 +7,7 @@ static char __buildInfo[] = "UnixAioPlugin VMConstruction-Plugins-AioPlugin-eem. +#include "config.h" #include #include #include diff --git a/src/plugins/AsynchFilePlugin/AsynchFilePlugin.c b/src/plugins/AsynchFilePlugin/AsynchFilePlugin.c index 22e07ef816..f28803d7e5 100644 --- a/src/plugins/AsynchFilePlugin/AsynchFilePlugin.c +++ b/src/plugins/AsynchFilePlugin/AsynchFilePlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - AsynchFilePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + AsynchFilePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "AsynchFilePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "AsynchFilePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -98,9 +99,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "AsynchFilePlugin VMMaker.oscog-eem.2309 (i)" + "AsynchFilePlugin VMMaker.oscog-eem.2347 (i)" #else - "AsynchFilePlugin VMMaker.oscog-eem.2309 (e)" + "AsynchFilePlugin VMMaker.oscog-eem.2347 (e)" #endif ; static void * sCOAFfn; diff --git a/src/plugins/B2DPlugin/B2DPlugin.c b/src/plugins/B2DPlugin/B2DPlugin.c index 555adbe531..4b06dcdaeb 100644 --- a/src/plugins/B2DPlugin/B2DPlugin.c +++ b/src/plugins/B2DPlugin/B2DPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - BalloonEnginePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + BalloonEnginePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "BalloonEnginePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "BalloonEnginePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -836,9 +837,9 @@ struct VirtualMachine* interpreterProxy; static void * loadBBFn; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "B2DPlugin VMMaker.oscog-eem.2309 (i)" + "B2DPlugin VMMaker.oscog-eem.2347 (i)" #else - "B2DPlugin VMMaker.oscog-eem.2309 (e)" + "B2DPlugin VMMaker.oscog-eem.2347 (e)" #endif ; static int* objBuffer; diff --git a/src/plugins/B3DAcceleratorPlugin/B3DAcceleratorPlugin.c b/src/plugins/B3DAcceleratorPlugin/B3DAcceleratorPlugin.c index b798543e28..0433de9809 100644 --- a/src/plugins/B3DAcceleratorPlugin/B3DAcceleratorPlugin.c +++ b/src/plugins/B3DAcceleratorPlugin/B3DAcceleratorPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - B3DAcceleratorPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + B3DAcceleratorPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "B3DAcceleratorPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "B3DAcceleratorPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -146,9 +147,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "B3DAcceleratorPlugin VMMaker.oscog-eem.2309 (i)" + "B3DAcceleratorPlugin VMMaker.oscog-eem.2347 (i)" #else - "B3DAcceleratorPlugin VMMaker.oscog-eem.2309 (e)" + "B3DAcceleratorPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/BMPReadWriterPlugin/BMPReadWriterPlugin.c b/src/plugins/BMPReadWriterPlugin/BMPReadWriterPlugin.c index dc1dd8d4ef..393c8cac4f 100644 --- a/src/plugins/BMPReadWriterPlugin/BMPReadWriterPlugin.c +++ b/src/plugins/BMPReadWriterPlugin/BMPReadWriterPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - BMPReadWriterPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + BMPReadWriterPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "BMPReadWriterPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 " __DATE__ ; +static char __buildInfo[] = "BMPReadWriterPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -68,9 +69,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "BMPReadWriterPlugin VMMaker.oscog-eem.1975 (i)" + "BMPReadWriterPlugin VMMaker.oscog-eem.2347 (i)" #else - "BMPReadWriterPlugin VMMaker.oscog-eem.1975 (e)" + "BMPReadWriterPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/BitBltPlugin/BitBltPlugin.c b/src/plugins/BitBltPlugin/BitBltPlugin.c index d676508a63..9003cd714d 100644 --- a/src/plugins/BitBltPlugin/BitBltPlugin.c +++ b/src/plugins/BitBltPlugin/BitBltPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - BitBltSimulation VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 + BitBltSimulation VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "BitBltSimulation VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 " __DATE__ ; +static char __buildInfo[] = "BitBltSimulation VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -352,9 +353,9 @@ static int maskTable[33] = { }; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "BitBltPlugin VMMaker.oscog-eem.2293 (i)" + "BitBltPlugin VMMaker.oscog-eem.2347 (i)" #else - "BitBltPlugin VMMaker.oscog-eem.2293 (e)" + "BitBltPlugin VMMaker.oscog-eem.2347 (e)" #endif ; static sqInt noHalftone; diff --git a/src/plugins/BochsIA32Plugin/BochsIA32Plugin.c b/src/plugins/BochsIA32Plugin/BochsIA32Plugin.c index 78c4349ec1..3f97e99743 100644 --- a/src/plugins/BochsIA32Plugin/BochsIA32Plugin.c +++ b/src/plugins/BochsIA32Plugin/BochsIA32Plugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - BochsIA32Plugin Cog-eem.344 uuid: 57f1233e-14ba-4fa9-a5da-818ec53d837c + BochsIA32Plugin Cog-eem.346 uuid: 73f848ee-01d3-4d2f-b5be-d869a12f7421 */ -static char __buildInfo[] = "BochsIA32Plugin Cog-eem.344 uuid: 57f1233e-14ba-4fa9-a5da-818ec53d837c " __DATE__ ; +static char __buildInfo[] = "BochsIA32Plugin Cog-eem.346 uuid: 73f848ee-01d3-4d2f-b5be-d869a12f7421 " __DATE__ ; +#include "config.h" #include #include #include @@ -114,9 +115,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "BochsIA32Plugin Cog-eem.344 (i)" + "BochsIA32Plugin Cog-eem.346 (i)" #else - "BochsIA32Plugin Cog-eem.344 (e)" + "BochsIA32Plugin Cog-eem.346 (e)" #endif ; diff --git a/src/plugins/BochsX64Plugin/BochsX64Plugin.c b/src/plugins/BochsX64Plugin/BochsX64Plugin.c index bf1ebe44f7..58ad8db560 100644 --- a/src/plugins/BochsX64Plugin/BochsX64Plugin.c +++ b/src/plugins/BochsX64Plugin/BochsX64Plugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - BochsX64Plugin Cog-eem.344 uuid: 57f1233e-14ba-4fa9-a5da-818ec53d837c + BochsX64Plugin Cog-eem.346 uuid: 73f848ee-01d3-4d2f-b5be-d869a12f7421 */ -static char __buildInfo[] = "BochsX64Plugin Cog-eem.344 uuid: 57f1233e-14ba-4fa9-a5da-818ec53d837c " __DATE__ ; +static char __buildInfo[] = "BochsX64Plugin Cog-eem.346 uuid: 73f848ee-01d3-4d2f-b5be-d869a12f7421 " __DATE__ ; +#include "config.h" #include #include #include @@ -114,9 +115,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "BochsX64Plugin Cog-eem.344 (i)" + "BochsX64Plugin Cog-eem.346 (i)" #else - "BochsX64Plugin Cog-eem.344 (e)" + "BochsX64Plugin Cog-eem.346 (e)" #endif ; diff --git a/src/plugins/CameraPlugin/CameraPlugin.c b/src/plugins/CameraPlugin/CameraPlugin.c index 675cd53942..7e3efcab18 100644 --- a/src/plugins/CameraPlugin/CameraPlugin.c +++ b/src/plugins/CameraPlugin/CameraPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CameraPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + CameraPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CameraPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "CameraPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -77,9 +78,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "CameraPlugin VMMaker.oscog-eem.2309 (i)" + "CameraPlugin VMMaker.oscog-eem.2347 (i)" #else - "CameraPlugin VMMaker.oscog-eem.2309 (e)" + "CameraPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/CroquetPlugin/CroquetPlugin.c b/src/plugins/CroquetPlugin/CroquetPlugin.c index e004ea2b40..0ee3c5b89f 100644 --- a/src/plugins/CroquetPlugin/CroquetPlugin.c +++ b/src/plugins/CroquetPlugin/CroquetPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CroquetPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + CroquetPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CroquetPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "CroquetPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -108,9 +109,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "CroquetPlugin VMMaker.oscog-eem.2309 (i)" + "CroquetPlugin VMMaker.oscog-eem.2347 (i)" #else - "CroquetPlugin VMMaker.oscog-eem.2309 (e)" + "CroquetPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/DESPlugin/DESPlugin.c b/src/plugins/DESPlugin/DESPlugin.c index d56098ed55..1df02e0642 100644 --- a/src/plugins/DESPlugin/DESPlugin.c +++ b/src/plugins/DESPlugin/DESPlugin.c @@ -1,5 +1,5 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from DESPlugin CryptographyPlugins-eem.12 uuid: 2945c878-6a44-4c6a-8374-b56aa6175d0f */ @@ -7,6 +7,7 @@ static char __buildInfo[] = "DESPlugin CryptographyPlugins-eem.12 uuid: 2945c878 +#include "config.h" #include #include #include @@ -279,13 +280,13 @@ cookKeyto(unsigned long *rawPtr, unsigned long *cookPtr) for (i = 0; i <= 15; i += 1) { raw0 = rawPtr[i * 2]; raw1 = rawPtr[(i * 2) + 1]; - cook = ((usqInt)((raw0 & 0xFC0000)) << 6); - cook = cook | (((usqInt)((raw0 & 0xFC0)) << 10)); + cook = (raw0 & 0xFC0000) << 6; + cook = cook | ((raw0 & 0xFC0) << 10); cook = cook | (((usqInt) (raw1 & 0xFC0000)) >> 10); cook = cook | (((usqInt) (raw1 & 0xFC0)) >> 6); cookPtr[i * 2] = cook; - cook = ((usqInt)((raw0 & 0x3F000)) << 12); - cook = cook | (((usqInt)((raw0 & 0x3F)) << 16)); + cook = (raw0 & 0x3F000) << 12; + cook = cook | ((raw0 & 0x3F) << 16); cook = cook | (((usqInt) (raw1 & 0x3F000)) >> 4); cook = cook | (raw1 & 0x3F); cookPtr[(i * 2) + 1] = cook; @@ -309,25 +310,25 @@ encryptwith(unsigned long *dataPtr, unsigned long *key) right = dataPtr[1]; work = ((((usqInt) left) >> 4) ^ right) & 252645135; right = right ^ work; - left = left ^ (((usqInt)(work) << 4)); + left = left ^ (work << 4); work = ((((usqInt) left) >> 16) ^ right) & 0xFFFF; right = right ^ work; - left = left ^ (((usqInt)(work) << 16)); + left = left ^ (work << 16); work = ((((usqInt) right) >> 2) ^ left) & 858993459; left = left ^ work; - right = right ^ (((usqInt)(work) << 2)); + right = right ^ (work << 2); work = ((((usqInt) right) >> 8) ^ left) & 16711935; left = left ^ work; - right = right ^ (((usqInt)(work) << 8)); - right = ((((usqInt)(right) << 1)) | ((((usqInt) right) >> 0x1F) & 1)) & 0xFFFFFFFFU; + right = right ^ (work << 8); + right = ((right << 1) | ((((usqInt) right) >> 0x1F) & 1)) & 0xFFFFFFFFU; work = (left ^ right) & 2863311530U; left = left ^ work; right = right ^ work; /* perform the 8 rounds of real encryption */ - left = ((((usqInt)(left) << 1)) | ((((usqInt) left) >> 0x1F) & 1)) & 0xFFFFFFFFU; + left = ((left << 1) | ((((usqInt) left) >> 0x1F) & 1)) & 0xFFFFFFFFU; for (round = 0; round <= 28; round += 4) { - work = (((usqInt)(right) << 28)) | (((usqInt) right) >> 4); + work = (right << 28) | (((usqInt) right) >> 4); work = work ^ (key[round]); fVal = sp7[work & 0x3F]; fVal = fVal | (sp5[(((usqInt) work) >> 8) & 0x3F]); @@ -339,7 +340,7 @@ encryptwith(unsigned long *dataPtr, unsigned long *key) fVal = fVal | (sp4[(((usqInt) work) >> 16) & 0x3F]); fVal = fVal | (sp2[(((usqInt) work) >> 24) & 0x3F]); left = left ^ fVal; - work = (((usqInt)(left) << 28)) | (((usqInt) left) >> 4); + work = (left << 28) | (((usqInt) left) >> 4); work = work ^ (key[round + 2]); fVal = sp7[work & 0x3F]; fVal = fVal | (sp5[(((usqInt) work) >> 8) & 0x3F]); @@ -352,23 +353,23 @@ encryptwith(unsigned long *dataPtr, unsigned long *key) fVal = fVal | (sp2[(((usqInt) work) >> 24) & 0x3F]); right = right ^ fVal; } - right = (((usqInt)(right) << 0x1F)) | (((usqInt) right) >> 1); + right = (right << 0x1F) | (((usqInt) right) >> 1); work = (left ^ right) & 2863311530U; left = left ^ work; right = right ^ work; - left = (((usqInt)(left) << 0x1F)) | (((usqInt) left) >> 1); + left = (left << 0x1F) | (((usqInt) left) >> 1); work = ((((usqInt) left) >> 8) ^ right) & 16711935; right = right ^ work; - left = left ^ (((usqInt)(work) << 8)); + left = left ^ (work << 8); work = ((((usqInt) left) >> 2) ^ right) & 858993459; right = right ^ work; - left = left ^ (((usqInt)(work) << 2)); + left = left ^ (work << 2); work = ((((usqInt) right) >> 16) ^ left) & 0xFFFF; left = left ^ work; - right = right ^ (((usqInt)(work) << 16)); + right = right ^ (work << 16); work = ((((usqInt) right) >> 4) ^ left) & 252645135; left = left ^ work; - right = right ^ (((usqInt)(work) << 4)); + right = right ^ (work << 4); dataPtr[0] = right; dataPtr[1] = left; return 0; @@ -479,25 +480,25 @@ primitiveDESTransform(void) right = work[1]; work1 = ((((usqInt) left) >> 4) ^ right) & 252645135; right = right ^ work1; - left = left ^ (((usqInt)(work1) << 4)); + left = left ^ (work1 << 4); work1 = ((((usqInt) left) >> 16) ^ right) & 0xFFFF; right = right ^ work1; - left = left ^ (((usqInt)(work1) << 16)); + left = left ^ (work1 << 16); work1 = ((((usqInt) right) >> 2) ^ left) & 858993459; left = left ^ work1; - right = right ^ (((usqInt)(work1) << 2)); + right = right ^ (work1 << 2); work1 = ((((usqInt) right) >> 8) ^ left) & 16711935; left = left ^ work1; - right = right ^ (((usqInt)(work1) << 8)); - right = ((((usqInt)(right) << 1)) | ((((usqInt) right) >> 0x1F) & 1)) & 0xFFFFFFFFU; + right = right ^ (work1 << 8); + right = ((right << 1) | ((((usqInt) right) >> 0x1F) & 1)) & 0xFFFFFFFFU; work1 = (left ^ right) & 2863311530U; left = left ^ work1; right = right ^ work1; /* perform the 8 rounds of real encryption */ - left = ((((usqInt)(left) << 1)) | ((((usqInt) left) >> 0x1F) & 1)) & 0xFFFFFFFFU; + left = ((left << 1) | ((((usqInt) left) >> 0x1F) & 1)) & 0xFFFFFFFFU; for (round = 0; round <= 28; round += 4) { - work1 = (((usqInt)(right) << 28)) | (((usqInt) right) >> 4); + work1 = (right << 28) | (((usqInt) right) >> 4); work1 = work1 ^ (cooked[round]); fVal = sp7[work1 & 0x3F]; fVal = fVal | (sp5[(((usqInt) work1) >> 8) & 0x3F]); @@ -509,7 +510,7 @@ primitiveDESTransform(void) fVal = fVal | (sp4[(((usqInt) work1) >> 16) & 0x3F]); fVal = fVal | (sp2[(((usqInt) work1) >> 24) & 0x3F]); left = left ^ fVal; - work1 = (((usqInt)(left) << 28)) | (((usqInt) left) >> 4); + work1 = (left << 28) | (((usqInt) left) >> 4); work1 = work1 ^ (cooked[round + 2]); fVal = sp7[work1 & 0x3F]; fVal = fVal | (sp5[(((usqInt) work1) >> 8) & 0x3F]); @@ -522,23 +523,23 @@ primitiveDESTransform(void) fVal = fVal | (sp2[(((usqInt) work1) >> 24) & 0x3F]); right = right ^ fVal; } - right = (((usqInt)(right) << 0x1F)) | (((usqInt) right) >> 1); + right = (right << 0x1F) | (((usqInt) right) >> 1); work1 = (left ^ right) & 2863311530U; left = left ^ work1; right = right ^ work1; - left = (((usqInt)(left) << 0x1F)) | (((usqInt) left) >> 1); + left = (left << 0x1F) | (((usqInt) left) >> 1); work1 = ((((usqInt) left) >> 8) ^ right) & 16711935; right = right ^ work1; - left = left ^ (((usqInt)(work1) << 8)); + left = left ^ (work1 << 8); work1 = ((((usqInt) left) >> 2) ^ right) & 858993459; right = right ^ work1; - left = left ^ (((usqInt)(work1) << 2)); + left = left ^ (work1 << 2); work1 = ((((usqInt) right) >> 16) ^ left) & 0xFFFF; left = left ^ work1; - right = right ^ (((usqInt)(work1) << 16)); + right = right ^ (work1 << 16); work1 = ((((usqInt) right) >> 4) ^ left) & 252645135; left = left ^ work1; - right = right ^ (((usqInt)(work1) << 4)); + right = right ^ (work1 << 4); work[0] = right; work[1] = left; /* begin unscrunch:to: */ @@ -622,13 +623,13 @@ processKeymodeto(unsigned char *keyPtr, sqInt encode, unsigned long *cookedPtr) for (i1 = 0; i1 <= 15; i1 += 1) { raw0 = rawKey[i1 * 2]; raw1 = rawKey[(i1 * 2) + 1]; - cook = ((usqInt)((raw0 & 0xFC0000)) << 6); - cook = cook | (((usqInt)((raw0 & 0xFC0)) << 10)); + cook = (raw0 & 0xFC0000) << 6; + cook = cook | ((raw0 & 0xFC0) << 10); cook = cook | (((usqInt) (raw1 & 0xFC0000)) >> 10); cook = cook | (((usqInt) (raw1 & 0xFC0)) >> 6); cookedPtr[i1 * 2] = cook; - cook = ((usqInt)((raw0 & 0x3F000)) << 12); - cook = cook | (((usqInt)((raw0 & 0x3F)) << 16)); + cook = (raw0 & 0x3F000) << 12; + cook = cook | ((raw0 & 0x3F) << 16); cook = cook | (((usqInt) (raw1 & 0x3F000)) >> 4); cook = cook | (raw1 & 0x3F); cookedPtr[(i1 * 2) + 1] = cook; diff --git a/src/plugins/DSAPrims/DSAPrims.c b/src/plugins/DSAPrims/DSAPrims.c index 82929e96ee..ade922f34c 100644 --- a/src/plugins/DSAPrims/DSAPrims.c +++ b/src/plugins/DSAPrims/DSAPrims.c @@ -1,5 +1,5 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from DSAPlugin CryptographyPlugins-eem.12 uuid: 2945c878-6a44-4c6a-8374-b56aa6175d0f */ @@ -7,6 +7,7 @@ static char __buildInfo[] = "DSAPlugin CryptographyPlugins-eem.12 uuid: 2945c878 +#include "config.h" #include #include #include diff --git a/src/plugins/DropPlugin/DropPlugin.c b/src/plugins/DropPlugin/DropPlugin.c index 3320b158ef..728a92fba6 100644 --- a/src/plugins/DropPlugin/DropPlugin.c +++ b/src/plugins/DropPlugin/DropPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - DropPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + DropPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "DropPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 " __DATE__ ; +static char __buildInfo[] = "DropPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -70,9 +71,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "DropPlugin VMMaker.oscog-eem.1975 (i)" + "DropPlugin VMMaker.oscog-eem.2347 (i)" #else - "DropPlugin VMMaker.oscog-eem.1975 (e)" + "DropPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/FFTPlugin/FFTPlugin.c b/src/plugins/FFTPlugin/FFTPlugin.c index f25104186a..b91e7c06cc 100644 --- a/src/plugins/FFTPlugin/FFTPlugin.c +++ b/src/plugins/FFTPlugin/FFTPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - FFTPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + FFTPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "FFTPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "FFTPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -83,9 +84,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "FFTPlugin VMMaker.oscog-eem.2309 (i)" + "FFTPlugin VMMaker.oscog-eem.2347 (i)" #else - "FFTPlugin VMMaker.oscog-eem.2309 (e)" + "FFTPlugin VMMaker.oscog-eem.2347 (e)" #endif ; static sqInt nu; diff --git a/src/plugins/FileAttributesPlugin/FileAttributesPlugin.c b/src/plugins/FileAttributesPlugin/FileAttributesPlugin.c index 2b5e838565..1c295274e8 100644 --- a/src/plugins/FileAttributesPlugin/FileAttributesPlugin.c +++ b/src/plugins/FileAttributesPlugin/FileAttributesPlugin.c @@ -1,21 +1,21 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2335 uuid: 9525a938-a6aa-43d4-8bdc-e844e8e7e360 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.28 uuid: fb804aff-1cbd-4ffa-b48a-e3d665d10673 + FileAttributesPlugin FileAttributesPlugin-AlistairGrant.12 uuid: 4f4a6801-af1c-4227-beb4-2a7c1b763349 */ -static char __buildInfo[] = "FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.28 uuid: fb804aff-1cbd-4ffa-b48a-e3d665d10673 " __DATE__ ; +static char __buildInfo[] = "FileAttributesPlugin FileAttributesPlugin-AlistairGrant.12 uuid: 4f4a6801-af1c-4227-beb4-2a7c1b763349 " __DATE__ ; +#include "config.h" #include #include #include #include #include -#include #include #include -#ifdef _WIN32 +#ifdef WIN32 #include #include #define FAIL() { return -1; } @@ -28,7 +28,7 @@ typedef struct dirptrstruct { char path[PATH_MAX+4]; } osdir; #include -#if !defined(HAVE_LSTAT) && !defined(_WIN32) +#if !defined(HAVE_LSTAT) && !defined(WIN32) #define HAVE_LSTAT 1 #endif #include @@ -53,28 +53,29 @@ typedef struct dirptrstruct { #include "sqMemoryAccess.h" -/*** Constants ***/ -#define PrimErrBadArgument 3 -#define PrimErrNoMemory 9 - - /*** Function Prototypes ***/ static sqInt accessAttributesForFilenameintostartingAt(char *cPathName, sqInt attributeArray, sqInt offset); static sqInt addressObjectFor(void *aMachineAddress); static sqInt byteArrayFromCStringto(const char *aCString, sqInt *byteArrayOop); static sqInt canOpenDirectoryStreamForlength(char *aPathCString, sqInt length); static sqInt canStatFilePathlength(char *aPathCString, sqInt length); +static sqInt cantAllocateMemory(void); +static sqInt cantOpenDir(void); +static sqInt cantReadlink(void); +static sqInt cantStatPath(void); EXPORT(sqInt) checkAccessmodeto(sqInt pathString, sqInt mode, sqInt *flag); -#if _WIN32 +static sqInt corruptValue(void); static sqInt fileCreationTimeForlengthto(char *pathString, sqInt pathLength, time_t *creationDate); -#endif /* _WIN32 */ +static sqInt fileExecutableFlag(void); +static sqInt fileOKFlag(void); +static sqInt fileReadableFlag(void); static int fileToAttributeArraymaskarray(char *cPathName, sqInt attributeMask, sqInt *attributeArray); +static sqInt fileWriteableFlag(void); +static sqInt getAttributesFailed(void); EXPORT(const char*) getModuleName(void); -EXPORT(sqInt) initialiseModule(void); +static sqInt invalidArguments(void); +static sqInt invalidRequest(void); static sqInt isSymlinkboolean(char *cPathName, sqInt *resultOop); -#if _WIN32 -static sqInt offsetStatBufTimesForWIN32(struct stat *statBufPointer); -#endif /* _WIN32 */ static sqInt oopFromTimeT(time_t posixSeconds); static int openDirectoryStreamptr(sqInt pathOOP, osdir **osdirPtr); static int pathOoptoBuffermaxLen(sqInt pathNameOop, char *cPathName, sqInt maxLen); @@ -92,42 +93,46 @@ EXPORT(sqInt) primitiveRewinddir(void); EXPORT(sqInt) primitiveVersionString(void); static sqInt putLStatForintoBuffertargetName(char *cPathName, struct stat *statBufPointer, sqInt *fileNameOop); static sqInt putStatForintoBuffertargetName(char *cPathName, struct stat *statBufPointer, sqInt *fileNameOop); -static sqInt readLinkintomaxLength(char *cPathName, char *cLinkPtr, size_t maxLength); +static size_t readLinkintomaxLength(char *cPathName, char *cLinkPtr, size_t maxLength); EXPORT(sqInt) setInterpreter(struct VirtualMachine*anInterpreter); +static sqInt sizeOfPointer(void); +static sqInt smallOrLargeIntegerObjectFor(sqInt aPositiveInteger); static sqInt statArrayFortoArrayfromfileName(char *cPathName, sqInt attributeArray, struct stat *statBufPointer, sqInt fileNameOop); +static sqInt statFailed(void); static sqInt stringFromCString(const char *aCString); +static sqInt stringTooLong(void); +static sqInt timeConversionFailed(void); +static char * versionString(void); +static sqInt wrappedErrorCode(sqInt aNumber); /*** Variables ***/ -static int hasSecurityPlugin = 1; +static int hasSecurityPlugin= 1; #if !defined(SQUEAK_BUILTIN_PLUGIN) static void * (*arrayValueOf)(sqInt oop); static sqInt (*classArray)(void); static sqInt (*classByteArray)(void); static sqInt (*classString)(void); -static sqInt (*failed)(void); static sqInt (*falseObject)(void); static sqInt (*instantiateClassindexableSize)(sqInt classPointer, sqInt size); static sqInt (*integerObjectOf)(sqInt value); static void * (*ioLoadFunctionFrom)(char *functionName, char *moduleName); static sqInt (*isKindOf)(sqInt oop, char *aString); +static sqInt (*isBytes)(sqInt oop); static sqInt (*nilObject)(void); +static sqInt (*pop)(sqInt nItems); static sqInt (*popthenPush)(sqInt nItems, sqInt oop); -static sqInt (*popRemappableOop)(void); static sqInt (*positive32BitIntegerFor)(unsigned int integerValue); static sqInt (*positive64BitIntegerFor)(usqLong integerValue); static sqInt (*primitiveFail)(void); -static sqInt (*primitiveFailFor)(sqInt reasonCode); -static sqInt (*primitiveFailForOSError)(sqLong osError); -static sqInt (*pushRemappableOop)(sqInt oop); +static sqInt (*push)(sqInt object); static sqInt (*signed32BitIntegerFor)(sqInt integerValue); static sqInt (*signed64BitIntegerFor)(sqLong integerValue); static sqInt (*sizeOfSTArrayFromCPrimitive)(void *cPtr); static sqInt (*stSizeOf)(sqInt oop); static sqInt (*stackIntegerValue)(sqInt offset); static sqInt (*stackObjectValue)(sqInt offset); -static sqInt (*stackValue)(sqInt offset); static sqInt (*storePointerofObjectwithValue)(sqInt index, sqInt oop, sqInt valuePointer); static sqInt (*trueObject)(void); #else /* !defined(SQUEAK_BUILTIN_PLUGIN) */ @@ -135,28 +140,25 @@ extern void * arrayValueOf(sqInt oop); extern sqInt classArray(void); extern sqInt classByteArray(void); extern sqInt classString(void); -extern sqInt failed(void); extern sqInt falseObject(void); extern sqInt instantiateClassindexableSize(sqInt classPointer, sqInt size); extern sqInt integerObjectOf(sqInt value); extern void * ioLoadFunctionFrom(char *functionName, char *moduleName); extern sqInt isKindOf(sqInt oop, char *aString); +extern sqInt isBytes(sqInt oop); extern sqInt nilObject(void); +extern sqInt pop(sqInt nItems); extern sqInt popthenPush(sqInt nItems, sqInt oop); -extern sqInt popRemappableOop(void); extern sqInt positive32BitIntegerFor(unsigned int integerValue); extern sqInt positive64BitIntegerFor(usqLong integerValue); extern sqInt primitiveFail(void); -extern sqInt primitiveFailFor(sqInt reasonCode); -extern sqInt primitiveFailForOSError(sqLong osError); -extern sqInt pushRemappableOop(sqInt oop); +extern sqInt push(sqInt object); extern sqInt signed32BitIntegerFor(sqInt integerValue); extern sqInt signed64BitIntegerFor(sqLong integerValue); extern sqInt sizeOfSTArrayFromCPrimitive(void *cPtr); extern sqInt stSizeOf(sqInt oop); extern sqInt stackIntegerValue(sqInt offset); extern sqInt stackObjectValue(sqInt offset); -extern sqInt stackValue(sqInt offset); extern sqInt storePointerofObjectwithValue(sqInt index, sqInt oop, sqInt valuePointer); extern sqInt trueObject(void); extern @@ -164,13 +166,12 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.28 (i)" + "FileAttributesPlugin FileAttributesPlugin-AlistairGrant.12 (i)" #else - "FileAttributesPlugin FileAttributesPlugin.oscog-AlistairGrant.28 (e)" + "FileAttributesPlugin FileAttributesPlugin-AlistairGrant.12 (e)" #endif ; -static void * sCLPfn; -static void * sCOFfn; +static int smallIntegerMaxVal= 1152921504606846975; @@ -194,14 +195,20 @@ accessAttributesForFilenameintostartingAt(char *cPathName, sqInt attributeArray, } storePointerofObjectwithValue(index, attributeArray, boolean); index += 1; - boolean = ((access(cPathName, W_OK)) == 0 - ? trueObject() - : falseObject()); + if ((access(cPathName, W_OK)) == 0) { + boolean = trueObject(); + } + else { + boolean = falseObject(); + } storePointerofObjectwithValue(index, attributeArray, boolean); index += 1; - boolean = ((access(cPathName, X_OK)) == 0 - ? trueObject() - : falseObject()); + if ((access(cPathName, X_OK)) == 0) { + boolean = trueObject(); + } + else { + boolean = falseObject(); + } storePointerofObjectwithValue(index, attributeArray, boolean); return 0; } @@ -218,14 +225,11 @@ addressObjectFor(void *aMachineAddress) union {void *address; unsigned char bytes[sizeof(void *)];} addressUnion; sqInt idx; - addressOop = instantiateClassindexableSize(classByteArray(), sizeof(void *)); - if (!(addressOop)) { - return primitiveFailFor(PrimErrNoMemory); - } + addressOop = instantiateClassindexableSize(classByteArray(), sizeOfPointer()); addressOopArrayPointer = arrayValueOf(addressOop); addressUnion.address = aMachineAddress; idx = 0; - while (idx < (sizeof(void *))) { + while (idx < (sizeOfPointer())) { addressOopArrayPointer[idx] = addressUnion.bytes[idx]; idx += 1; } @@ -247,33 +251,34 @@ byteArrayFromCStringto(const char *aCString, sqInt *byteArrayOop) /* We never return strings longer than PATH_MAX */ len = strlen(aCString); - if (len > PATH_MAX) { + if (len > (PATH_MAX)) { return -1 /* stringTooLong */; } newByteArray = instantiateClassindexableSize(classByteArray(), len); - if (!(newByteArray)) { - return primitiveFailFor(PrimErrNoMemory); - } byteArrayPtr = arrayValueOf(newByteArray); memcpy(byteArrayPtr, aCString, len); - byteArrayOop[0] = newByteArray; + *byteArrayOop = newByteArray; return 0; } /* Answer non-zero if security permits the directory to be listed. */ /* FIXME: This function has not been tested. -dtl */ -/* If the security plugin can be loaded, use it to check . - If not, assume it's ok */ -/* The hasSecurityPlugin flag is set to 1 by default */ /* FileAttributesPlugin>>#canOpenDirectoryStreamFor:length: */ static sqInt canOpenDirectoryStreamForlength(char *aPathCString, sqInt length) { + void *sCLPfn; + + + /* If the security plugin can be loaded, use it to check . + If not, assume it's ok */ + /* The hasSecurityPlugin flag is set to 1 by default */ if (hasSecurityPlugin == 0) { return 1; } + sCLPfn = ioLoadFunctionFrom("secCanListPathOfSize", "SecurityPlugin"); if (sCLPfn != 0) { return ((int (*) (char *, int)) sCLPfn)(aPathCString, length); } @@ -291,17 +296,21 @@ canOpenDirectoryStreamForlength(char *aPathCString, sqInt length) stat() call only on files which we are permitted to open. */ /* FIXME: This function has not been tested. -dtl */ -/* If the security plugin can be loaded, use it to check . - If not, assume it's ok */ -/* The hasSecurityPlugin flag is set to 1 by default */ /* FileAttributesPlugin>>#canStatFilePath:length: */ static sqInt canStatFilePathlength(char *aPathCString, sqInt length) { + void *sCOFfn; + + + /* If the security plugin can be loaded, use it to check . + If not, assume it's ok */ + /* The hasSecurityPlugin flag is set to 1 by default */ if (hasSecurityPlugin == 0) { return 1; } + sCOFfn = ioLoadFunctionFrom("secCanOpenFileOfSizeWritable", "SecurityPlugin"); if (sCOFfn != 0) { return ((int (*) (char *, int, int)) sCOFfn)(aPathCString, length, 0); } @@ -313,6 +322,37 @@ canStatFilePathlength(char *aPathCString, sqInt length) } } + /* FileAttributesPlugin>>#cantAllocateMemory */ +static sqInt +cantAllocateMemory(void) +{ + return -10; +} + + /* FileAttributesPlugin>>#cantOpenDir */ +static sqInt +cantOpenDir(void) +{ + return -9; +} + + /* FileAttributesPlugin>>#cantReadlink */ +static sqInt +cantReadlink(void) +{ + return -8; +} + + +/* SecurityPlugin determined that the requested path cannot be accessed. */ + + /* FileAttributesPlugin>>#cantStatPath */ +static sqInt +cantStatPath(void) +{ + return -3; +} + /* Check access to pathString. */ @@ -330,7 +370,7 @@ checkAccessmodeto(sqInt pathString, sqInt mode, sqInt *flag) the buffer turns out to be too small, write an error message to stdout before failing. */ len = stSizeOf(pathString); - if (len >= PATH_MAX) { + if (len >= (PATH_MAX)) { return -1 /* stringTooLong */; } sPtr = arrayValueOf(pathString); @@ -340,10 +380,17 @@ checkAccessmodeto(sqInt pathString, sqInt mode, sqInt *flag) } memcpy(cString, sPtr, len); cString[len] = 0; - flag[0] = (access(cString, mode)); + *flag = access(cString, mode); return 0; } + /* FileAttributesPlugin>>#corruptValue */ +static sqInt +corruptValue(void) +{ + return -7; +} + /* Get the creationDate for the supplied file. Linux kernel 4.11 should have statx(), so hopefully there will be a @@ -352,18 +399,23 @@ checkAccessmodeto(sqInt pathString, sqInt mode, sqInt *flag) */ /* FileAttributesPlugin>>#fileCreationTimeFor:length:to: */ -#if _WIN32 static sqInt fileCreationTimeForlengthto(char *pathString, sqInt pathLength, time_t *creationDate) { - SYSTEMTIME sysTime; struct tm tm; - WCHAR *win32Path; - WIN32_FILE_ATTRIBUTE_DATA winAttrs; - win32Path = 0; - memset((&tm), 0, sizeof(tm)); - ALLOC_WIN32_PATH(win32Path, pathString, pathLength); + +#ifdef WIN32 + WIN32_FILE_ATTRIBUTE_DATA winAttrs; + WCHAR *win32Path; + SYSTEMTIME sysTime; +#endif + + memset(&tm, 0, sizeof(tm)); + +#ifdef WIN32 + /* convert the supplied path name into a wide string */ + ALLOC_WIN32_PATH(win32Path, pathString, pathLength); if ((GetFileAttributesExW(win32Path, 0, &winAttrs)) == 0) { return -4 /* getAttributesFailed */; } @@ -371,18 +423,40 @@ fileCreationTimeForlengthto(char *pathString, sqInt pathLength, time_t *creation return -5 /* timeConversionFailed */; } - tm.tm_year = sysTime.wYear - 1900; - tm.tm_mon = sysTime.wMonth - 1; - tm.tm_mday = sysTime.wDay; - - tm.tm_hour = sysTime.wHour; - tm.tm_min = sysTime.wMinute; - tm.tm_sec = sysTime.wSecond; - tm.tm_isdst = 0; - *creationDate = mktime(&tm); + tm.tm_year = sysTime.wYear - 1900; + tm.tm_mon = sysTime.wMonth - 1; + tm.tm_mday = sysTime.wDay; + + tm.tm_hour = sysTime.wHour; + tm.tm_min = sysTime.wMinute; + tm.tm_sec = sysTime.wSecond; + tm.tm_isdst = 0; +#endif + + *creationDate = mktime(&tm); return 0; } -#endif /* _WIN32 */ + + /* FileAttributesPlugin>>#fileExecutableFlag */ +static sqInt +fileExecutableFlag(void) +{ + return X_OK; +} + + /* FileAttributesPlugin>>#fileOKFlag */ +static sqInt +fileOKFlag(void) +{ + return F_OK; +} + + /* FileAttributesPlugin>>#fileReadableFlag */ +static sqInt +fileReadableFlag(void) +{ + return R_OK; +} /* Answer a file attribute array from pathNameOop. */ @@ -392,36 +466,22 @@ static int fileToAttributeArraymaskarray(char *cPathName, sqInt attributeMask, sqInt *attributeArray) { sqInt accessArray; - sqInt boolean; - char cLinkName[PATH_MAX]; sqInt combinedArray; - time_t creationDate; sqInt fileNameOop; int getAccess; int getStats; - sqInt index; - sqInt len; - sqInt sizeIfFile; sqInt statArray; - struct stat statBuf; - struct stat *statBufPointer; - struct stat *statBufPointer1; - struct stat *statBufPointer2; + struct stat *statBufPointer= &statBuf; sqInt status; - sqInt status1; - sqInt status2; - sqInt status3; int useLstat; - sqInt val; /* Determine which attributes to retrieve */ accessArray = 0; fileNameOop = 0; statArray = 0; - val = 0; - getStats = attributeMask & 1; - getAccess = attributeMask & 2; + getStats = (attributeMask & 1) == 1; + getAccess = (attributeMask & 2) == 2; if (!(getStats || (getAccess))) { @@ -429,147 +489,52 @@ fileToAttributeArraymaskarray(char *cPathName, sqInt attributeMask, sqInt *attri return -6 /* invalidArguments */; } if (getStats) { - useLstat = attributeMask & 4; + useLstat = (attributeMask & 4) == 4; statArray = instantiateClassindexableSize(classArray(), 12); - if (!(statArray)) { - return primitiveFailFor(PrimErrNoMemory); - } if (useLstat) { - /* begin putLStatFor:intoBuffer:targetName: */ - statBufPointer2 = ((struct stat *) ((&statBuf))); - -# if HAVE_LSTAT == 1 - status3 = lstat(cPathName, statBufPointer2); - if (status3 != 0) { - /* begin cantStatPath */ - status = -3; - goto l5; - } - if ((S_ISLNK((statBufPointer2->st_mode))) == 0) { - ((&fileNameOop))[0] = (nilObject()); - } - else { - len = readLinkintomaxLength(cPathName, cLinkName, PATH_MAX); - if (len < 0) { - status = len; - goto l5; - } - status3 = byteArrayFromCStringto(cLinkName, (&fileNameOop)); - } -# else /* HAVE_LSTAT == 1 */ - - /* #HAVE_LSTAT = 1 */ - /* begin invalidRequest */ - status3 = -11; -# endif /* HAVE_LSTAT == 1 */ - status = status3; - l5: /* end putLStatFor:intoBuffer:targetName: */; + status = putLStatForintoBuffertargetName(cPathName, statBufPointer, &fileNameOop); } else { - /* begin putStatFor:intoBuffer:targetName: */ - statBufPointer = ((struct stat *) ((&statBuf))); - status1 = stat(cPathName, statBufPointer); - if (status1 != 0) { - /* begin cantStatPath */ - status = -3; - goto l1; - } - -# if defined(_WIN32) - offsetStatBufTimesForWIN32(statBufPointer); -# endif /* defined(_WIN32) */ - ((&fileNameOop))[0] = (nilObject()); - status = 0; - l1: /* end putStatFor:intoBuffer:targetName: */; + status = putStatForintoBuffertargetName(cPathName, statBufPointer, &fileNameOop); } if (status != 0) { return status; } - /* begin statArrayFor:toArray:from:fileName: */ - statBufPointer1 = ((struct stat *) ((&statBuf))); - sizeIfFile = ((S_ISDIR((statBufPointer1->st_mode))) == 0 - ? (statBufPointer1->st_size) - : 0); - storePointerofObjectwithValue(0, statArray, fileNameOop); - storePointerofObjectwithValue(1, statArray, (BytesPerWord == 8 - ? positive64BitIntegerFor((statBufPointer1->st_mode)) - : positive32BitIntegerFor((statBufPointer1->st_mode)))); - storePointerofObjectwithValue(2, statArray, positive64BitIntegerFor((statBufPointer1->st_ino))); - storePointerofObjectwithValue(3, statArray, positive64BitIntegerFor((statBufPointer1->st_dev))); - storePointerofObjectwithValue(4, statArray, positive64BitIntegerFor((statBufPointer1->st_nlink))); - storePointerofObjectwithValue(5, statArray, (BytesPerWord == 8 - ? positive64BitIntegerFor((statBufPointer1->st_uid)) - : positive32BitIntegerFor((statBufPointer1->st_uid)))); - storePointerofObjectwithValue(6, statArray, (BytesPerWord == 8 - ? positive64BitIntegerFor((statBufPointer1->st_gid)) - : positive32BitIntegerFor((statBufPointer1->st_gid)))); - storePointerofObjectwithValue(7, statArray, positive64BitIntegerFor(sizeIfFile)); - storePointerofObjectwithValue(8, statArray, ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor((statBufPointer1->st_atime)) - : signed64BitIntegerFor((statBufPointer1->st_atime)))); - storePointerofObjectwithValue(9, statArray, ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor((statBufPointer1->st_mtime)) - : signed64BitIntegerFor((statBufPointer1->st_mtime)))); - storePointerofObjectwithValue(10, statArray, ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor((statBufPointer1->st_ctime)) - : signed64BitIntegerFor((statBufPointer1->st_ctime)))); - -# if defined(_WIN32) - status2 = fileCreationTimeForlengthto(cPathName, strlen(cPathName), (&creationDate)); - storePointerofObjectwithValue(11, statArray, (status2 == 0 - ? (/* begin oopFromTimeT: */ - ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor(creationDate) - : signed64BitIntegerFor(creationDate))) - : nilObject())); -# else /* defined(_WIN32) */ - storePointerofObjectwithValue(11, statArray, nilObject()); -# endif /* defined(_WIN32) */ - status = 0; + status = statArrayFortoArrayfromfileName(cPathName, statArray, statBufPointer, fileNameOop); if (status != 0) { return status; } - attributeArray[0] = statArray; + *attributeArray = statArray; } if (getAccess) { accessArray = instantiateClassindexableSize(classArray(), 3); - if (!(accessArray)) { - return primitiveFailFor(PrimErrNoMemory); - } - /* begin accessAttributesForFilename:into:startingAt: */ - index = 0; - if ((access(cPathName, R_OK)) == 0) { - boolean = trueObject(); - } - else { - boolean = falseObject(); - } - storePointerofObjectwithValue(index, accessArray, boolean); - index += 1; - boolean = ((access(cPathName, W_OK)) == 0 - ? trueObject() - : falseObject()); - storePointerofObjectwithValue(index, accessArray, boolean); - index += 1; - boolean = ((access(cPathName, X_OK)) == 0 - ? trueObject() - : falseObject()); - storePointerofObjectwithValue(index, accessArray, boolean); - attributeArray[0] = accessArray; + accessAttributesForFilenameintostartingAt(cPathName, accessArray, 0); + *attributeArray = accessArray; } if (getStats && (getAccess)) { combinedArray = instantiateClassindexableSize(classArray(), 2); - if (!(combinedArray)) { - return primitiveFailFor(PrimErrNoMemory); - } - attributeArray[0] = combinedArray; + *attributeArray = combinedArray; storePointerofObjectwithValue(0, combinedArray, statArray); storePointerofObjectwithValue(1, combinedArray, accessArray); } return 0; } + /* FileAttributesPlugin>>#fileWriteableFlag */ +static sqInt +fileWriteableFlag(void) +{ + return W_OK; +} + + /* FileAttributesPlugin>>#getAttributesFailed */ +static sqInt +getAttributesFailed(void) +{ + return -4; +} + /* Note: This is hardcoded so it can be run from Squeak. The module name is used for validating a module *after* @@ -583,13 +548,18 @@ getModuleName(void) return moduleName; } - /* FileAttributesPlugin>>#initialiseModule */ -EXPORT(sqInt) -initialiseModule(void) + /* FileAttributesPlugin>>#invalidArguments */ +static sqInt +invalidArguments(void) { - sCOFfn = ioLoadFunctionFrom("secCanOpenFileOfSizeWritable", "SecurityPlugin"); - sCLPfn = ioLoadFunctionFrom("secCanListPathOfSize", "SecurityPlugin"); - return 1; + return -6; +} + + /* FileAttributesPlugin>>#invalidRequest */ +static sqInt +invalidRequest(void) +{ + return -11; } @@ -603,50 +573,16 @@ isSymlinkboolean(char *cPathName, sqInt *resultOop) struct stat statBuf; sqInt status; - -# if HAVE_LSTAT == 1 - status = lstat(cPathName, (&statBuf)); - if (status != 0) { - /* begin cantStatPath */ - return -3; - } - if ((S_ISLNK((statBuf.st_mode))) == 0) { - resultOop[0] = (falseObject()); - } - else { - resultOop[0] = (trueObject()); - } -# endif /* HAVE_LSTAT == 1 */ - return 0; -} - - -/* Adjust the statBuffer to UTC, see - https://msdn.microsoft.com/en-us/library/windows/desktop/ms725481(v=vs.85).aspx - */ - - /* FileAttributesPlugin>>#offsetStatBufTimesForWIN32: */ -#if _WIN32 -static sqInt -offsetStatBufTimesForWIN32(struct stat *statBufPointer) -{ - TIME_ZONE_INFORMATION dtzi; - long offset; - sqInt status; - - status = GetTimeZoneInformation((&dtzi)); - - /* Adjust for DST if required */ - offset = (dtzi.Bias) * 60; - if (status == 2) { - offset -= 3600; - } - statBufPointer->st_atime += offset; - statBufPointer->st_mtime += offset; - statBufPointer->st_ctime += offset; + isDefinedTrueExpressioninSmalltalkcommentifTrueifFalse("HAVE_LSTAT == 1", null, "", ((status = lstat(cPathName, &statBuf)), + (status != 0 + ? (/* begin cantStatPath */ + return -3) + : 0), + ((S_ISLNK(statBuf.st_mode)) == 0 + ? *resultOop = interpreterProxy->falseObject() + : *resultOop = interpreterProxy->trueObject())), null); return 0; } -#endif /* _WIN32 */ /* Answer an object representation of the provided time (time_t). @@ -658,9 +594,10 @@ offsetStatBufTimesForWIN32(struct stat *statBufPointer) static sqInt oopFromTimeT(time_t posixSeconds) { - return ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor(posixSeconds) - : signed64BitIntegerFor(posixSeconds)); + if ((sizeof(time_t)) == 4) { + return signed32BitIntegerFor(posixSeconds); + } + return signed64BitIntegerFor(posixSeconds); } @@ -680,7 +617,7 @@ openDirectoryStreamptr(sqInt pathOOP, osdir **osdirPtr) /* The path buffer needs room for a trailing slash and the file name, so subtracting 2 is conservative */ len = sizeOfSTArrayFromCPrimitive(sPtr); - if (len > (PATH_MAX - 2)) { + if (len > (PATH_MAX-2)) { return -1 /* stringTooLong */; } if (canOpenDirectoryStreamForlength(sPtr, len)) { @@ -689,7 +626,7 @@ openDirectoryStreamptr(sqInt pathOOP, osdir **osdirPtr) /* begin cantAllocateMemory */ return ((sqInt) -10); } - memcpy((dir->path), sPtr, len); + memcpy(dir->path, sPtr, len); if (dir->path[len-1] != '/') { dir->path[len++] = '/'; } @@ -697,12 +634,12 @@ openDirectoryStreamptr(sqInt pathOOP, osdir **osdirPtr) dir->path_file[0] = '\0'; dir->path_len = len; dir->dp = opendir(dir->path); - if (!((dir->dp))) { + if ((dir->dp) == null) { free(dir); /* begin cantOpenDir */ return ((sqInt) -9); } - osdirPtr[0] = dir; + *osdirPtr = dir; return 0; } /* begin cantOpenDir */ @@ -744,13 +681,13 @@ pointerFrom(sqInt directoryPointerBytes) sqInt idx; unsigned char *ptr; - if (!((isKindOf(directoryPointerBytes, "ByteArray")) - && ((stSizeOf(directoryPointerBytes)) == (sizeof(void *))))) { + if (!((isBytes(directoryPointerBytes)) + && ((stSizeOf(directoryPointerBytes)) == (sizeOfPointer())))) { return null; } ptr = arrayValueOf(directoryPointerBytes); idx = 0; - while (idx < (sizeof(void *))) { + while (idx < (sizeOfPointer())) { addressUnion.bytes[idx] = ptr[idx]; idx += 1; } @@ -759,9 +696,7 @@ pointerFrom(sqInt directoryPointerBytes) /* Close the directory stream for dirPointerOop. Answer dirPointerOop on - success. Raise PrimErrBadArgument if the parameter is not a ByteArray - length size(void *). - If closedir() returns an error raise PrimitiveOSError. + success. */ /* FileAttributesPlugin>>#primitiveClosedir */ @@ -772,17 +707,30 @@ primitiveClosedir(void) osdir *dirStream; sqInt result; - dirPointerOop = stackValue(0); + dirPointerOop = stackObjectValue(0); + if (dirPointerOop == (nilObject())) { + return (pop(2), + push(signed32BitIntegerFor(-6 /* invalidArguments */))); + } + if (!(isKindOf(dirPointerOop, "ByteArray"))) { + fprintf(stderr, "primitiveClosedir: invalid argument, expected an ByteArray\n"); + return (pop(2), + push(signed32BitIntegerFor(-6 /* invalidArguments */))); + } dirStream = pointerFrom(dirPointerOop); - if (!(dirStream)) { - return primitiveFailFor(PrimErrBadArgument); + if (dirStream == null) { + return (pop(2), + push(signed32BitIntegerFor(-7 /* corruptValue */))); } - result = closedir((dirStream->dp)); + result = closedir(dirStream->dp); if (!(result == 0)) { - return primitiveFailForOSError(-12 /* unableToCloseDir */); + perror("closedir"); + return (pop(2), + push(signed32BitIntegerFor(-7 /* corruptValue */))); } free(dirStream); - popthenPush(2, dirPointerOop); + pop(2); + push(dirPointerOop); return 0; } @@ -803,189 +751,162 @@ primitiveClosedir(void) EXPORT(sqInt) primitiveFileAttribute(void) { + sqInt aPositiveInteger; + sqInt aPositiveInteger1; + sqInt aPositiveInteger2; sqInt attributeNumber; char cPathName[PATH_MAX]; time_t creationDate; sqInt fileName; sqInt fileNameOop; sqInt mode; - time_t posixSeconds; - time_t posixSeconds1; - time_t posixSeconds2; sqInt resultOop; - sqInt *resultOop1; sqInt sizeIfFile; struct stat statBuf; - struct stat statBuf1; - struct stat *statBufPointer; + struct stat *statBufPointer= &statBuf; sqInt status; - sqInt status1; - sqInt status2; - sqInt val; - usqIntptr_t value; - usqIntptr_t value1; - usqIntptr_t value2; fileNameOop = 0; - mode = 0; - val = 0; fileName = stackObjectValue(1); attributeNumber = stackIntegerValue(0); - if ((failed()) - || ((!(((attributeNumber >= 1) && (attributeNumber <= 16)))) - || (!(isKindOf(fileName, "String"))))) { - return primitiveFailFor(PrimErrBadArgument); + if ((attributeNumber < 1) + || (attributeNumber > 16)) { + return (pop(3), + push(wrappedErrorCode(-6 /* invalidArguments */))); + } + if (!(isKindOf(fileName, "String"))) { + return (pop(3), + push(wrappedErrorCode(-6 /* invalidArguments */))); } status = pathOoptoBuffermaxLen(fileName, cPathName, PATH_MAX); if (status != 0) { - return primitiveFailForOSError(status); + return (pop(3), + push(wrappedErrorCode(status))); } resultOop = 0; if (attributeNumber < 12) { /* Get requested stat entry */ - /* begin putStatFor:intoBuffer:targetName: */ - statBufPointer = ((struct stat *) ((&statBuf))); - status2 = stat(cPathName, statBufPointer); - if (status2 != 0) { - /* begin cantStatPath */ - status = -3; - goto l13; - } - -# if defined(_WIN32) - offsetStatBufTimesForWIN32(statBufPointer); -# endif /* defined(_WIN32) */ - ((&fileNameOop))[0] = (nilObject()); - status = 0; - l13: /* end putStatFor:intoBuffer:targetName: */; + status = putStatForintoBuffertargetName(cPathName, statBufPointer, &fileNameOop); if (status != 0) { - return primitiveFailForOSError(status); + return (pop(3), + push(wrappedErrorCode(status))); } if (attributeNumber == 1) { resultOop = fileNameOop; } if (attributeNumber == 2) { - /* begin positiveMachineIntegerFor: */ - value = (statBuf.st_mode); - resultOop = (BytesPerWord == 8 - ? positive64BitIntegerFor(value) - : positive32BitIntegerFor(value)); + /* begin smallOrLargeIntegerObjectFor: */ + aPositiveInteger = statBuf.st_mode; + if (aPositiveInteger > smallIntegerMaxVal) { + resultOop = integerObjectOf(aPositiveInteger); + goto l1; + } + else { + resultOop = positive32BitIntegerFor(aPositiveInteger); + goto l1; + } + l1: /* end smallOrLargeIntegerObjectFor: */; } if (attributeNumber == 3) { - resultOop = positive64BitIntegerFor((statBuf.st_ino)); + resultOop = positive64BitIntegerFor(statBuf.st_ino); } if (attributeNumber == 4) { - resultOop = positive64BitIntegerFor((statBuf.st_dev)); + resultOop = positive64BitIntegerFor(statBuf.st_dev); } if (attributeNumber == 5) { - resultOop = positive64BitIntegerFor((statBuf.st_nlink)); + resultOop = positive64BitIntegerFor(statBuf.st_nlink); } if (attributeNumber == 6) { - /* begin positiveMachineIntegerFor: */ - value1 = (statBuf.st_uid); - resultOop = (BytesPerWord == 8 - ? positive64BitIntegerFor(value1) - : positive32BitIntegerFor(value1)); + /* begin smallOrLargeIntegerObjectFor: */ + aPositiveInteger1 = statBuf.st_uid; + if (aPositiveInteger1 > smallIntegerMaxVal) { + resultOop = integerObjectOf(aPositiveInteger1); + goto l2; + } + else { + resultOop = positive32BitIntegerFor(aPositiveInteger1); + goto l2; + } + l2: /* end smallOrLargeIntegerObjectFor: */; } if (attributeNumber == 7) { - /* begin positiveMachineIntegerFor: */ - value2 = (statBuf.st_gid); - resultOop = (BytesPerWord == 8 - ? positive64BitIntegerFor(value2) - : positive32BitIntegerFor(value2)); + /* begin smallOrLargeIntegerObjectFor: */ + aPositiveInteger2 = statBuf.st_gid; + if (aPositiveInteger2 > smallIntegerMaxVal) { + resultOop = integerObjectOf(aPositiveInteger2); + goto l3; + } + else { + resultOop = positive32BitIntegerFor(aPositiveInteger2); + goto l3; + } + l3: /* end smallOrLargeIntegerObjectFor: */; } if (attributeNumber == 8) { - sizeIfFile = ((S_ISDIR((statBuf.st_mode))) == 0 - ? (statBuf.st_size) - : 0); - /* begin positiveMachineIntegerFor: */ - resultOop = (BytesPerWord == 8 - ? positive64BitIntegerFor(sizeIfFile) - : positive32BitIntegerFor(sizeIfFile)); + if ((S_ISDIR(statBuf.st_mode)) == 0) { + sizeIfFile = statBuf.st_size; + } + else { + sizeIfFile = 0; + } + /* begin smallOrLargeIntegerObjectFor: */ + if (sizeIfFile > smallIntegerMaxVal) { + resultOop = integerObjectOf(sizeIfFile); + goto l4; + } + else { + resultOop = positive32BitIntegerFor(sizeIfFile); + goto l4; + } + l4: /* end smallOrLargeIntegerObjectFor: */; } if (attributeNumber == 9) { - /* begin oopFromTimeT: */ - posixSeconds = ((time_t) ((statBuf.st_atime))); - resultOop = ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor(posixSeconds) - : signed64BitIntegerFor(posixSeconds)); + resultOop = oopFromTimeT(statBuf.st_atime); } if (attributeNumber == 10) { - /* begin oopFromTimeT: */ - posixSeconds1 = ((time_t) ((statBuf.st_mtime))); - resultOop = ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor(posixSeconds1) - : signed64BitIntegerFor(posixSeconds1)); + resultOop = oopFromTimeT(statBuf.st_mtime); } if (attributeNumber == 11) { - /* begin oopFromTimeT: */ - posixSeconds2 = ((time_t) ((statBuf.st_ctime))); - resultOop = ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor(posixSeconds2) - : signed64BitIntegerFor(posixSeconds2)); + resultOop = oopFromTimeT(statBuf.st_ctime); } } else { if (attributeNumber == 12) { - -# if defined(_WIN32) - status = fileCreationTimeForlengthto(cPathName, strlen(cPathName), (&creationDate)); + status = fileCreationTimeForlengthto(cPathName, strlen(cPathName), &creationDate); if (status != 0) { - return primitiveFailForOSError(status); + return (pop(3), + push(wrappedErrorCode(status))); } - /* begin oopFromTimeT: */ - resultOop = ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor(creationDate) - : signed64BitIntegerFor(creationDate)); -# else /* defined(_WIN32) */ - resultOop = nilObject(); -# endif /* defined(_WIN32) */ + resultOop = oopFromTimeT(creationDate); } else { if (attributeNumber < 16) { /* Get requested access entry */ if (attributeNumber == 13) { - /* begin fileReadableFlag */ - mode = R_OK; + mode = fileReadableFlag(); } if (attributeNumber == 14) { - /* begin fileWriteableFlag */ - mode = W_OK; + mode = fileWriteableFlag(); } if (attributeNumber == 15) { - /* begin fileExecutableFlag */ - mode = X_OK; + mode = fileExecutableFlag(); + } + if ((access(cPathName, mode)) == 0) { + resultOop = trueObject(); + } + else { + resultOop = falseObject(); } - resultOop = ((access(cPathName, mode)) == 0 - ? trueObject() - : falseObject()); } else { /* attributeNumber = 16 */ - /* begin isSymlink:boolean: */ - resultOop1 = ((sqInt *) ((&resultOop))); - -# if HAVE_LSTAT == 1 - status1 = lstat(cPathName, (&statBuf1)); - if (status1 != 0) { - /* begin cantStatPath */ - status = -3; - goto l12; - } - if ((S_ISLNK((statBuf1.st_mode))) == 0) { - resultOop1[0] = (falseObject()); - } - else { - resultOop1[0] = (trueObject()); - } -# endif /* HAVE_LSTAT == 1 */ - status = 0; - l12: /* end isSymlink:boolean: */; + status = isSymlinkboolean(cPathName, &resultOop); if (status != 0) { - return primitiveFailForOSError(status); + return (pop(3), + push(wrappedErrorCode(status))); } } } @@ -993,10 +914,11 @@ primitiveFileAttribute(void) if (resultOop == 0) { /* It shouldn't be possible to get here */ - primitiveFail(); + return primitiveFail(); } else { - popthenPush(3, resultOop); + pop(3); + push(resultOop); } return 0; } @@ -1020,26 +942,27 @@ primitiveFileAttributes(void) char cPathName[PATH_MAX]; sqInt fileName; int status; - sqInt val; attributeArray = 0; - val = 0; fileName = stackObjectValue(1); attributeMask = stackIntegerValue(0); - if ((failed()) - || (!(isKindOf(fileName, "String")))) { - return primitiveFailFor(PrimErrBadArgument); + if (!(isKindOf(fileName, "String"))) { + return (pop(3), + push(signed32BitIntegerFor(-6 /* invalidArguments */))); } status = pathOoptoBuffermaxLen(fileName, cPathName, PATH_MAX); if (status != 0) { - return primitiveFailForOSError(status); + return (pop(3), + push(signed32BitIntegerFor(status))); } - status = fileToAttributeArraymaskarray(cPathName, attributeMask, (&attributeArray)); + status = fileToAttributeArraymaskarray(cPathName, attributeMask, &attributeArray); if (status != 0) { - primitiveFailForOSError(status); + pop(3); + push(signed32BitIntegerFor(status)); } else { - popthenPush(3, attributeArray); + pop(3); + push(attributeArray); } return 0; } @@ -1052,47 +975,28 @@ EXPORT(sqInt) primitiveFileExists(void) { sqInt accessFlag; - char cString[PATH_MAX]; - sqInt len; - sqInt mode; sqInt pathString; - char *sPtr; sqInt status; accessFlag = 0; pathString = stackObjectValue(0); if (!(isKindOf(pathString, "String"))) { - return primitiveFailFor(PrimErrBadArgument); + return (pop(2), + push(signed32BitIntegerFor(-6 /* invalidArguments */))); } - /* begin checkAccess:mode:to: */ - mode = F_OK; - - /* Note: The static sized string buffer is faster than using a Smalltalk allocated - string as the buffer, and is unlikely to fail in practice. In the event that - the buffer turns out to be too small, write an error message to stdout before - failing. */ - len = stSizeOf(pathString); - if (len >= PATH_MAX) { - status = -1 /* stringTooLong */; - goto l1; + status = checkAccessmodeto(pathString, fileOKFlag(), &accessFlag); + if (!(status == 0)) { + return (pop(2), + push(signed32BitIntegerFor(status))); } - sPtr = arrayValueOf(pathString); - if ((canStatFilePathlength(sPtr, len)) == 0) { - /* begin cantStatPath */ - status = -3; - goto l1; + if (accessFlag == 0) { + pop(2); + push(trueObject()); } - memcpy(cString, sPtr, len); - cString[len] = 0; - ((&accessFlag))[0] = (access(cString, mode)); - status = 0; - l1: /* end checkAccess:mode:to: */; - if (!(status == 0)) { - return primitiveFailForOSError(status); + else { + pop(2); + push(falseObject()); } - popthenPush(2, (accessFlag == 0 - ? trueObject() - : falseObject())); return 0; } @@ -1106,36 +1010,14 @@ primitiveFileMasks(void) sqInt masks; masks = instantiateClassindexableSize(classArray(), 8); - if (!(masks)) { - return primitiveFailFor(PrimErrNoMemory); - } - storePointerofObjectwithValue(0, masks, (BytesPerWord == 8 - ? positive64BitIntegerFor(S_IFMT) - : positive32BitIntegerFor(S_IFMT))); - -# if !(defined(_WIN32)) - storePointerofObjectwithValue(1, masks, (BytesPerWord == 8 - ? positive64BitIntegerFor(S_IFSOCK) - : positive32BitIntegerFor(S_IFSOCK))); - storePointerofObjectwithValue(2, masks, (BytesPerWord == 8 - ? positive64BitIntegerFor(S_IFLNK) - : positive32BitIntegerFor(S_IFLNK))); -# endif /* !(defined(_WIN32)) */ - storePointerofObjectwithValue(3, masks, (BytesPerWord == 8 - ? positive64BitIntegerFor(S_IFREG) - : positive32BitIntegerFor(S_IFREG))); - storePointerofObjectwithValue(4, masks, (BytesPerWord == 8 - ? positive64BitIntegerFor(S_IFBLK) - : positive32BitIntegerFor(S_IFBLK))); - storePointerofObjectwithValue(5, masks, (BytesPerWord == 8 - ? positive64BitIntegerFor(S_IFDIR) - : positive32BitIntegerFor(S_IFDIR))); - storePointerofObjectwithValue(6, masks, (BytesPerWord == 8 - ? positive64BitIntegerFor(S_IFCHR) - : positive32BitIntegerFor(S_IFCHR))); - storePointerofObjectwithValue(7, masks, (BytesPerWord == 8 - ? positive64BitIntegerFor(S_IFIFO) - : positive32BitIntegerFor(S_IFIFO))); + storePointerofObjectwithValue(0, masks, smallOrLargeIntegerObjectFor(S_IFMT)); + isDefinedTrueExpressioninSmalltalkcommentifTrueifFalse("defined(WIN32)", null, "windows doesn't have SOCK or SYMLINK file types", null, (storePointerofObjectwithValue(1, masks, smallOrLargeIntegerObjectFor(S_IFSOCK)), + storePointerofObjectwithValue(2, masks, smallOrLargeIntegerObjectFor(S_IFLNK)))); + storePointerofObjectwithValue(3, masks, smallOrLargeIntegerObjectFor(S_IFREG)); + storePointerofObjectwithValue(4, masks, smallOrLargeIntegerObjectFor(S_IFBLK)); + storePointerofObjectwithValue(5, masks, smallOrLargeIntegerObjectFor(S_IFDIR)); + storePointerofObjectwithValue(6, masks, smallOrLargeIntegerObjectFor(S_IFCHR)); + storePointerofObjectwithValue(7, masks, smallOrLargeIntegerObjectFor(S_IFIFO)); popthenPush(1, masks); return 0; } @@ -1147,17 +1029,13 @@ primitiveFileMasks(void) EXPORT(sqInt) primitiveLogicalDrives(void) { - unsigned int mask; + sqInt mask; - -# if defined(_WIN32) - mask = GetLogicalDrives(); - if (mask != 0) { - return popthenPush(1, positive32BitIntegerFor(mask)); - } -# endif /* defined(_WIN32) */ - primitiveFail(); - return 0; + isDefinedTrueExpressioninSmalltalkcommentifTrueifFalse("defined(WIN32)", null, "Answer the logical drive mask on windows", ((mask = GetLogicalDrives()), + (mask != 0 + ? return popthenPush(1, positive32BitIntegerFor(mask)) + : 0)), null); + return primitiveFail(); } @@ -1172,16 +1050,21 @@ primitiveOpendir(void) sqInt dirOop; int status; + dir = 0; dirName = stackObjectValue(0); if (!(isKindOf(dirName, "String"))) { - return primitiveFailFor(PrimErrBadArgument); + fprintf(stderr, "primitiveOpendir: invalid argument, expected a String\n"); + return (pop(2), + push(signed32BitIntegerFor(-6 /* invalidArguments */))); } - status = openDirectoryStreamptr(dirName, (&dir)); + status = openDirectoryStreamptr(dirName, &dir); if (status != 0) { - return primitiveFailForOSError(status); + return (pop(2), + push(signed32BitIntegerFor(status))); } dirOop = addressObjectFor(dir); - popthenPush(2, dirOop); + pop(2); + push(dirOop); return 0; } @@ -1192,12 +1075,12 @@ primitiveOpendir(void) EXPORT(sqInt) primitivePathMax(void) { - return popthenPush(1, integerObjectOf(PATH_MAX)); + return popthenPush(1, smallOrLargeIntegerObjectFor(PATH_MAX)); } /* Get the next entry in the directory stream. Answer the name of the entry, - or nil for the end of the directory stream. */ + or error for end of directory stream. */ /* FileAttributesPlugin>>#primitiveReaddir */ EXPORT(sqInt) @@ -1212,64 +1095,58 @@ primitiveReaddir(void) int haveEntry; sqInt resultArray; sqInt status; - sqInt val; attributeArray = 0; entryName = 0; - val = 0; - dirPointerOop = stackValue(0); + dirPointerOop = stackObjectValue(0); + if (!(isKindOf(dirPointerOop, "ByteArray"))) { + fprintf(stderr, "primitiveReaddir: invalid argument, expected an ByteArray\n"); + return (pop(2), + push(signed32BitIntegerFor(-6 /* invalidArguments */))); + } dirStream = pointerFrom(dirPointerOop); - if (!(dirStream)) { - return primitiveFailFor(PrimErrBadArgument); + if (dirStream == null) { + return (pop(2), + push(signed32BitIntegerFor(-6 /* invalidArguments */))); } haveEntry = 0; - do { - ent = readdir((dirStream->dp)); - if (ent == NULL || + do {; + ent = readdir(dirStream->dp); + if (ent == NULL || ((! (ent->d_name[0] == '.' && strlen(ent->d_name) == 1)) && strcmp(ent->d_name, ".."))) haveEntry = 1; - } while(haveEntry == 0); - if (!(ent)) { + } while (haveEntry == 0); + if (ent == null) { /* This is the normal case for the end of a directory stream, although it may indicate other error conditions for which errno would be updated. Assume the normal case here. */ - return popthenPush(2, nilObject()); + return (pop(2), + push(nilObject())); } - status = byteArrayFromCStringto((ent->d_name), (&entryName)); + status = byteArrayFromCStringto(ent->d_name, &entryName); if (status != 0) { - return primitiveFailForOSError(status); + return (pop(2), + push(signed32BitIntegerFor(status))); } - entry_len = strlen((ent->d_name)); - if ((((dirStream->path_len)) + entry_len) > (PATH_MAX - 1)) { - return primitiveFailForOSError(-1 /* stringTooLong */); + entry_len = strlen(ent->d_name); + if (((dirStream->path_len) + entry_len) > (PATH_MAX-1)) { + return (pop(2), + push(signed32BitIntegerFor(-1 /* stringTooLong */))); } - memcpy((dirStream->path_file), (ent->d_name), entry_len); - ((dirStream->path_file))[entry_len] = 0; + memcpy(dirStream->path_file, ent->d_name, entry_len); + dirStream->path_file[entry_len] = '\0'; /* If the stat() fails, still return the filename, just no attributes */ - status = fileToAttributeArraymaskarray((dirStream->path), 1, (&attributeArray)); + status = fileToAttributeArraymaskarray(dirStream->path, 1, &attributeArray); if (status != 0) { attributeArray = nilObject(); } - -#if SPURVM - resultArray = instantiateClassindexableSize(classArray(), 2); - -#else /* SPURVM */ - pushRemappableOop(entryName); - pushRemappableOop(attributeArray); resultArray = instantiateClassindexableSize(classArray(), 2); - attributeArray = popRemappableOop(); - entryName = popRemappableOop() -#endif /* SPURVM */ -; - if (!(resultArray)) { - return primitiveFailFor(PrimErrNoMemory); - } storePointerofObjectwithValue(0, resultArray, entryName); storePointerofObjectwithValue(1, resultArray, attributeArray); - popthenPush(2, resultArray); + pop(2); + push(resultArray); return 0; } @@ -1283,13 +1160,20 @@ primitiveRewinddir(void) sqInt dirPointerOop; osdir *dirStream; - dirPointerOop = stackValue(0); + dirPointerOop = stackObjectValue(0); + if (!(isKindOf(dirPointerOop, "ByteArray"))) { + fprintf(stderr, "primitiveRewindir: invalid argument, expected an ByteArray\n"); + return (pop(2), + push(signed32BitIntegerFor(-6 /* invalidArguments */))); + } dirStream = pointerFrom(dirPointerOop); - if (!(dirStream)) { - return primitiveFailFor(PrimErrBadArgument); + if (dirStream == null) { + return (pop(2), + push(signed32BitIntegerFor(-6 /* invalidArguments */))); } - rewinddir((dirStream->dp)); - popthenPush(2, dirPointerOop); + rewinddir(dirStream->dp); + pop(2); + push(dirPointerOop); return 0; } @@ -1300,7 +1184,7 @@ primitiveRewinddir(void) EXPORT(sqInt) primitiveVersionString(void) { - popthenPush(1, stringFromCString("1.2.6")); + popthenPush(1, stringFromCString(versionString())); return 0; } @@ -1312,34 +1196,28 @@ primitiveVersionString(void) static sqInt putLStatForintoBuffertargetName(char *cPathName, struct stat *statBufPointer, sqInt *fileNameOop) { - char cLinkName[PATH_MAX]; - sqInt len; + char *cLinkPtr = (char *) &cLinkName; + size_t len; + sqInt result; sqInt status; - -# if HAVE_LSTAT == 1 - status = lstat(cPathName, statBufPointer); - if (status != 0) { - /* begin cantStatPath */ - return -3; - } - if ((S_ISLNK((statBufPointer->st_mode))) == 0) { - fileNameOop[0] = (nilObject()); - } - else { - len = readLinkintomaxLength(cPathName, cLinkName, PATH_MAX); - if (len < 0) { - return len; - } - status = byteArrayFromCStringto(cLinkName, fileNameOop); - } -# else /* HAVE_LSTAT == 1 */ - - /* #HAVE_LSTAT = 1 */ - /* begin invalidRequest */ - status = -11; -# endif /* HAVE_LSTAT == 1 */ - return status; + isDefinedTrueExpressioninSmalltalkcommentifTrueifFalse("HAVE_LSTAT == 1", null, "Platforms which do not have lstat() should #define HAVE_LSTAT 0", ((result = lstat(cPathName, statBufPointer)), + (result != 0 + ? (/* begin cantStatPath */ + return -3) + : 0), + ((S_ISLNK(statBufPointer->st_mode)) == 0 + ? *fileNameOop = interpreterProxy->nilObject() + : ((len = readLinkintomaxLength(cPathName, cLinkPtr, PATH_MAX)), + (len < 0 + ? return len + : 0), + (status = byteArrayFromCStringto(cLinkPtr, fileNameOop)), + (status != 0 + ? return status + : 0)))), (/* begin invalidRequest */ + return -11)); + return 0; } @@ -1350,18 +1228,25 @@ putLStatForintoBuffertargetName(char *cPathName, struct stat *statBufPointer, sq static sqInt putStatForintoBuffertargetName(char *cPathName, struct stat *statBufPointer, sqInt *fileNameOop) { + sqInt result; sqInt status; - status = stat(cPathName, statBufPointer); - if (status != 0) { + +#ifdef WIN32 + TIME_ZONE_INFORMATION dtzi; + #endif; + result = stat(cPathName, statBufPointer); + if (result != 0) { /* begin cantStatPath */ return -3; } - -# if defined(_WIN32) - offsetStatBufTimesForWIN32(statBufPointer); -# endif /* defined(_WIN32) */ - fileNameOop[0] = (nilObject()); + isDefinedTrueExpressioninSmalltalkcommentifTrueifFalse("defined(WIN32)", null, "The windows version of stat() looks like it doesn't handle dst properly. Adjust for DST. Remove this code if ever switching to cygwin stat().", ((status = GetTimeZoneInformation(&dtzi)), + (status == 2 + ? (statBufPointer->st_atime -= 3600, + statBufPointer->st_mtime -= 3600, + statBufPointer->st_ctime -= 3600) + : 0)), null); + *fileNameOop = interpreterProxy->nilObject(); return 0; } @@ -1369,27 +1254,17 @@ putStatForintoBuffertargetName(char *cPathName, struct stat *statBufPointer, sqI /* Get the target filename of the supplied symbolic link. */ /* FileAttributesPlugin>>#readLink:into:maxLength: */ -static sqInt +static size_t readLinkintomaxLength(char *cPathName, char *cLinkPtr, size_t maxLength) { - sqInt len; - + size_t len; - /* len must be signed so that -1 can be communicated as an error. */ - len = -# if defined(_WIN32) - -1 -# else /* defined(_WIN32) */ - readlink(cPathName, cLinkPtr, maxLength) -# endif /* defined(_WIN32) */ - ; + len = 0; + isDefinedTrueExpressioninSmalltalkcommentifTrueifFalse("defined(WIN32)", null, "This should never be called on WIN32, just indicate failure", (len = -1), (len = readlink(cPathName, cLinkPtr, maxLength))); if (len < 0) { - -# if defined(INDEBUG) - fprintf(stderr, "FileAttributesPlugin: unable to readlink(): %d, errno=%d\n", len, errno); -# endif /* defined(INDEBUG) */ + fprintf(stderr, "FileAttributesPlugin: unable to readlink(): %d\n", len); /* begin cantReadlink */ - return -8; + return ((sqInt) -8); } cLinkPtr[len] = 0; return len; @@ -1414,28 +1289,25 @@ setInterpreter(struct VirtualMachine*anInterpreter) classArray = interpreterProxy->classArray; classByteArray = interpreterProxy->classByteArray; classString = interpreterProxy->classString; - failed = interpreterProxy->failed; falseObject = interpreterProxy->falseObject; instantiateClassindexableSize = interpreterProxy->instantiateClassindexableSize; integerObjectOf = interpreterProxy->integerObjectOf; ioLoadFunctionFrom = interpreterProxy->ioLoadFunctionFrom; isKindOf = interpreterProxy->isKindOf; + isBytes = interpreterProxy->isBytes; nilObject = interpreterProxy->nilObject; + pop = interpreterProxy->pop; popthenPush = interpreterProxy->popthenPush; - popRemappableOop = interpreterProxy->popRemappableOop; positive32BitIntegerFor = interpreterProxy->positive32BitIntegerFor; positive64BitIntegerFor = interpreterProxy->positive64BitIntegerFor; primitiveFail = interpreterProxy->primitiveFail; - primitiveFailFor = interpreterProxy->primitiveFailFor; - primitiveFailForOSError = interpreterProxy->primitiveFailForOSError; - pushRemappableOop = interpreterProxy->pushRemappableOop; + push = interpreterProxy->push; signed32BitIntegerFor = interpreterProxy->signed32BitIntegerFor; signed64BitIntegerFor = interpreterProxy->signed64BitIntegerFor; sizeOfSTArrayFromCPrimitive = interpreterProxy->sizeOfSTArrayFromCPrimitive; stSizeOf = interpreterProxy->stSizeOf; stackIntegerValue = interpreterProxy->stackIntegerValue; stackObjectValue = interpreterProxy->stackObjectValue; - stackValue = interpreterProxy->stackValue; storePointerofObjectwithValue = interpreterProxy->storePointerofObjectwithValue; trueObject = interpreterProxy->trueObject; #endif /* !defined(SQUEAK_BUILTIN_PLUGIN) */ @@ -1444,6 +1316,36 @@ setInterpreter(struct VirtualMachine*anInterpreter) } +/* Size of a C pointer on this machine */ + + /* FileAttributesPlugin>>#sizeOfPointer */ +static sqInt +sizeOfPointer(void) +{ + return sizeof(void *); +} + + +/* Answer an Integer object for aPositiveInteger. If the value is too large + to fit in an SmallInteger, then answer a LargePositiveInteger. Note that + smallIntegerMaxVal is a class variable with an initialization value + determined when this class is translated to C code; see my + #declareCVarsIn: class method. + */ + + /* FileAttributesPlugin>>#smallOrLargeIntegerObjectFor: */ +static sqInt +smallOrLargeIntegerObjectFor(sqInt aPositiveInteger) +{ + if (aPositiveInteger > smallIntegerMaxVal) { + return integerObjectOf(aPositiveInteger); + } + else { + return positive32BitIntegerFor(aPositiveInteger); + } +} + + /* Answer a file entry array from the supplied statBufPointer */ /* FileAttributesPlugin>>#statArrayFor:toArray:from:fileName: */ @@ -1451,53 +1353,79 @@ static sqInt statArrayFortoArrayfromfileName(char *cPathName, sqInt attributeArray, struct stat *statBufPointer, sqInt fileNameOop) { time_t creationDate; + sqInt index; sqInt sizeIfFile; sqInt status; - sqInt val; - - val = 0; - sizeIfFile = ((S_ISDIR((statBufPointer->st_mode))) == 0 - ? (statBufPointer->st_size) - : 0); - storePointerofObjectwithValue(0, attributeArray, fileNameOop); - storePointerofObjectwithValue(1, attributeArray, (BytesPerWord == 8 - ? positive64BitIntegerFor((statBufPointer->st_mode)) - : positive32BitIntegerFor((statBufPointer->st_mode)))); - storePointerofObjectwithValue(2, attributeArray, positive64BitIntegerFor((statBufPointer->st_ino))); - storePointerofObjectwithValue(3, attributeArray, positive64BitIntegerFor((statBufPointer->st_dev))); - storePointerofObjectwithValue(4, attributeArray, positive64BitIntegerFor((statBufPointer->st_nlink))); - storePointerofObjectwithValue(5, attributeArray, (BytesPerWord == 8 - ? positive64BitIntegerFor((statBufPointer->st_uid)) - : positive32BitIntegerFor((statBufPointer->st_uid)))); - storePointerofObjectwithValue(6, attributeArray, (BytesPerWord == 8 - ? positive64BitIntegerFor((statBufPointer->st_gid)) - : positive32BitIntegerFor((statBufPointer->st_gid)))); - storePointerofObjectwithValue(7, attributeArray, positive64BitIntegerFor(sizeIfFile)); - storePointerofObjectwithValue(8, attributeArray, ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor((statBufPointer->st_atime)) - : signed64BitIntegerFor((statBufPointer->st_atime)))); - storePointerofObjectwithValue(9, attributeArray, ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor((statBufPointer->st_mtime)) - : signed64BitIntegerFor((statBufPointer->st_mtime)))); - storePointerofObjectwithValue(10, attributeArray, ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor((statBufPointer->st_ctime)) - : signed64BitIntegerFor((statBufPointer->st_ctime)))); - -# if defined(_WIN32) - status = fileCreationTimeForlengthto(cPathName, strlen(cPathName), (&creationDate)); - storePointerofObjectwithValue(11, attributeArray, (status == 0 - ? (/* begin oopFromTimeT: */ - ((sizeof(time_t)) == 4 - ? signed32BitIntegerFor(creationDate) - : signed64BitIntegerFor(creationDate))) - : nilObject())); -# else /* defined(_WIN32) */ - storePointerofObjectwithValue(11, attributeArray, nilObject()); -# endif /* defined(_WIN32) */ + + if ((S_ISDIR(statBufPointer->st_mode)) == 0) { + sizeIfFile = statBufPointer->st_size; + } + else { + sizeIfFile = 0; + } + index = 0; + storePointerofObjectwithValue(index, attributeArray, fileNameOop); + + /* 1 */ + index += 1; + storePointerofObjectwithValue(index, attributeArray, smallOrLargeIntegerObjectFor(statBufPointer->st_mode)); + + /* 2 */ + index += 1; + storePointerofObjectwithValue(index, attributeArray, positive64BitIntegerFor(statBufPointer->st_ino)); + + /* 3 */ + index += 1; + storePointerofObjectwithValue(index, attributeArray, positive64BitIntegerFor(statBufPointer->st_dev)); + + /* 4 */ + index += 1; + storePointerofObjectwithValue(index, attributeArray, positive64BitIntegerFor(statBufPointer->st_nlink)); + + /* 5 */ + index += 1; + storePointerofObjectwithValue(index, attributeArray, smallOrLargeIntegerObjectFor(statBufPointer->st_uid)); + + /* 6 */ + index += 1; + storePointerofObjectwithValue(index, attributeArray, smallOrLargeIntegerObjectFor(statBufPointer->st_gid)); + + /* 7 */ + index += 1; + storePointerofObjectwithValue(index, attributeArray, smallOrLargeIntegerObjectFor(sizeIfFile)); + + /* 8 */ + index += 1; + storePointerofObjectwithValue(index, attributeArray, oopFromTimeT(statBufPointer->st_atime)); + + /* 9 */ + index += 1; + storePointerofObjectwithValue(index, attributeArray, oopFromTimeT(statBufPointer->st_mtime)); + + /* 10 */ + index += 1; + storePointerofObjectwithValue(index, attributeArray, oopFromTimeT(statBufPointer->st_ctime)); + + /* 11 */ + index += 1; + isDefinedTrueExpressioninSmalltalkcommentifTrueifFalse("defined(WIN32)", null, "windows supports creation date", ((status = fileCreationTimeForlengthto(cPathName, strlen(cPathName), &creationDate)), + (status == 0 + ? storePointerofObjectwithValue(index, attributeArray, oopFromTimeT(creationDate)) + : storePointerofObjectwithValue(index, attributeArray, nilObject()))), storePointerofObjectwithValue(index, attributeArray, nilObject())); return 0; } +/* A call to stat() failed */ + + /* FileAttributesPlugin>>#statFailed */ +static sqInt +statFailed(void) +{ + return -2; +} + + /* Answer a new String copied from a null-terminated C string. Caution: This may invoke the garbage collector. */ @@ -1510,21 +1438,60 @@ stringFromCString(const char *aCString) len = strlen(aCString); newString = instantiateClassindexableSize(classString(), len); - if (!(newString)) { - return primitiveFailFor(PrimErrNoMemory); - } strncpy(arrayValueOf(newString), aCString, len); return newString; } +/* String too long. A file path name was longer than PATH_MAX */ + + /* FileAttributesPlugin>>#stringTooLong */ +static sqInt +stringTooLong(void) +{ + return -1; +} + + /* FileAttributesPlugin>>#timeConversionFailed */ +static sqInt +timeConversionFailed(void) +{ + return -5; +} + + +/* Answer a string containing the version string for this plugin. */ + + /* FileAttributesPlugin>>#versionString */ +static char * +versionString(void) +{ + static char version[]= "1.0.0"; + + return version; +} + + +/* Answer a single element Array containing the supplied error code. */ + + /* FileAttributesPlugin>>#wrappedErrorCode: */ +static sqInt +wrappedErrorCode(sqInt aNumber) +{ + sqInt newArray; + + newArray = instantiateClassindexableSize(classArray(), 1); + storePointerofObjectwithValue(0, newArray, signed32BitIntegerFor(aNumber)); + return newArray; +} + + #ifdef SQUEAK_BUILTIN_PLUGIN static char _m[] = "FileAttributesPlugin"; void* FileAttributesPlugin_exports[][3] = { {(void*)_m, "checkAccessmodeto", (void*)checkAccessmodeto}, {(void*)_m, "getModuleName", (void*)getModuleName}, - {(void*)_m, "initialiseModule", (void*)initialiseModule}, {(void*)_m, "primitiveClosedir\000\001", (void*)primitiveClosedir}, {(void*)_m, "primitiveFileAttribute\000\001", (void*)primitiveFileAttribute}, {(void*)_m, "primitiveFileAttributes\000\001", (void*)primitiveFileAttributes}, diff --git a/src/plugins/FileCopyPlugin/FileCopyPlugin.c b/src/plugins/FileCopyPlugin/FileCopyPlugin.c index 8121aee63d..8ec070020e 100644 --- a/src/plugins/FileCopyPlugin/FileCopyPlugin.c +++ b/src/plugins/FileCopyPlugin/FileCopyPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-nice.1982 uuid: ed988fdd-7019-41f8-9051-e08afa837953 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - FileCopyPlugin VMMaker.oscog-nice.1982 uuid: ed988fdd-7019-41f8-9051-e08afa837953 + FileCopyPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "FileCopyPlugin VMMaker.oscog-nice.1982 uuid: ed988fdd-7019-41f8-9051-e08afa837953 " __DATE__ ; +static char __buildInfo[] = "FileCopyPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -64,9 +65,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "FileCopyPlugin VMMaker.oscog-nice.1982 (i)" + "FileCopyPlugin VMMaker.oscog-eem.2347 (i)" #else - "FileCopyPlugin VMMaker.oscog-nice.1982 (e)" + "FileCopyPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/FilePlugin/FilePlugin.c b/src/plugins/FilePlugin/FilePlugin.c index e042bea56b..2694f500ac 100644 --- a/src/plugins/FilePlugin/FilePlugin.c +++ b/src/plugins/FilePlugin/FilePlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator * VMMaker.oscog-akg.2341 uuid: d0fa56c5-cccb-41b4-b28d-4c54c9acdccf + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - FilePlugin * VMMaker.oscog-akg.2341 uuid: d0fa56c5-cccb-41b4-b28d-4c54c9acdccf + FilePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "FilePlugin * VMMaker.oscog-akg.2341 uuid: d0fa56c5-cccb-41b4-b28d-4c54c9acdccf " __DATE__ ; +static char __buildInfo[] = "FilePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -50,14 +51,14 @@ static char __buildInfo[] = "FilePlugin * VMMaker.oscog-akg.2341 uuid: d0fa56c5- #define PrimErrUnsupported 7 #define PrimNoErr 0 #if !defined(SPURVM) /* Allow this to be overridden on the compiler command line */ -# define SPURVM 0 +# define SPURVM 1 #endif /*** Function Prototypes ***/ static sqInt asciiDirectoryDelimiter(void); -EXPORT(sqInt) connectToFdwrite(int fd, sqInt writeFlag); -EXPORT(sqInt) connectToFilewrite(void *cfile, sqInt writeFlag); +static sqInt connectToFdwrite(int fd, sqInt writeFlag); +static sqInt connectToFilewrite(void *cfile, sqInt writeFlag); EXPORT(sqInt) fileOpenNamesizewritesecure(char *nameIndex, sqInt nameSize, sqInt writeFlag, sqInt secureFlag); EXPORT(sqInt) fileOpenNewNamesizesecure(char *nameIndex, sqInt nameSize, sqInt secureFlag); extern usqIntptr_t fileRecordSize(void); @@ -207,9 +208,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "FilePlugin * VMMaker.oscog-akg.2341 (i)" + "FilePlugin VMMaker.oscog-eem.2347 (i)" #else - "FilePlugin * VMMaker.oscog-akg.2341 (e)" + "FilePlugin VMMaker.oscog-eem.2347 (e)" #endif ; static void * sCCPfn; @@ -238,7 +239,7 @@ asciiDirectoryDelimiter(void) writeFlag must be compatible with the existing file access. */ /* FilePlugin>>#connectToFd:write: */ -EXPORT(sqInt) +static sqInt connectToFdwrite(int fd, sqInt writeFlag) { SQFile *file; @@ -265,7 +266,7 @@ connectToFdwrite(int fd, sqInt writeFlag) writeFlag must be compatible with the existing file access. */ /* FilePlugin>>#connectToFile:write: */ -EXPORT(sqInt) +static sqInt connectToFilewrite(void *cfile, sqInt writeFlag) { SQFile *file; @@ -608,8 +609,10 @@ pointerFrom(sqInt pointerByteArray) EXPORT(sqInt) primitiveConnectToFile(void) { - void* cfile; + void *cfile; sqInt cfileOop; + SQFile *file; + sqInt fileOop; sqInt filePointer; sqInt writeFlag; @@ -619,11 +622,25 @@ primitiveConnectToFile(void) if (!(cfile)) { return primitiveFailFor(PrimErrBadArgument); } - filePointer = connectToFilewrite(cfile, writeFlag); + /* begin connectToFile:write: */ + fileOop = instantiateClassindexableSize(classByteArray(), sizeof(SQFile)); + /* begin fileValueOf: */ + if (!((isBytes(fileOop)) + && ((byteSizeOf(fileOop)) == (sizeof(SQFile))))) { + primitiveFail(); + file = null; + goto l1; + } + file = firstIndexableField(fileOop); + l1: /* end fileValueOf: */; + if (!(failed())) { + sqConnectToFile(file, cfile, writeFlag); + } + filePointer = fileOop; if (!(failed())) { - return popthenPush(3, filePointer); + popthenPush(3, filePointer); } - return primitiveFail(); + return 0; } @@ -639,6 +656,8 @@ primitiveConnectToFileDescriptor(void) { int fd; sqInt fdPointer; + SQFile *file; + sqInt fileOop; sqInt filePointer; sqInt writeFlag; @@ -648,11 +667,25 @@ primitiveConnectToFileDescriptor(void) return primitiveFailFor(PrimErrBadArgument); } fd = integerValueOf(fdPointer); - filePointer = connectToFdwrite(fd, writeFlag); + /* begin connectToFd:write: */ + fileOop = instantiateClassindexableSize(classByteArray(), sizeof(SQFile)); + /* begin fileValueOf: */ + if (!((isBytes(fileOop)) + && ((byteSizeOf(fileOop)) == (sizeof(SQFile))))) { + primitiveFail(); + file = null; + goto l1; + } + file = firstIndexableField(fileOop); + l1: /* end fileValueOf: */; if (!(failed())) { - return popthenPush(3, filePointer); + sqConnectToFileDescriptor(file, fd, writeFlag); } - return primitiveFail(); + filePointer = fileOop; + if (!(failed())) { + popthenPush(3, filePointer); + } + return 0; } /* FilePlugin>>#primitiveDirectoryCreate */ @@ -1775,15 +1808,13 @@ shutdownModule(void) static char _m[] = "FilePlugin"; void* FilePlugin_exports[][3] = { - {(void*)_m, "connectToFdwrite", (void*)connectToFdwrite}, - {(void*)_m, "connectToFilewrite", (void*)connectToFilewrite}, {(void*)_m, "fileOpenNamesizewritesecure", (void*)fileOpenNamesizewritesecure}, {(void*)_m, "fileOpenNewNamesizesecure", (void*)fileOpenNewNamesizesecure}, {(void*)_m, "getModuleName", (void*)getModuleName}, {(void*)_m, "getThisSession\000\377", (void*)getThisSession}, {(void*)_m, "initialiseModule", (void*)initialiseModule}, {(void*)_m, "moduleUnloaded", (void*)moduleUnloaded}, - {(void*)_m, "primitiveConnectToFile\000\002", (void*)primitiveConnectToFile}, + {(void*)_m, "primitiveConnectToFile\000\001", (void*)primitiveConnectToFile}, {(void*)_m, "primitiveConnectToFileDescriptor\000\000", (void*)primitiveConnectToFileDescriptor}, {(void*)_m, "primitiveDirectoryCreate\000\001", (void*)primitiveDirectoryCreate}, {(void*)_m, "primitiveDirectoryDelete\000\001", (void*)primitiveDirectoryDelete}, @@ -1817,7 +1848,7 @@ void* FilePlugin_exports[][3] = { #else /* ifdef SQ_BUILTIN_PLUGIN */ -signed char primitiveConnectToFileAccessorDepth = 2; +signed char primitiveConnectToFileAccessorDepth = 1; signed char primitiveConnectToFileDescriptorAccessorDepth = 0; signed char primitiveDirectoryCreateAccessorDepth = 1; signed char primitiveDirectoryDeleteAccessorDepth = 1; diff --git a/src/plugins/FloatArrayPlugin/FloatArrayPlugin.c b/src/plugins/FloatArrayPlugin/FloatArrayPlugin.c index c8528e04f7..fa846082e7 100644 --- a/src/plugins/FloatArrayPlugin/FloatArrayPlugin.c +++ b/src/plugins/FloatArrayPlugin/FloatArrayPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - FloatArrayPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + FloatArrayPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "FloatArrayPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "FloatArrayPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -106,9 +107,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "FloatArrayPlugin VMMaker.oscog-eem.2309 (i)" + "FloatArrayPlugin VMMaker.oscog-eem.2347 (i)" #else - "FloatArrayPlugin VMMaker.oscog-eem.2309 (e)" + "FloatArrayPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/FloatMathPlugin/FloatMathPlugin.c b/src/plugins/FloatMathPlugin/FloatMathPlugin.c index 6e34a59937..f99691a9be 100644 --- a/src/plugins/FloatMathPlugin/FloatMathPlugin.c +++ b/src/plugins/FloatMathPlugin/FloatMathPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - FloatMathPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + FloatMathPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "FloatMathPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "FloatMathPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -89,9 +90,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "FloatMathPlugin VMMaker.oscog-eem.2309 (i)" + "FloatMathPlugin VMMaker.oscog-eem.2347 (i)" #else - "FloatMathPlugin VMMaker.oscog-eem.2309 (e)" + "FloatMathPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/GdbARMPlugin/GdbARMPlugin.c b/src/plugins/GdbARMPlugin/GdbARMPlugin.c index cb4294fba7..6b1d7f02e5 100644 --- a/src/plugins/GdbARMPlugin/GdbARMPlugin.c +++ b/src/plugins/GdbARMPlugin/GdbARMPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - GdbARMPlugin Cog-eem.344 uuid: 57f1233e-14ba-4fa9-a5da-818ec53d837c + GdbARMPlugin Cog-eem.346 uuid: 73f848ee-01d3-4d2f-b5be-d869a12f7421 */ -static char __buildInfo[] = "GdbARMPlugin Cog-eem.344 uuid: 57f1233e-14ba-4fa9-a5da-818ec53d837c " __DATE__ ; +static char __buildInfo[] = "GdbARMPlugin Cog-eem.346 uuid: 73f848ee-01d3-4d2f-b5be-d869a12f7421 " __DATE__ ; +#include "config.h" #include #include #include @@ -114,9 +115,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "GdbARMPlugin Cog-eem.344 (i)" + "GdbARMPlugin Cog-eem.346 (i)" #else - "GdbARMPlugin Cog-eem.344 (e)" + "GdbARMPlugin Cog-eem.346 (e)" #endif ; diff --git a/src/plugins/GeniePlugin/GeniePlugin.c b/src/plugins/GeniePlugin/GeniePlugin.c index 498033532a..7a73133277 100644 --- a/src/plugins/GeniePlugin/GeniePlugin.c +++ b/src/plugins/GeniePlugin/GeniePlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - GeniePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + GeniePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "GeniePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "GeniePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -76,9 +77,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "GeniePlugin v2.0 5 January 2018 VMMaker.oscog-eem.2309 (i)" + "GeniePlugin v2.0 7 March 2018 VMMaker.oscog-eem.2347 (i)" #else - "GeniePlugin v2.0 5 January 2018 VMMaker.oscog-eem.2309 (e)" + "GeniePlugin v2.0 7 March 2018 VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/HostWindowPlugin/HostWindowPlugin.c b/src/plugins/HostWindowPlugin/HostWindowPlugin.c index 60845bf2fe..537a771d08 100644 --- a/src/plugins/HostWindowPlugin/HostWindowPlugin.c +++ b/src/plugins/HostWindowPlugin/HostWindowPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - HostWindowPlugin VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + HostWindowPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "HostWindowPlugin VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 " __DATE__ ; +static char __buildInfo[] = "HostWindowPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -115,9 +116,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "HostWindowPlugin VMMaker.oscog-eem.2285 (i)" + "HostWindowPlugin VMMaker.oscog-eem.2347 (i)" #else - "HostWindowPlugin VMMaker.oscog-eem.2285 (e)" + "HostWindowPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/IA32ABI/IA32ABI.c b/src/plugins/IA32ABI/IA32ABI.c index 5a3f9e4b9f..8fc4f0f53c 100644 --- a/src/plugins/IA32ABI/IA32ABI.c +++ b/src/plugins/IA32ABI/IA32ABI.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - IA32ABIPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + IA32ABIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "IA32ABIPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "IA32ABIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -265,9 +266,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "IA32ABI VMMaker.oscog-eem.2309 (i)" + "IA32ABI VMMaker.oscog-eem.2347 (i)" #else - "IA32ABI VMMaker.oscog-eem.2309 (e)" + "IA32ABI VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/ImmX11Plugin/ImmX11Plugin.c b/src/plugins/ImmX11Plugin/ImmX11Plugin.c index c9f6362644..127ed295cf 100644 --- a/src/plugins/ImmX11Plugin/ImmX11Plugin.c +++ b/src/plugins/ImmX11Plugin/ImmX11Plugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-dtl.2311 uuid: c13d1e0b-fb1a-453d-9786-c93d33f42e00 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - ImmX11Plugin VMMaker.oscog-dtl.2311 uuid: c13d1e0b-fb1a-453d-9786-c93d33f42e00 + ImmX11Plugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "ImmX11Plugin VMMaker.oscog-dtl.2311 uuid: c13d1e0b-fb1a-453d-9786-c93d33f42e00 " __DATE__ ; +static char __buildInfo[] = "ImmX11Plugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -103,9 +104,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "ImmX11Plugin VMMaker.oscog-dtl.2311 (i)" + "ImmX11Plugin VMMaker.oscog-eem.2347 (i)" #else - "ImmX11Plugin VMMaker.oscog-dtl.2311 (e)" + "ImmX11Plugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/InternetConfigPlugin/InternetConfigPlugin.c b/src/plugins/InternetConfigPlugin/InternetConfigPlugin.c index 62035ab215..808702e07d 100644 --- a/src/plugins/InternetConfigPlugin/InternetConfigPlugin.c +++ b/src/plugins/InternetConfigPlugin/InternetConfigPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-nice.1982 uuid: ed988fdd-7019-41f8-9051-e08afa837953 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - InternetConfigPlugin VMMaker.oscog-nice.1982 uuid: ed988fdd-7019-41f8-9051-e08afa837953 + InternetConfigPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "InternetConfigPlugin VMMaker.oscog-nice.1982 uuid: ed988fdd-7019-41f8-9051-e08afa837953 " __DATE__ ; +static char __buildInfo[] = "InternetConfigPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -70,9 +71,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "InternetConfigPlugin VMMaker.oscog-nice.1982 (i)" + "InternetConfigPlugin VMMaker.oscog-eem.2347 (i)" #else - "InternetConfigPlugin VMMaker.oscog-nice.1982 (e)" + "InternetConfigPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/JPEGReadWriter2Plugin/JPEGReadWriter2Plugin.c b/src/plugins/JPEGReadWriter2Plugin/JPEGReadWriter2Plugin.c index e8ad517b29..6ee98b8251 100644 --- a/src/plugins/JPEGReadWriter2Plugin/JPEGReadWriter2Plugin.c +++ b/src/plugins/JPEGReadWriter2Plugin/JPEGReadWriter2Plugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - JPEGReadWriter2Plugin VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + JPEGReadWriter2Plugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "JPEGReadWriter2Plugin VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 " __DATE__ ; +static char __buildInfo[] = "JPEGReadWriter2Plugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -97,9 +98,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "JPEGReadWriter2Plugin VMMaker.oscog-eem.2285 (i)" + "JPEGReadWriter2Plugin VMMaker.oscog-eem.2347 (i)" #else - "JPEGReadWriter2Plugin VMMaker.oscog-eem.2285 (e)" + "JPEGReadWriter2Plugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/JPEGReaderPlugin/JPEGReaderPlugin.c b/src/plugins/JPEGReaderPlugin/JPEGReaderPlugin.c index c8ca8ba7d1..7d8eef3c68 100644 --- a/src/plugins/JPEGReaderPlugin/JPEGReaderPlugin.c +++ b/src/plugins/JPEGReaderPlugin/JPEGReaderPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - JPEGReaderPlugin VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 + JPEGReaderPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "JPEGReaderPlugin VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 " __DATE__ ; +static char __buildInfo[] = "JPEGReaderPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -169,9 +170,9 @@ static sqInt jsPosition; static sqInt jsReadLimit; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "JPEGReaderPlugin VMMaker.oscog-eem.2293 (i)" + "JPEGReaderPlugin VMMaker.oscog-eem.2347 (i)" #else - "JPEGReaderPlugin VMMaker.oscog-eem.2293 (e)" + "JPEGReaderPlugin VMMaker.oscog-eem.2347 (e)" #endif ; static int *residuals; diff --git a/src/plugins/JoystickTabletPlugin/JoystickTabletPlugin.c b/src/plugins/JoystickTabletPlugin/JoystickTabletPlugin.c index 0d1735cb2c..7058484a74 100644 --- a/src/plugins/JoystickTabletPlugin/JoystickTabletPlugin.c +++ b/src/plugins/JoystickTabletPlugin/JoystickTabletPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - JoystickTabletPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + JoystickTabletPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "JoystickTabletPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 " __DATE__ ; +static char __buildInfo[] = "JoystickTabletPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -69,9 +70,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "JoystickTabletPlugin VMMaker.oscog-eem.1975 (i)" + "JoystickTabletPlugin VMMaker.oscog-eem.2347 (i)" #else - "JoystickTabletPlugin VMMaker.oscog-eem.1975 (e)" + "JoystickTabletPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/Klatt/Klatt.c b/src/plugins/Klatt/Klatt.c index 8267b97c5a..50318e6fd2 100644 --- a/src/plugins/Klatt/Klatt.c +++ b/src/plugins/Klatt/Klatt.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - KlattSynthesizerPlugin VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 + KlattSynthesizerPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "KlattSynthesizerPlugin VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 " __DATE__ ; +static char __buildInfo[] = "KlattSynthesizerPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -207,9 +208,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "Klatt VMMaker.oscog-eem.2293 (i)" + "Klatt VMMaker.oscog-eem.2347 (i)" #else - "Klatt VMMaker.oscog-eem.2293 (e)" + "Klatt VMMaker.oscog-eem.2347 (e)" #endif ; static float nlast; diff --git a/src/plugins/LargeIntegers/LargeIntegers.c b/src/plugins/LargeIntegers/LargeIntegers.c index b3c70bedd4..0c99b2234a 100644 --- a/src/plugins/LargeIntegers/LargeIntegers.c +++ b/src/plugins/LargeIntegers/LargeIntegers.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - LargeIntegersPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + LargeIntegersPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "LargeIntegersPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "LargeIntegersPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -185,9 +186,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "LargeIntegers v2.0 VMMaker.oscog-eem.2309 (i)" + "LargeIntegers v2.0 VMMaker.oscog-eem.2347 (i)" #else - "LargeIntegers v2.0 VMMaker.oscog-eem.2309 (e)" + "LargeIntegers v2.0 VMMaker.oscog-eem.2347 (e)" #endif ; static const int orOpIndex = 1; @@ -226,7 +227,7 @@ anyBitOfLargeIntfromto(sqInt anOop, sqInt start, sqInt stopArg) lastDigitIx = ((stop - 1) / 32) + 1; /* Note asUnsignedLong required to avoid ULLL suffix bug */ - firstMask = ((usqInt)((((unsigned long)0xFFFFFFFFU))) << ((start - 1) & 0x1F)); + firstMask = (((unsigned long)0xFFFFFFFFU)) << ((start - 1) & 0x1F); lastMask = ((usqInt) 0xFFFFFFFFU) >> (0x1F - ((stop - 1) & 0x1F)); if (firstDigitIx == lastDigitIx) { /* begin cDigitOf:at: */ diff --git a/src/plugins/LocalePlugin/LocalePlugin.c b/src/plugins/LocalePlugin/LocalePlugin.c index 4849df3e3d..11b6ea3534 100644 --- a/src/plugins/LocalePlugin/LocalePlugin.c +++ b/src/plugins/LocalePlugin/LocalePlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2064 uuid: 732488bd-fbde-43e8-b942-4ca3e05e53a6 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - LocalePlugin VMMaker.oscog-eem.2064 uuid: 732488bd-fbde-43e8-b942-4ca3e05e53a6 + LocalePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "LocalePlugin VMMaker.oscog-eem.2064 uuid: 732488bd-fbde-43e8-b942-4ca3e05e53a6 " __DATE__ ; +static char __buildInfo[] = "LocalePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -78,9 +79,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "LocalePlugin VMMaker.oscog-eem.2064 (i)" + "LocalePlugin VMMaker.oscog-eem.2347 (i)" #else - "LocalePlugin VMMaker.oscog-eem.2064 (e)" + "LocalePlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/MD5Plugin/MD5Plugin.c b/src/plugins/MD5Plugin/MD5Plugin.c index 7785eb14ee..10554b0be5 100644 --- a/src/plugins/MD5Plugin/MD5Plugin.c +++ b/src/plugins/MD5Plugin/MD5Plugin.c @@ -1,5 +1,5 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from MD5Plugin CryptographyPlugins-eem.12 uuid: 2945c878-6a44-4c6a-8374-b56aa6175d0f */ @@ -7,6 +7,7 @@ static char __buildInfo[] = "MD5Plugin CryptographyPlugins-eem.12 uuid: 2945c878 +#include "config.h" #include #include #include diff --git a/src/plugins/MIDIPlugin/MIDIPlugin.c b/src/plugins/MIDIPlugin/MIDIPlugin.c index b7744db7a9..d69d22559b 100644 --- a/src/plugins/MIDIPlugin/MIDIPlugin.c +++ b/src/plugins/MIDIPlugin/MIDIPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2064 uuid: 732488bd-fbde-43e8-b942-4ca3e05e53a6 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - MIDIPlugin VMMaker.oscog-eem.2064 uuid: 732488bd-fbde-43e8-b942-4ca3e05e53a6 + MIDIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "MIDIPlugin VMMaker.oscog-eem.2064 uuid: 732488bd-fbde-43e8-b942-4ca3e05e53a6 " __DATE__ ; +static char __buildInfo[] = "MIDIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -87,9 +88,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "MIDIPlugin VMMaker.oscog-eem.2064 (i)" + "MIDIPlugin VMMaker.oscog-eem.2347 (i)" #else - "MIDIPlugin VMMaker.oscog-eem.2064 (e)" + "MIDIPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/MacMenubarPlugin/MacMenubarPlugin.c b/src/plugins/MacMenubarPlugin/MacMenubarPlugin.c index b919c5f9a3..9e752f8795 100644 --- a/src/plugins/MacMenubarPlugin/MacMenubarPlugin.c +++ b/src/plugins/MacMenubarPlugin/MacMenubarPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - MacMenubarPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + MacMenubarPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "MacMenubarPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "MacMenubarPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -141,9 +142,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "MacMenubarPlugin VMMaker.oscog-eem.2309 (i)" + "MacMenubarPlugin VMMaker.oscog-eem.2347 (i)" #else - "MacMenubarPlugin VMMaker.oscog-eem.2309 (e)" + "MacMenubarPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/Matrix2x3Plugin/Matrix2x3Plugin.c b/src/plugins/Matrix2x3Plugin/Matrix2x3Plugin.c index af6c468756..d4a69fe4a4 100644 --- a/src/plugins/Matrix2x3Plugin/Matrix2x3Plugin.c +++ b/src/plugins/Matrix2x3Plugin/Matrix2x3Plugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - Matrix2x3Plugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + Matrix2x3Plugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "Matrix2x3Plugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "Matrix2x3Plugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -109,9 +110,9 @@ static double m23ResultX; static double m23ResultY; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "Matrix2x3Plugin VMMaker.oscog-eem.2309 (i)" + "Matrix2x3Plugin VMMaker.oscog-eem.2347 (i)" #else - "Matrix2x3Plugin VMMaker.oscog-eem.2309 (e)" + "Matrix2x3Plugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/MiscPrimitivePlugin/MiscPrimitivePlugin.c b/src/plugins/MiscPrimitivePlugin/MiscPrimitivePlugin.c index 4c50771498..8b9c10241e 100644 --- a/src/plugins/MiscPrimitivePlugin/MiscPrimitivePlugin.c +++ b/src/plugins/MiscPrimitivePlugin/MiscPrimitivePlugin.c @@ -1,20 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - MiscPrimitivePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 - Bitmap Graphics-tpr.391 uuid: 0154dd33-d625-485c-8afa-502ffb8ce24b - ByteArray Collections-eem.779 uuid: 36376941-8dc4-4b3c-8935-f2839a6321c1 - ByteString Collections-eem.779 uuid: 36376941-8dc4-4b3c-8935-f2839a6321c1 - SampledSound Sound-pre.64 uuid: 1e82fad7-2c1d-ea42-9b55-cfa86185e99b + MiscPrimitivePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "MiscPrimitivePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10\n\ -Bitmap Graphics-tpr.391 uuid: 0154dd33-d625-485c-8afa-502ffb8ce24b\n\ -ByteArray Collections-eem.779 uuid: 36376941-8dc4-4b3c-8935-f2839a6321c1\n\ -ByteString Collections-eem.779 uuid: 36376941-8dc4-4b3c-8935-f2839a6321c1\n\ -SampledSound Sound-pre.64 uuid: 1e82fad7-2c1d-ea42-9b55-cfa86185e99b " __DATE__ ; +static char __buildInfo[] = "MiscPrimitivePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -40,9 +33,11 @@ SampledSound Sound-pre.64 uuid: 1e82fad7-2c1d-ea42-9b55-cfa86185e99b " __DATE__ #include "sqMemoryAccess.h" +/*** Constants ***/ +#define PrimErrNoModification 8 + + /*** Function Prototypes ***/ -static sqInt encodeBytesOfinat(sqInt anInt, unsigned char *ba, sqInt i); -static sqInt encodeIntinat(sqInt anInt, unsigned char *ba, sqInt i); EXPORT(const char*) getModuleName(void); EXPORT(sqInt) primitiveCompareString(void); EXPORT(sqInt) primitiveCompressToByteArray(void); @@ -60,21 +55,47 @@ EXPORT(sqInt) setInterpreter(struct VirtualMachine*anInterpreter); #if !defined(SQUEAK_BUILTIN_PLUGIN) static void * (*arrayValueOf)(sqInt oop); +static sqInt (*byteSizeOf)(sqInt oop); static sqInt (*failed)(void); +static void * (*firstIndexableField)(sqInt oop); +static sqInt (*integerObjectOf)(sqInt value); +static sqInt (*integerValueOf)(sqInt oop); static sqInt (*isBytes)(sqInt oop); +static sqInt (*isIntegerObject)(sqInt objectPointer); +#if IMMUTABILITY +static sqInt (*isOopImmutable)(sqInt oop); +#endif /* IMMUTABILITY */ +static sqInt (*methodArgumentCount)(void); +static sqInt (*methodReturnValue)(sqInt oop); static sqInt (*pop)(sqInt nItems); static sqInt (*primitiveFail)(void); -static sqInt (*pushInteger)(sqInt integerValue); +static sqInt (*primitiveFailFor)(sqInt reasonCode); static sqInt (*sizeOfSTArrayFromCPrimitive)(void *cPtr); static sqInt (*stackIntegerValue)(sqInt offset); static sqInt (*stackValue)(sqInt offset); #else /* !defined(SQUEAK_BUILTIN_PLUGIN) */ extern void * arrayValueOf(sqInt oop); +extern sqInt byteSizeOf(sqInt oop); extern sqInt failed(void); +extern void * firstIndexableField(sqInt oop); +extern sqInt integerObjectOf(sqInt value); +extern sqInt integerValueOf(sqInt oop); extern sqInt isBytes(sqInt oop); +#if !defined(isIntegerObject) +extern sqInt isIntegerObject(sqInt objectPointer); +#endif +#if IMMUTABILITY +#if IMMUTABILITY +extern sqInt isOopImmutable(sqInt oop); +#endif /* IMMUTABILITY */ +#else +# define isOopImmutable(oop) 0 +#endif +extern sqInt methodArgumentCount(void); +extern sqInt methodReturnValue(sqInt oop); extern sqInt pop(sqInt nItems); extern sqInt primitiveFail(void); -extern sqInt pushInteger(sqInt integerValue); +extern sqInt primitiveFailFor(sqInt reasonCode); extern sqInt sizeOfSTArrayFromCPrimitive(void *cPtr); extern sqInt stackIntegerValue(sqInt offset); extern sqInt stackValue(sqInt offset); @@ -83,64 +104,13 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "MiscPrimitivePlugin VMMaker.oscog-eem.2309 (i)" + "MiscPrimitivePlugin VMMaker.oscog-eem.2347 (i)" #else - "MiscPrimitivePlugin VMMaker.oscog-eem.2309 (e)" + "MiscPrimitivePlugin VMMaker.oscog-eem.2347 (e)" #endif ; -/*** Macros ***/ -#define asciiValue(aCharacter) aCharacter - - - -/* Copy the integer anInt into byteArray ba at index i, and return the next - index - */ - - /* Bitmap>>#encodeBytesOf:in:at: */ -static sqInt -encodeBytesOfinat(sqInt anInt, unsigned char *ba, sqInt i) -{ - sqInt j; - - for (j = 0; j <= 3; j += 1) { - ba[i + j] = ((((usqInt) anInt) >> ((3 - j) * 8)) & 0xFF); - } - return i + 4; -} - - -/* Encode the integer anInt in byteArray ba at index i, and return the next - index. The encoding is as follows... - 0-223 0-223 - 224-254 (0-30)*256 + next byte (0-7935) - 255 next 4 bytes */ - - /* Bitmap>>#encodeInt:in:at: */ -static sqInt -encodeIntinat(sqInt anInt, unsigned char *ba, sqInt i) -{ - sqInt j; - - if (anInt <= 223) { - ba[i] = anInt; - return i + 1; - } - if (anInt <= 7935) { - ba[i] = ((anInt / 256) + 224); - ba[i + 1] = (anInt % 256); - return i + 2; - } - ba[i] = 0xFF; - /* begin encodeBytesOf:in:at: */ - for (j = 0; j <= 3; j += 1) { - ba[(i + 1) + j] = ((((usqInt) anInt) >> ((3 - j) * 8)) & 0xFF); - } - return (i + 1) + 4; -} - /* Note: This is hardcoded so it can be run from Squeak. The module name is used for validating a module *after* @@ -155,11 +125,9 @@ getModuleName(void) } -/* Return 1, 2 or 3, if string1 is <, =, or > string2, with the collating - order of characters given by the order array. - */ +/* ByteString (class) compare: string1 with: string2 collated: order */ - /* ByteString class>>#primitiveCompareString */ + /* MiscPrimitivePlugin>>#primitiveCompareString */ EXPORT(sqInt) primitiveCompareString(void) { @@ -169,97 +137,40 @@ primitiveCompareString(void) sqInt len1; sqInt len2; unsigned char *order; - sqInt rcvr; unsigned char *string1; unsigned char *string2; - rcvr = stackValue(3); - if (!(isBytes(stackValue(2)))) { + if (!((isBytes(stackValue(0))) + && ((isBytes(stackValue(1))) + && (isBytes(stackValue(2)))))) { return primitiveFail(); } - string1 = arrayValueOf(stackValue(2)); - string1 -= 1; - if (!(isBytes(stackValue(1)))) { - return primitiveFail(); - } - string2 = arrayValueOf(stackValue(1)); - string2 -= 1; - if (!(isBytes(stackValue(0)))) { - return primitiveFail(); - } - order = arrayValueOf(stackValue(0)); - order -= 1; - if (failed()) { - return null; - } - len1 = sizeOfSTArrayFromCPrimitive(string1 + 1); - len2 = sizeOfSTArrayFromCPrimitive(string2 + 1); - for (i = 1; i <= (((len1 < len2) ? len1 : len2)); i += 1) { - c1 = order[(string1[i]) + 1]; - c2 = order[(string2[i]) + 1]; + string1 = firstIndexableField(stackValue(2)); + string2 = firstIndexableField(stackValue(1)); + order = firstIndexableField(stackValue(0)); + len1 = sizeOfSTArrayFromCPrimitive(string1); + len2 = sizeOfSTArrayFromCPrimitive(string2); + for (i = 0; i < (((len1 < len2) ? len1 : len2)); i += 1) { + c1 = order[string1[i]]; + c2 = order[string2[i]]; if (!(c1 == c2)) { - if (c1 < c2) { - if (failed()) { - return null; - } - pop(4); - pushInteger(1); - return null; - } - else { - if (failed()) { - return null; - } - pop(4); - pushInteger(3); - return null; - } - } - } - if (len1 == len2) { - if (failed()) { - return null; + return methodReturnValue(integerObjectOf((c1 < c2 + ? 1 + : 3))); } - pop(4); - pushInteger(2); - return null; - } - if (len1 < len2) { - if (failed()) { - return null; - } - pop(4); - pushInteger(1); - return null; - } - else { - if (failed()) { - return null; - } - pop(4); - pushInteger(3); - return null; } + methodReturnValue(integerObjectOf((len1 == len2 + ? 2 + : (len1 < len2 + ? 1 + : 3)))); + return 0; } -/* Store a run-coded compression of the receiver into the byteArray ba, - and return the last index stored into. ba is assumed to be large enough. - The encoding is as follows... - S {N D}*. - S is the size of the original bitmap, followed by run-coded pairs. - N is a run-length * 4 + data code. - D, the data, depends on the data code... - 0 skip N words, D is absent - 1 N words with all 4 bytes = D (1 byte) - 2 N words all = D (4 bytes) - 3 N words follow in D (4N bytes) - S and N are encoded as follows... - 0-223 0-223 - 224-254 (0-30)*256 + next byte (0-7935) - 255 next 4 bytes */ - - /* Bitmap>>#primitiveCompressToByteArray */ +/* Bitmap compress: bm toByteArray: ba */ + + /* MiscPrimitivePlugin>>#primitiveCompressToByteArray */ EXPORT(sqInt) primitiveCompressToByteArray(void) { @@ -278,59 +189,54 @@ primitiveCompressToByteArray(void) sqInt k; int lowByte; sqInt m; - sqInt rcvr; sqInt size; int word; - rcvr = stackValue(2); bm = arrayValueOf(stackValue(1)); - bm -= 1; + if (failed()) { + return null; + } if (!(isBytes(stackValue(0)))) { return primitiveFail(); } - ba = arrayValueOf(stackValue(0)); - ba -= 1; - if (failed()) { - return null; + if (isOopImmutable(stackValue(0))) { + return primitiveFailFor(PrimErrNoModification); } - size = sizeOfSTArrayFromCPrimitive(bm + 1); + ba = firstIndexableField(stackValue(0)); + size = sizeOfSTArrayFromCPrimitive(bm); /* begin encodeInt:in:at: */ if (size <= 223) { - ba[1] = size; - i = 1 + 1; + ba[0] = size; + i = 0 + 1; goto l7; } if (size <= 7935) { - ba[1] = ((size / 256) + 224); - ba[1 + 1] = (size % 256); - i = 1 + 2; + ba[0] = ((size / 256) + 224); + ba[0 + 1] = (size % 256); + i = 0 + 2; goto l7; } - ba[1] = 0xFF; + ba[0] = 0xFF; /* begin encodeBytesOf:in:at: */ for (j7 = 0; j7 <= 3; j7 += 1) { - ba[(1 + 1) + j7] = ((((usqInt) size) >> ((3 - j7) * 8)) & 0xFF); + ba[(0 + 1) + j7] = ((((usqInt) size) >> ((3 - j7) * 8)) & 0xFF); } - i = (1 + 1) + 4; + i = (0 + 1) + 4; l7: /* end encodeInt:in:at: */; - k = 1; - while (k <= size) { + k = 0; + while (k < size) { word = bm[k]; lowByte = word & 0xFF; eqBytes = (((((usqInt) word) >> 8) & 0xFF) == lowByte) && ((((((usqInt) word) >> 16) & 0xFF) == lowByte) && (((((usqInt) word) >> 24) & 0xFF) == lowByte)); j = k; - while ((j < size) + while (((j + 1) < size) && (word == (bm[j + 1]))) { j += 1; } if (j > k) { - - /* We have two or more = words, ending at j */ if (eqBytes) { - - /* Actually words of = bytes */ /* begin encodeInt:in:at: */ if (((((j - k) + 1) * 4) + 1) <= 223) { ba[i] = ((((j - k) + 1) * 4) + 1); @@ -382,11 +288,7 @@ primitiveCompressToByteArray(void) k = j + 1; } else { - - /* Check for word of 4 = bytes */ if (eqBytes) { - - /* Note 1 word of 4 = bytes */ /* begin encodeInt:in:at: */ if (((1 * 4) + 1) <= 223) { ba[i] = ((1 * 4) + 1); @@ -411,13 +313,11 @@ primitiveCompressToByteArray(void) k += 1; } else { - - /* Finally, check for junk */ - while ((j < size) + while (((j + 1) < size) && ((bm[j]) != (bm[j + 1]))) { j += 1; } - if (j == size) { + if ((j + 1) == size) { j += 1; } /* begin encodeInt:in:at: */ @@ -450,76 +350,54 @@ primitiveCompressToByteArray(void) } } } - if (failed()) { - return null; - } - pop(3); - pushInteger(i - 1); - return null; + methodReturnValue(integerObjectOf(i)); + return 0; } -/* Copy the contents of the given array of signed 8-bit samples into the - given array of 16-bit signed samples. +/* SampledSound (class) convert8bitSignedFrom: aByteArray to16Bit: + aSoundBuffer */ - /* SampledSound class>>#primitiveConvert8BitSigned */ + /* MiscPrimitivePlugin>>#primitiveConvert8BitSigned */ EXPORT(sqInt) primitiveConvert8BitSigned(void) { unsigned char *aByteArray; + sqInt arraySize; unsigned short *aSoundBuffer; sqInt i; - sqInt n; - sqInt rcvr; unsigned char s; - rcvr = stackValue(2); if (!(isBytes(stackValue(1)))) { return primitiveFail(); } - aByteArray = arrayValueOf(stackValue(1)); - aByteArray -= 1; + aByteArray = firstIndexableField(stackValue(1)); aSoundBuffer = arrayValueOf(stackValue(0)); - aSoundBuffer -= 1; if (failed()) { return null; } - n = sizeOfSTArrayFromCPrimitive(aByteArray + 1); - for (i = 1; i <= n; i += 1) { - s = aByteArray[i]; - if (s > 0x7F) { - aSoundBuffer[i] = (((usqInt) (s - 256) << 8)); - } - else { - aSoundBuffer[i] = (((usqInt) s << 8)); - } + if (isOopImmutable(stackValue(0))) { + return primitiveFailFor(PrimErrNoModification); } - if (failed()) { - return null; + arraySize = sizeOfSTArrayFromCPrimitive(aByteArray); + if ((byteSizeOf(stackValue(0))) < (2 * arraySize)) { + return primitiveFail(); + } + for (i = 0; i < arraySize; i += 1) { + s = aByteArray[i]; + aSoundBuffer[i] = ((s > 0x7F + ? ((usqInt) (s - 256) << 8) + : ((usqInt) s << 8))); } - pop(2); + pop(methodArgumentCount()); return 0; } -/* Decompress the body of a byteArray encoded by compressToByteArray (qv)... - The format is simply a sequence of run-coded pairs, {N D}*. - N is a run-length * 4 + data code. - D, the data, depends on the data code... - 0 skip N words, D is absent - (could be used to skip from one raster line to the next) - 1 N words with all 4 bytes = D (1 byte) - 2 N words all = D (4 bytes) - 3 N words follow in D (4N bytes) - S and N are encoded as follows (see decodeIntFrom:)... - 0-223 0-223 - 224-254 (0-30)*256 + next byte (0-7935) - 255 next 4 bytes */ -/* NOTE: If fed with garbage, this routine could read past the end of ba, but - it should fail before writing past the ned of bm. */ - - /* Bitmap>>#primitiveDecompressFromByteArray */ +/* Bitmap decompress: bm fromByteArray: ba at: index */ + + /* MiscPrimitivePlugin>>#primitiveDecompressFromByteArray */ EXPORT(sqInt) primitiveDecompressFromByteArray(void) { @@ -536,33 +414,24 @@ primitiveDecompressFromByteArray(void) sqInt m; unsigned int n; sqInt pastEnd; - sqInt rcvr; - - /* Force the type, otherwise it is inferred as unsigned char because assigned from ba */ - rcvr = stackValue(3); bm = arrayValueOf(stackValue(2)); - bm -= 1; + if (isOopImmutable(stackValue(2))) { + return primitiveFailFor(PrimErrNoModification); + } if (!(isBytes(stackValue(1)))) { return primitiveFail(); } - ba = arrayValueOf(stackValue(1)); - ba -= 1; + ba = firstIndexableField(stackValue(1)); index = stackIntegerValue(0); if (failed()) { return null; } - - /* byteArray read index */ - i = index; - end = sizeOfSTArrayFromCPrimitive(ba + 1); - - /* bitmap write index */ - k = 1; - pastEnd = (sizeOfSTArrayFromCPrimitive(bm + 1)) + 1; - while (i <= end) { - - /* Decode next run start N */ + i = index - 1; + k = 0; + end = sizeOfSTArrayFromCPrimitive(ba); + pastEnd = sizeOfSTArrayFromCPrimitive(bm); + while (i < end) { anInt = ba[i]; i += 1; if (!(anInt <= 223)) { @@ -580,17 +449,12 @@ primitiveDecompressFromByteArray(void) } n = ((usqInt) anInt) >> 2; if ((k + n) > pastEnd) { - primitiveFail(); - return null; + return primitiveFail(); } - code = anInt & 3; - if (code == 0) { - /* skip */ - } + /* code = 0 ifTrue: [nil]. */ + code = anInt & 3; if (code == 1) { - - /* n consecutive words of 4 bytes = the following byte */ data = ba[i]; i += 1; data = data | (((usqInt) data << 8)); @@ -601,8 +465,6 @@ primitiveDecompressFromByteArray(void) } } if (code == 2) { - - /* n consecutive words = 4 following bytes */ data = 0; for (j = 1; j <= 4; j += 1) { data = (((usqInt) data << 8)) | (ba[i]); @@ -614,8 +476,6 @@ primitiveDecompressFromByteArray(void) } } if (code == 3) { - - /* n consecutive words from the data... */ for (m = 1; m <= n; m += 1) { data = 0; for (j = 1; j <= 4; j += 1) { @@ -627,191 +487,126 @@ primitiveDecompressFromByteArray(void) } } } - if (failed()) { - return null; - } - pop(3); + pop(methodArgumentCount()); return 0; } - /* ByteString class>>#primitiveFindFirstInString */ + +/* ByteString (class) findFirstInString: aString inSet: inclusionMap + startingAt: start */ + + /* MiscPrimitivePlugin>>#primitiveFindFirstInString */ EXPORT(sqInt) primitiveFindFirstInString(void) { unsigned char *aString; sqInt i; char *inclusionMap; - sqInt rcvr; sqInt start; sqInt stringSize; - rcvr = stackValue(3); - if (!(isBytes(stackValue(2)))) { - return primitiveFail(); - } - aString = arrayValueOf(stackValue(2)); - aString -= 1; - if (!(isBytes(stackValue(1)))) { + if (!((isIntegerObject(stackValue(0))) + && ((isBytes(stackValue(1))) + && (isBytes(stackValue(2)))))) { return primitiveFail(); } - inclusionMap = arrayValueOf(stackValue(1)); - inclusionMap -= 1; - start = stackIntegerValue(0); - if (failed()) { - return null; - } - if ((sizeOfSTArrayFromCPrimitive(inclusionMap + 1)) != 256) { - if (failed()) { - return null; - } - pop(4); - pushInteger(0); - return null; + aString = firstIndexableField(stackValue(2)); + inclusionMap = firstIndexableField(stackValue(1)); + start = integerValueOf(stackValue(0)); + if ((sizeOfSTArrayFromCPrimitive(inclusionMap)) != 256) { + return methodReturnValue(integerObjectOf(0)); } - i = start; - stringSize = sizeOfSTArrayFromCPrimitive(aString + 1); - while ((i <= stringSize) - && ((inclusionMap[(aString[i]) + 1]) == 0)) { + i = start - 1; + stringSize = sizeOfSTArrayFromCPrimitive(aString); + while ((i < stringSize) + && ((inclusionMap[aString[i]]) == 0)) { i += 1; } - if (i > stringSize) { - if (failed()) { - return null; - } - pop(4); - pushInteger(0); - return null; - } - if (failed()) { - return null; - } - pop(4); - pushInteger(i); - return null; + methodReturnValue(integerObjectOf((i >= stringSize + ? 0 + : i + 1))); + return 0; } -/* Answer the index in the string body at which the substring key first - occurs, at or beyond start. The match is determined using matchTable, - which can be used to effect, eg, case-insensitive matches. If no match is - found, zero will be returned. - - The algorithm below is not optimum -- it is intended to be translated to C - which will go so fast that it wont matter. +/* ByteString findSubstring: key in: body startingAt: start matchTable: + matchTable */ - /* ByteString>>#primitiveFindSubstring */ + /* MiscPrimitivePlugin>>#primitiveFindSubstring */ EXPORT(sqInt) primitiveFindSubstring(void) { unsigned char *body; sqInt index; unsigned char *key; + sqInt keySize; unsigned char *matchTable; - sqInt rcvr; sqInt start; sqInt startIndex; sqInt startIndexLimiT; - rcvr = stackValue(4); - if (!(isBytes(stackValue(3)))) { - return primitiveFail(); - } - key = arrayValueOf(stackValue(3)); - key -= 1; - if (!(isBytes(stackValue(2)))) { + if (!((isBytes(stackValue(0))) + && ((isIntegerObject(stackValue(1))) + && ((isBytes(stackValue(2))) + && (isBytes(stackValue(3))))))) { return primitiveFail(); } - body = arrayValueOf(stackValue(2)); - body -= 1; - start = stackIntegerValue(1); - if (!(isBytes(stackValue(0)))) { - return primitiveFail(); - } - matchTable = arrayValueOf(stackValue(0)); - matchTable -= 1; - if (failed()) { - return null; - } - if ((sizeOfSTArrayFromCPrimitive(key + 1)) == 0) { - if (failed()) { - return null; - } - pop(5); - pushInteger(0); - return null; - } - for (startIndex = (((start < 1) ? 1 : start)), startIndexLimiT = (((sizeOfSTArrayFromCPrimitive(body + 1)) - (sizeOfSTArrayFromCPrimitive(key + 1))) + 1); startIndex <= startIndexLimiT; startIndex += 1) { - index = 1; - while ((matchTable[(body[(startIndex + index) - 1]) + 1]) == (matchTable[(key[index]) + 1])) { - if (index == (sizeOfSTArrayFromCPrimitive(key + 1))) { - if (failed()) { - return null; + key = firstIndexableField(stackValue(3)); + body = firstIndexableField(stackValue(2)); + start = integerValueOf(stackValue(1)); + matchTable = firstIndexableField(stackValue(0)); + if (((keySize = sizeOfSTArrayFromCPrimitive(key))) > 0) { + + /* adjust for zero relative indxes */ + keySize -= 1; + for (startIndex = (((start < 1) ? 1 : start)), startIndexLimiT = ((sizeOfSTArrayFromCPrimitive(body)) - keySize); startIndex <= startIndexLimiT; startIndex += 1) { + index = 0; + while ((matchTable[body[(startIndex + index) - 1]]) == (matchTable[key[index]])) { + if (index == keySize) { + return methodReturnValue(integerObjectOf(startIndex)); } - pop(5); - pushInteger(startIndex); - return null; + index += 1; } - index += 1; } } - if (failed()) { - return null; - } - pop(5); - pushInteger(0); - return null; + return methodReturnValue(integerObjectOf(0)); } - /* ByteString class>>#primitiveIndexOfAsciiInString */ + +/* ByteString indexOfAscii: anInteger inString: aString startingAt: start */ + + /* MiscPrimitivePlugin>>#primitiveIndexOfAsciiInString */ EXPORT(sqInt) primitiveIndexOfAsciiInString(void) { sqInt anInteger; unsigned char *aString; sqInt pos; - sqInt rcvr; sqInt start; sqInt stringSize; - rcvr = stackValue(3); - anInteger = stackIntegerValue(2); - if (!(isBytes(stackValue(1)))) { + if (!((isIntegerObject(stackValue(0))) + && ((isBytes(stackValue(1))) + && (isIntegerObject(stackValue(2)))))) { return primitiveFail(); } - aString = arrayValueOf(stackValue(1)); - aString -= 1; - start = stackIntegerValue(0); - if (failed()) { - return null; - } - stringSize = sizeOfSTArrayFromCPrimitive(aString + 1); - for (pos = start; pos <= stringSize; pos += 1) { + anInteger = integerValueOf(stackValue(2)); + aString = firstIndexableField(stackValue(1)); + start = integerValueOf(stackValue(0)); + stringSize = sizeOfSTArrayFromCPrimitive(aString); + for (pos = (start - 1); pos < stringSize; pos += 1) { if ((aString[pos]) == anInteger) { - if (failed()) { - return null; - } - pop(4); - pushInteger(pos); - return null; + return methodReturnValue(integerObjectOf(pos + 1)); } } - if (failed()) { - return null; - } - pop(4); - pushInteger(0); - return null; + return methodReturnValue(integerObjectOf(0)); } -/* Answer the hash of a byte-indexed collection, using speciesHash as the - initial value. - See SmallInteger>>hashMultiply. - - The primitive should be renamed at a suitable point in the future */ +/* ByteArray (class) hashBytes: aByteArray startingWith: speciesHash */ - /* ByteArray class>>#primitiveStringHash */ + /* MiscPrimitivePlugin>>#primitiveStringHash */ EXPORT(sqInt) primitiveStringHash(void) { @@ -819,72 +614,54 @@ primitiveStringHash(void) sqInt byteArraySize; int hash; sqInt pos; - sqInt rcvr; int speciesHash; - rcvr = stackValue(2); - if (!(isBytes(stackValue(1)))) { + if (!((isIntegerObject(stackValue(0))) + && (isBytes(stackValue(1))))) { return primitiveFail(); } - aByteArray = arrayValueOf(stackValue(1)); - aByteArray -= 1; - speciesHash = stackIntegerValue(0); - if (failed()) { - return null; - } - byteArraySize = sizeOfSTArrayFromCPrimitive(aByteArray + 1); + aByteArray = firstIndexableField(stackValue(1)); + speciesHash = integerValueOf(stackValue(0)); + byteArraySize = sizeOfSTArrayFromCPrimitive(aByteArray); hash = speciesHash & 0xFFFFFFF; - for (pos = 1; pos <= byteArraySize; pos += 1) { - - /* Inlined hashMultiply, written this way for translation to C. */ + for (pos = 0; pos < byteArraySize; pos += 1) { hash += aByteArray[pos]; hash = (hash * 1664525) & 0xFFFFFFF; } - if (failed()) { - return null; - } - pop(3); - pushInteger(hash); - return null; + methodReturnValue(integerObjectOf(hash)); + return 0; } -/* translate the characters in the string by the given table, in place */ +/* ByteString (class) translate: aString from: start to: stop table: table */ - /* ByteString class>>#primitiveTranslateStringWithTable */ + /* MiscPrimitivePlugin>>#primitiveTranslateStringWithTable */ EXPORT(sqInt) primitiveTranslateStringWithTable(void) { unsigned char *aString; sqInt i; - sqInt rcvr; sqInt start; sqInt stop; unsigned char *table; - rcvr = stackValue(4); - if (!(isBytes(stackValue(3)))) { - return primitiveFail(); - } - aString = arrayValueOf(stackValue(3)); - aString -= 1; - start = stackIntegerValue(2); - stop = stackIntegerValue(1); - if (!(isBytes(stackValue(0)))) { + if (!((isBytes(stackValue(0))) + && ((isIntegerObject(stackValue(1))) + && ((isIntegerObject(stackValue(2))) + && (isBytes(stackValue(3))))))) { return primitiveFail(); } - table = arrayValueOf(stackValue(0)); - table -= 1; - if (failed()) { - return null; + if (isOopImmutable(stackValue(3))) { + return primitiveFailFor(PrimErrNoModification); } - for (i = start; i <= stop; i += 1) { - aString[i] = (table[(aString[i]) + 1]); + aString = firstIndexableField(stackValue(3)); + start = integerValueOf(stackValue(2)); + stop = integerValueOf(stackValue(1)); + table = firstIndexableField(stackValue(0)); + for (i = (start - 1); i < stop; i += 1) { + aString[i] = (table[aString[i]]); } - if (failed()) { - return null; - } - pop(4); + pop(methodArgumentCount()); return 0; } @@ -904,11 +681,25 @@ setInterpreter(struct VirtualMachine*anInterpreter) #if !defined(SQUEAK_BUILTIN_PLUGIN) arrayValueOf = interpreterProxy->arrayValueOf; + byteSizeOf = interpreterProxy->byteSizeOf; failed = interpreterProxy->failed; + firstIndexableField = interpreterProxy->firstIndexableField; + integerObjectOf = interpreterProxy->integerObjectOf; + integerValueOf = interpreterProxy->integerValueOf; isBytes = interpreterProxy->isBytes; + isIntegerObject = interpreterProxy->isIntegerObject; +#if IMMUTABILITY + isOopImmutable = interpreterProxy->isOopImmutable; +#else +# if !defined(isOopImmutable) + isOopImmutable = 0; +# endif +#endif + methodArgumentCount = interpreterProxy->methodArgumentCount; + methodReturnValue = interpreterProxy->methodReturnValue; pop = interpreterProxy->pop; primitiveFail = interpreterProxy->primitiveFail; - pushInteger = interpreterProxy->pushInteger; + primitiveFailFor = interpreterProxy->primitiveFailFor; sizeOfSTArrayFromCPrimitive = interpreterProxy->sizeOfSTArrayFromCPrimitive; stackIntegerValue = interpreterProxy->stackIntegerValue; stackValue = interpreterProxy->stackValue; @@ -923,29 +714,21 @@ setInterpreter(struct VirtualMachine*anInterpreter) static char _m[] = "MiscPrimitivePlugin"; void* MiscPrimitivePlugin_exports[][3] = { {(void*)_m, "getModuleName", (void*)getModuleName}, - {(void*)_m, "primitiveCompareString\000\000", (void*)primitiveCompareString}, - {(void*)_m, "primitiveCompressToByteArray\000\000", (void*)primitiveCompressToByteArray}, - {(void*)_m, "primitiveConvert8BitSigned\000\000", (void*)primitiveConvert8BitSigned}, - {(void*)_m, "primitiveDecompressFromByteArray\000\001", (void*)primitiveDecompressFromByteArray}, - {(void*)_m, "primitiveFindFirstInString\000\000", (void*)primitiveFindFirstInString}, - {(void*)_m, "primitiveFindSubstring\000\000", (void*)primitiveFindSubstring}, - {(void*)_m, "primitiveIndexOfAsciiInString\000\000", (void*)primitiveIndexOfAsciiInString}, - {(void*)_m, "primitiveStringHash\000\000", (void*)primitiveStringHash}, - {(void*)_m, "primitiveTranslateStringWithTable\000\000", (void*)primitiveTranslateStringWithTable}, + {(void*)_m, "primitiveCompareString\000\377", (void*)primitiveCompareString}, + {(void*)_m, "primitiveCompressToByteArray\000\377", (void*)primitiveCompressToByteArray}, + {(void*)_m, "primitiveConvert8BitSigned\000\377", (void*)primitiveConvert8BitSigned}, + {(void*)_m, "primitiveDecompressFromByteArray\000\000", (void*)primitiveDecompressFromByteArray}, + {(void*)_m, "primitiveFindFirstInString\000\377", (void*)primitiveFindFirstInString}, + {(void*)_m, "primitiveFindSubstring\000\377", (void*)primitiveFindSubstring}, + {(void*)_m, "primitiveIndexOfAsciiInString\000\377", (void*)primitiveIndexOfAsciiInString}, + {(void*)_m, "primitiveStringHash\000\377", (void*)primitiveStringHash}, + {(void*)_m, "primitiveTranslateStringWithTable\000\377", (void*)primitiveTranslateStringWithTable}, {(void*)_m, "setInterpreter", (void*)setInterpreter}, {NULL, NULL, NULL} }; #else /* ifdef SQ_BUILTIN_PLUGIN */ -signed char primitiveCompareStringAccessorDepth = 0; -signed char primitiveCompressToByteArrayAccessorDepth = 0; -signed char primitiveConvert8BitSignedAccessorDepth = 0; -signed char primitiveDecompressFromByteArrayAccessorDepth = 1; -signed char primitiveFindFirstInStringAccessorDepth = 0; -signed char primitiveFindSubstringAccessorDepth = 0; -signed char primitiveIndexOfAsciiInStringAccessorDepth = 0; -signed char primitiveStringHashAccessorDepth = 0; -signed char primitiveTranslateStringWithTableAccessorDepth = 0; +signed char primitiveDecompressFromByteArrayAccessorDepth = 0; #endif /* ifdef SQ_BUILTIN_PLUGIN */ diff --git a/src/plugins/Mpeg3Plugin/Mpeg3Plugin.c b/src/plugins/Mpeg3Plugin/Mpeg3Plugin.c index 8220ab86ba..f0f820ee7b 100644 --- a/src/plugins/Mpeg3Plugin/Mpeg3Plugin.c +++ b/src/plugins/Mpeg3Plugin/Mpeg3Plugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2064 uuid: 732488bd-fbde-43e8-b942-4ca3e05e53a6 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - Mpeg3Plugin VMMaker.oscog-eem.2064 uuid: 732488bd-fbde-43e8-b942-4ca3e05e53a6 + Mpeg3Plugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "Mpeg3Plugin VMMaker.oscog-eem.2064 uuid: 732488bd-fbde-43e8-b942-4ca3e05e53a6 " __DATE__ ; +static char __buildInfo[] = "Mpeg3Plugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -130,9 +131,9 @@ struct VirtualMachine* interpreterProxy; static sqInt maximumNumberOfFilesToWatch; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "Mpeg3Plugin VMMaker.oscog-eem.2064 (i)" + "Mpeg3Plugin VMMaker.oscog-eem.2347 (i)" #else - "Mpeg3Plugin VMMaker.oscog-eem.2064 (e)" + "Mpeg3Plugin VMMaker.oscog-eem.2347 (e)" #endif ; static mpeg3_t *mpegFiles[1024+1]; diff --git a/src/plugins/QuicktimePlugin/QuicktimePlugin.c b/src/plugins/QuicktimePlugin/QuicktimePlugin.c index 4876c0deed..98fc83039c 100644 --- a/src/plugins/QuicktimePlugin/QuicktimePlugin.c +++ b/src/plugins/QuicktimePlugin/QuicktimePlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-nice.1982 uuid: ed988fdd-7019-41f8-9051-e08afa837953 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - QuicktimePlugin VMMaker.oscog-nice.1982 uuid: ed988fdd-7019-41f8-9051-e08afa837953 + QuicktimePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "QuicktimePlugin VMMaker.oscog-nice.1982 uuid: ed988fdd-7019-41f8-9051-e08afa837953 " __DATE__ ; +static char __buildInfo[] = "QuicktimePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -70,9 +71,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "QuicktimePlugin VMMaker.oscog-nice.1982 (i)" + "QuicktimePlugin VMMaker.oscog-eem.2347 (i)" #else - "QuicktimePlugin VMMaker.oscog-nice.1982 (e)" + "QuicktimePlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/RePlugin/RePlugin.c b/src/plugins/RePlugin/RePlugin.c index 2e171e51c8..e07dbbf274 100644 --- a/src/plugins/RePlugin/RePlugin.c +++ b/src/plugins/RePlugin/RePlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - RePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + RePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "RePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "RePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -116,9 +117,9 @@ static int lastAlloc = 0; static sqInt matchFlags; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "RePlugin VMMaker.oscog-eem.2309 (i)" + "RePlugin VMMaker.oscog-eem.2347 (i)" #else - "RePlugin VMMaker.oscog-eem.2309 (e)" + "RePlugin VMMaker.oscog-eem.2347 (e)" #endif ; static int netMemory = 0; diff --git a/src/plugins/SHA256Plugin/SHA256Plugin.c b/src/plugins/SHA256Plugin/SHA256Plugin.c index 1bfa64c844..d986f7e7af 100644 --- a/src/plugins/SHA256Plugin/SHA256Plugin.c +++ b/src/plugins/SHA256Plugin/SHA256Plugin.c @@ -1,5 +1,5 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from SHA256Plugin CryptographyPlugins-eem.12 uuid: 2945c878-6a44-4c6a-8374-b56aa6175d0f */ @@ -7,6 +7,7 @@ static char __buildInfo[] = "SHA256Plugin CryptographyPlugins-eem.12 uuid: 2945c +#include "config.h" #include #include #include diff --git a/src/plugins/ScratchPlugin/ScratchPlugin.c b/src/plugins/ScratchPlugin/ScratchPlugin.c index 22ec6a0f14..4cf9b4f184 100644 --- a/src/plugins/ScratchPlugin/ScratchPlugin.c +++ b/src/plugins/ScratchPlugin/ScratchPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - ScratchPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + ScratchPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "ScratchPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "ScratchPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -116,9 +117,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "ScratchPlugin VMMaker.oscog-eem.2309 (i)" + "ScratchPlugin VMMaker.oscog-eem.2347 (i)" #else - "ScratchPlugin VMMaker.oscog-eem.2309 (e)" + "ScratchPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/SecurityPlugin/SecurityPlugin.c b/src/plugins/SecurityPlugin/SecurityPlugin.c index 902be28d59..74126ce6c5 100644 --- a/src/plugins/SecurityPlugin/SecurityPlugin.c +++ b/src/plugins/SecurityPlugin/SecurityPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2166 uuid: 7471b7ee-fa31-444f-bc3d-dee21ee090f2 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SecurityPlugin VMMaker.oscog-eem.2166 uuid: 7471b7ee-fa31-444f-bc3d-dee21ee090f2 + SecurityPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "SecurityPlugin VMMaker.oscog-eem.2166 uuid: 7471b7ee-fa31-444f-bc3d-dee21ee090f2 " __DATE__ ; +static char __buildInfo[] = "SecurityPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -87,9 +88,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "SecurityPlugin VMMaker.oscog-eem.2166 (i)" + "SecurityPlugin VMMaker.oscog-eem.2347 (i)" #else - "SecurityPlugin VMMaker.oscog-eem.2166 (e)" + "SecurityPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/SerialPlugin/SerialPlugin.c b/src/plugins/SerialPlugin/SerialPlugin.c index 2ba14cc965..627a1e97d5 100644 --- a/src/plugins/SerialPlugin/SerialPlugin.c +++ b/src/plugins/SerialPlugin/SerialPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SerialPlugin VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + SerialPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "SerialPlugin VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 " __DATE__ ; +static char __buildInfo[] = "SerialPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -85,9 +86,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "SerialPlugin VMMaker.oscog-eem.2285 (i)" + "SerialPlugin VMMaker.oscog-eem.2347 (i)" #else - "SerialPlugin VMMaker.oscog-eem.2285 (e)" + "SerialPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/SocketPlugin/SocketPlugin.c b/src/plugins/SocketPlugin/SocketPlugin.c index 9a89599cbc..85741044c4 100644 --- a/src/plugins/SocketPlugin/SocketPlugin.c +++ b/src/plugins/SocketPlugin/SocketPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SocketPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + SocketPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "SocketPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "SocketPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -167,9 +168,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "SocketPlugin VMMaker.oscog-eem.2309 (i)" + "SocketPlugin VMMaker.oscog-eem.2347 (i)" #else - "SocketPlugin VMMaker.oscog-eem.2309 (e)" + "SocketPlugin VMMaker.oscog-eem.2347 (e)" #endif ; static void * sCCLOPfn; diff --git a/src/plugins/SoundCodecPrims/SoundCodecPrims.c b/src/plugins/SoundCodecPrims/SoundCodecPrims.c index 326e8587a0..f765f76c06 100644 --- a/src/plugins/SoundCodecPrims/SoundCodecPrims.c +++ b/src/plugins/SoundCodecPrims/SoundCodecPrims.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SoundCodecPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + SoundCodecPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "SoundCodecPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 " __DATE__ ; +static char __buildInfo[] = "SoundCodecPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -72,9 +73,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "SoundCodecPrims VMMaker.oscog-eem.1975 (i)" + "SoundCodecPrims VMMaker.oscog-eem.2347 (i)" #else - "SoundCodecPrims VMMaker.oscog-eem.1975 (e)" + "SoundCodecPrims VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/SoundGenerationPlugin/SoundGenerationPlugin.c b/src/plugins/SoundGenerationPlugin/SoundGenerationPlugin.c index a848e3bd52..e1b1c66060 100644 --- a/src/plugins/SoundGenerationPlugin/SoundGenerationPlugin.c +++ b/src/plugins/SoundGenerationPlugin/SoundGenerationPlugin.c @@ -1,14 +1,15 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2079 uuid: 00ef0ca2-fca0-4dc0-baa9-e65e98fda15a + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SoundGenerationPlugin VMMaker.oscog-eem.2079 uuid: 00ef0ca2-fca0-4dc0-baa9-e65e98fda15a - AbstractSound Sound-tfel.59 uuid: ba31f5bd-7f7d-3144-99ac-d5c67d3cf6ee + SoundGenerationPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 + AbstractSound Sound-pre.64 uuid: 1e82fad7-2c1d-ea42-9b55-cfa86185e99b */ -static char __buildInfo[] = "SoundGenerationPlugin VMMaker.oscog-eem.2079 uuid: 00ef0ca2-fca0-4dc0-baa9-e65e98fda15a\n\ -AbstractSound Sound-tfel.59 uuid: ba31f5bd-7f7d-3144-99ac-d5c67d3cf6ee " __DATE__ ; +static char __buildInfo[] = "SoundGenerationPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5\n\ +AbstractSound Sound-pre.64 uuid: 1e82fad7-2c1d-ea42-9b55-cfa86185e99b " __DATE__ ; +#include "config.h" #include #include #include @@ -80,9 +81,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "SoundGenerationPlugin VMMaker.oscog-eem.2079 (i)" + "SoundGenerationPlugin VMMaker.oscog-eem.2347 (i)" #else - "SoundGenerationPlugin VMMaker.oscog-eem.2079 (e)" + "SoundGenerationPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/SoundPlugin/SoundPlugin.c b/src/plugins/SoundPlugin/SoundPlugin.c index 5bcb4f2a0b..01a384ec3b 100644 --- a/src/plugins/SoundPlugin/SoundPlugin.c +++ b/src/plugins/SoundPlugin/SoundPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SoundPlugin VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + SoundPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "SoundPlugin VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 " __DATE__ ; +static char __buildInfo[] = "SoundPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -133,9 +134,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "SoundPlugin VMMaker.oscog-eem.2285 (i)" + "SoundPlugin VMMaker.oscog-eem.2347 (i)" #else - "SoundPlugin VMMaker.oscog-eem.2285 (e)" + "SoundPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/Squeak3D/Squeak3D.c b/src/plugins/Squeak3D/Squeak3D.c index 0200a07355..b25a462024 100644 --- a/src/plugins/Squeak3D/Squeak3D.c +++ b/src/plugins/Squeak3D/Squeak3D.c @@ -1,5 +1,5 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from B3DEnginePlugin Balloon3D-Plugins-dtl.12 uuid: d984c84e-773a-4154-a5b2-9ca6f3ed7b52 */ @@ -7,6 +7,7 @@ static char __buildInfo[] = "B3DEnginePlugin Balloon3D-Plugins-dtl.12 uuid: d984 +#include "config.h" #include #include #include diff --git a/src/plugins/SqueakFFIPrims/ARM32FFIPlugin.c b/src/plugins/SqueakFFIPrims/ARM32FFIPlugin.c index 1b02ee816a..2d22017960 100644 --- a/src/plugins/SqueakFFIPrims/ARM32FFIPlugin.c +++ b/src/plugins/SqueakFFIPrims/ARM32FFIPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - ThreadedARMFFIPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + ThreadedARMFFIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "ThreadedARMFFIPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "ThreadedARMFFIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -498,9 +499,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "ARM32FFIPlugin VMMaker.oscog-eem.2309 (i)" + "ARM32FFIPlugin VMMaker.oscog-eem.2347 (i)" #else - "ARM32FFIPlugin VMMaker.oscog-eem.2309 (e)" + "ARM32FFIPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/SqueakFFIPrims/IA32FFIPlugin.c b/src/plugins/SqueakFFIPrims/IA32FFIPlugin.c index 876fe194e1..725a70bd9e 100644 --- a/src/plugins/SqueakFFIPrims/IA32FFIPlugin.c +++ b/src/plugins/SqueakFFIPrims/IA32FFIPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - ThreadedIA32FFIPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + ThreadedIA32FFIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "ThreadedIA32FFIPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "ThreadedIA32FFIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -489,9 +490,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "IA32FFIPlugin VMMaker.oscog-eem.2309 (i)" + "IA32FFIPlugin VMMaker.oscog-eem.2347 (i)" #else - "IA32FFIPlugin VMMaker.oscog-eem.2309 (e)" + "IA32FFIPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/SqueakFFIPrims/X64SysVFFIPlugin.c b/src/plugins/SqueakFFIPrims/X64SysVFFIPlugin.c index 6fc0a6eef9..2c423b0188 100644 --- a/src/plugins/SqueakFFIPrims/X64SysVFFIPlugin.c +++ b/src/plugins/SqueakFFIPrims/X64SysVFFIPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - ThreadedX64SysVFFIPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + ThreadedX64SysVFFIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "ThreadedX64SysVFFIPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "ThreadedX64SysVFFIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -509,9 +510,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "X64SysVFFIPlugin VMMaker.oscog-eem.2309 (i)" + "X64SysVFFIPlugin VMMaker.oscog-eem.2347 (i)" #else - "X64SysVFFIPlugin VMMaker.oscog-eem.2309 (e)" + "X64SysVFFIPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/SqueakFFIPrims/X64Win64FFIPlugin.c b/src/plugins/SqueakFFIPrims/X64Win64FFIPlugin.c index 623d0b77b7..19e73fe929 100644 --- a/src/plugins/SqueakFFIPrims/X64Win64FFIPlugin.c +++ b/src/plugins/SqueakFFIPrims/X64Win64FFIPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - ThreadedX64Win64FFIPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + ThreadedX64Win64FFIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "ThreadedX64Win64FFIPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "ThreadedX64Win64FFIPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -502,9 +503,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "X64Win64FFIPlugin VMMaker.oscog-eem.2309 (i)" + "X64Win64FFIPlugin VMMaker.oscog-eem.2347 (i)" #else - "X64Win64FFIPlugin VMMaker.oscog-eem.2309 (e)" + "X64Win64FFIPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/SqueakSSL/SqueakSSL.c b/src/plugins/SqueakSSL/SqueakSSL.c index 05f3f69263..b3b36479f1 100644 --- a/src/plugins/SqueakSSL/SqueakSSL.c +++ b/src/plugins/SqueakSSL/SqueakSSL.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - SqueakSSLPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + SqueakSSLPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "SqueakSSLPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 " __DATE__ ; +static char __buildInfo[] = "SqueakSSLPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -89,9 +90,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "SqueakSSL VMMaker.oscog-eem.1975 (i)" + "SqueakSSL VMMaker.oscog-eem.2347 (i)" #else - "SqueakSSL VMMaker.oscog-eem.1975 (e)" + "SqueakSSL VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/StarSqueakPlugin/StarSqueakPlugin.c b/src/plugins/StarSqueakPlugin/StarSqueakPlugin.c index 40dc6ecfaf..96d28af491 100644 --- a/src/plugins/StarSqueakPlugin/StarSqueakPlugin.c +++ b/src/plugins/StarSqueakPlugin/StarSqueakPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StarSqueakPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + StarSqueakPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StarSqueakPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "StarSqueakPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -66,9 +67,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "StarSqueakPlugin VMMaker.oscog-eem.2309 (i)" + "StarSqueakPlugin VMMaker.oscog-eem.2347 (i)" #else - "StarSqueakPlugin VMMaker.oscog-eem.2309 (e)" + "StarSqueakPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/UUIDPlugin/UUIDPlugin.c b/src/plugins/UUIDPlugin/UUIDPlugin.c index 97bb15a37c..7686a9a56a 100644 --- a/src/plugins/UUIDPlugin/UUIDPlugin.c +++ b/src/plugins/UUIDPlugin/UUIDPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - UUIDPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 + UUIDPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "UUIDPlugin VMMaker.oscog-eem.1975 uuid: 76250913-236f-47e0-832c-27b05d488807 " __DATE__ ; +static char __buildInfo[] = "UUIDPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -63,9 +64,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "UUIDPlugin VMMaker.oscog-eem.1975 (i)" + "UUIDPlugin VMMaker.oscog-eem.2347 (i)" #else - "UUIDPlugin VMMaker.oscog-eem.1975 (e)" + "UUIDPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/UnicodePlugin/UnicodePlugin.c b/src/plugins/UnicodePlugin/UnicodePlugin.c index f1e96221b9..c73ca0bc8c 100644 --- a/src/plugins/UnicodePlugin/UnicodePlugin.c +++ b/src/plugins/UnicodePlugin/UnicodePlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - UnicodePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + UnicodePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "UnicodePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "UnicodePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -85,9 +86,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "UnicodePlugin VMMaker.oscog-eem.2309 (i)" + "UnicodePlugin VMMaker.oscog-eem.2347 (i)" #else - "UnicodePlugin VMMaker.oscog-eem.2309 (e)" + "UnicodePlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c b/src/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c index 26612780a3..4f9c19d929 100644 --- a/src/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c +++ b/src/plugins/UnixOSProcessPlugin/UnixOSProcessPlugin.c @@ -1,5 +1,5 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2293 uuid: 42fb0654-3c58-4388-b25e-dbad57cd0747 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from UnixOSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-dtl.56 uuid: bc1514bb-2e9f-406f-a302-552a72837efd */ @@ -9,6 +9,7 @@ static char __buildInfo[] = "UnixOSProcessPlugin VMConstruction-Plugins-OSProces +#include "config.h" #include #include #include @@ -45,7 +46,6 @@ static char __buildInfo[] = "UnixOSProcessPlugin VMConstruction-Plugins-OSProces #include "FilePlugin.h" #include "SocketPlugin.h" -#include "config.h" #include "sqaio.h" #include "sqMemoryAccess.h" diff --git a/src/plugins/VMProfileLinuxSupportPlugin/VMProfileLinuxSupportPlugin.c b/src/plugins/VMProfileLinuxSupportPlugin/VMProfileLinuxSupportPlugin.c index 237658a655..363321fb38 100644 --- a/src/plugins/VMProfileLinuxSupportPlugin/VMProfileLinuxSupportPlugin.c +++ b/src/plugins/VMProfileLinuxSupportPlugin/VMProfileLinuxSupportPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - VMProfileLinuxSupportPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMProfileLinuxSupportPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "VMProfileLinuxSupportPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "VMProfileLinuxSupportPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -104,9 +105,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "VMProfileLinuxSupportPlugin VMMaker.oscog-eem.2309 (i)" + "VMProfileLinuxSupportPlugin VMMaker.oscog-eem.2347 (i)" #else - "VMProfileLinuxSupportPlugin VMMaker.oscog-eem.2309 (e)" + "VMProfileLinuxSupportPlugin VMMaker.oscog-eem.2347 (e)" #endif ; static sqInt numModules; diff --git a/src/plugins/VMProfileMacSupportPlugin/VMProfileMacSupportPlugin.c b/src/plugins/VMProfileMacSupportPlugin/VMProfileMacSupportPlugin.c index ef79121947..c8d5edb7a5 100644 --- a/src/plugins/VMProfileMacSupportPlugin/VMProfileMacSupportPlugin.c +++ b/src/plugins/VMProfileMacSupportPlugin/VMProfileMacSupportPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - VMProfileMacSupportPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMProfileMacSupportPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "VMProfileMacSupportPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "VMProfileMacSupportPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -99,9 +100,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "VMProfileMacSupportPlugin VMMaker.oscog-eem.2309 (i)" + "VMProfileMacSupportPlugin VMMaker.oscog-eem.2347 (i)" #else - "VMProfileMacSupportPlugin VMMaker.oscog-eem.2309 (e)" + "VMProfileMacSupportPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/WeDoPlugin/WeDoPlugin.c b/src/plugins/WeDoPlugin/WeDoPlugin.c index 777fc1eb26..d659ca88e7 100644 --- a/src/plugins/WeDoPlugin/WeDoPlugin.c +++ b/src/plugins/WeDoPlugin/WeDoPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - WeDoPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + WeDoPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "WeDoPlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "WeDoPlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -67,9 +68,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "WeDoPlugin VMMaker.oscog-eem.2309 (i)" + "WeDoPlugin VMMaker.oscog-eem.2347 (i)" #else - "WeDoPlugin VMMaker.oscog-eem.2309 (e)" + "WeDoPlugin VMMaker.oscog-eem.2347 (e)" #endif ; diff --git a/src/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c b/src/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c index 3a3fcc582a..c907daf3a5 100644 --- a/src/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c +++ b/src/plugins/Win32OSProcessPlugin/Win32OSProcessPlugin.c @@ -1,5 +1,5 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from Win32OSProcessPlugin VMConstruction-Plugins-OSProcessPlugin.oscog-dtl.56 uuid: bc1514bb-2e9f-406f-a302-552a72837efd */ @@ -9,6 +9,7 @@ static char __buildInfo[] = "Win32OSProcessPlugin VMConstruction-Plugins-OSProce +#include "config.h" #include #include #include diff --git a/src/plugins/XDisplayControlPlugin/XDisplayControlPlugin.c b/src/plugins/XDisplayControlPlugin/XDisplayControlPlugin.c index 0e883d587f..aa3c2564f0 100644 --- a/src/plugins/XDisplayControlPlugin/XDisplayControlPlugin.c +++ b/src/plugins/XDisplayControlPlugin/XDisplayControlPlugin.c @@ -1,5 +1,5 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2285 uuid: 98acc33d-77d9-4edc-8d09-d7853850efd6 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from XDisplayControlPlugin VMConstruction-Plugins-XDisplayControlPlugin-dtl.13 uuid: b38ad411-8642-469d-af3d-c0f9fed02e01 */ @@ -7,6 +7,7 @@ static char __buildInfo[] = "XDisplayControlPlugin VMConstruction-Plugins-XDispl +#include "config.h" #include #include #include diff --git a/src/plugins/ZipPlugin/ZipPlugin.c b/src/plugins/ZipPlugin/ZipPlugin.c index 7ee9913056..44b8946150 100644 --- a/src/plugins/ZipPlugin/ZipPlugin.c +++ b/src/plugins/ZipPlugin/ZipPlugin.c @@ -1,12 +1,13 @@ /* Automatically generated by - VMPluginCodeGenerator VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + VMPluginCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - DeflatePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 + DeflatePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "DeflatePlugin VMMaker.oscog-eem.2309 uuid: 122d5ac0-b546-4f56-a020-8e8988fc5c10 " __DATE__ ; +static char __buildInfo[] = "DeflatePlugin VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; +#include "config.h" #include #include #include @@ -135,9 +136,9 @@ extern struct VirtualMachine* interpreterProxy; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "ZipPlugin VMMaker.oscog-eem.2309 (i)" + "ZipPlugin VMMaker.oscog-eem.2347 (i)" #else - "ZipPlugin VMMaker.oscog-eem.2309 (e)" + "ZipPlugin VMMaker.oscog-eem.2347 (e)" #endif ; static sqInt readStreamInstSize; diff --git a/src/vm/cogit.h b/src/vm/cogit.h index 0a724eb4a0..1ee906e9a7 100644 --- a/src/vm/cogit.h +++ b/src/vm/cogit.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ diff --git a/src/vm/cogitARMv5.c b/src/vm/cogitARMv5.c index 06e258138e..2effe47f58 100644 --- a/src/vm/cogitARMv5.c +++ b/src/vm/cogitARMv5.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -307,7 +307,6 @@ char *__cogitBuildInfo = __buildInfo; #define TypeMask 0x3 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #define VarBaseReg 10 #define VC 7 @@ -395,7 +394,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -632,7 +632,7 @@ static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static CogMethod * NoDbgRegParms fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -698,7 +698,7 @@ static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveMwrR(sqInt offset, sqInt baseReg, sqInt destReg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -932,7 +932,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms allocateLiteral(sqInt aLiteral); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1089,7 +1088,6 @@ static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoole static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); static sqInt NoDbgRegParms genVanillaInlinedIdenticalOrNotIf(sqInt orNot); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1099,11 +1097,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1115,7 +1115,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1125,16 +1124,18 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); static sqInt NoDbgRegParms v3PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils); static sqInt NoDbgRegParms v3NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1548,7 +1549,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -1572,7 +1572,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -1653,6 +1652,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -6961,7 +6961,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -8288,12 +8288,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -9700,7 +9706,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -11269,7 +11275,7 @@ gMoveMwrR(sqInt offset, sqInt baseReg, sqInt destReg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -17888,8 +17894,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -18098,13 +18105,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -20801,10 +20801,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -21152,6 +21149,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -21613,7 +21613,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -21639,7 +21640,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -21680,18 +21681,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -21763,7 +21763,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -22289,11 +22289,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; sqInt address; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -22329,13 +22337,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -22413,10 +22429,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -22426,13 +22444,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -22473,7 +22505,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -22722,6 +22754,7 @@ genPushActiveContextBytecode(void) static sqInt genPushClosureCopyCopiedValuesBytecode(void) { + sqInt i1; sqInt numArgs; sqInt numCopied; sqInt startpc; @@ -22732,7 +22765,14 @@ genPushClosureCopyCopiedValuesBytecode(void) /* begin genOutlineClosure:numArgs:numCopied: */ if (numCopied > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } voidReceiverResultRegContainsSelf(); ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -22855,6 +22895,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -22862,7 +22903,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -22889,11 +22937,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -22962,7 +23009,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -22974,9 +23021,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -23078,6 +23125,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -23093,7 +23141,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -23136,7 +23184,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -23331,6 +23386,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -23348,14 +23404,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -23534,6 +23597,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -23560,7 +23624,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -23582,6 +23653,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI { AbstractInstruction *abstractInstruction; AbstractInstruction *anInstruction; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -23596,7 +23668,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); genStoreTrampolineCall(slotIndex); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -23608,7 +23680,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); if (usesOutOfLineLiteral(anInstruction)) { @@ -23630,6 +23709,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -23647,7 +23727,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -23710,7 +23797,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) if (usesOutOfLineLiteral(anInstruction)) { (anInstruction->dependent = locateLiteral(offset)); } - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -23735,6 +23822,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -23743,7 +23831,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -23795,6 +23890,7 @@ genVanillaInlinedIdenticalOrNotIf(sqInt orNot) BytecodeDescriptor *branchDescriptor1; sqInt constant; sqInt constant1; + sqInt i; void *jumpTarget; void *jumpTarget1; void *jumpTarget2; @@ -23914,7 +24010,14 @@ genVanillaInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(argIsConstant, rcvrIsConstant, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ assert((argReg != NoReg) || (rcvrReg != NoReg)); @@ -23991,60 +24094,38 @@ genVanillaInlinedIdenticalOrNotIf(sqInt orNot) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -24054,57 +24135,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 1 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -24112,16 +24197,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -24183,10 +24269,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 1 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -24197,7 +24293,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -24206,7 +24309,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -24268,7 +24378,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -24276,7 +24385,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; + sqInt i1; + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -24289,38 +24409,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -24331,6 +24454,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (1 /* numRegArgs */ + 1)) ? numArgs : (1 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -24406,6 +24545,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -24416,6 +24566,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -24435,7 +24586,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -24550,6 +24706,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -24625,7 +24782,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -24680,7 +24842,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -24695,6 +24857,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -24709,12 +24872,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -24740,30 +24911,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -24773,15 +24920,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -24797,15 +24953,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -24816,11 +24984,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -24828,18 +25018,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -24858,18 +25038,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -24878,17 +25075,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -24896,6 +25110,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -24903,8 +25119,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -24914,17 +25146,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -24935,6 +25184,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -25002,13 +25258,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -25026,6 +25275,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -25116,6 +25396,13 @@ v3NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMeth : 0); } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -25125,18 +25412,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/src/vm/cogitIA32.c b/src/vm/cogitIA32.c index 39c3075d3a..684d24edd2 100644 --- a/src/vm/cogitIA32.c +++ b/src/vm/cogitIA32.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -321,7 +321,6 @@ char *__cogitBuildInfo = __buildInfo; #define TypeMask 0x3 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define ValueIndex 1 #undef VarBaseReg #define XCHGAwR 155 @@ -410,7 +409,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -620,7 +620,7 @@ static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static CogMethod * NoDbgRegParms fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -685,7 +685,7 @@ static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveMwrR(sqInt offset, sqInt baseReg, sqInt destReg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -901,7 +901,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); static AbstractInstruction * NoDbgRegParms checkQuickConstantforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1052,7 +1051,6 @@ static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoole static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); static sqInt NoDbgRegParms genVanillaInlinedIdenticalOrNotIf(sqInt orNot); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1062,11 +1060,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1078,7 +1078,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1088,16 +1087,18 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); static sqInt NoDbgRegParms v3PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils); static sqInt NoDbgRegParms v3NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1506,7 +1507,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -1530,7 +1530,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -1612,6 +1611,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -6751,11 +6751,7 @@ stackPageInterruptHeadroomBytes(AbstractInstruction * self_in_stackPageInterrupt static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr) { - sqInt addr; - - for (addr = startAddr; addr <= endAddr; addr += 1) { - byteAtput(addr, 204 /* stop */); - } + memset(startAddr, 204 /* stop */, (endAddr - startAddr) + 1); return self_in_stopsFromto; } @@ -7023,7 +7019,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -8325,12 +8321,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -9696,7 +9698,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -11213,7 +11215,7 @@ gMoveMwrR(sqInt offset, sqInt baseReg, sqInt destReg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -17008,8 +17010,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -17200,13 +17203,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -19607,10 +19603,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -19940,6 +19933,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -20391,7 +20387,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -20417,7 +20414,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -20458,18 +20455,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -20541,7 +20537,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -21044,11 +21040,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -21084,13 +21088,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -21162,10 +21174,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -21175,13 +21189,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -21219,7 +21247,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -21437,6 +21465,7 @@ genPushActiveContextBytecode(void) static sqInt genPushClosureCopyCopiedValuesBytecode(void) { + sqInt i1; sqInt numArgs; sqInt numCopied; sqInt startpc; @@ -21447,7 +21476,14 @@ genPushClosureCopyCopiedValuesBytecode(void) /* begin genOutlineClosure:numArgs:numCopied: */ if (numCopied > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } voidReceiverResultRegContainsSelf(); ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -21561,6 +21597,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -21568,7 +21605,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -21595,11 +21639,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -21665,7 +21708,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -21677,9 +21720,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -21781,6 +21824,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -21800,7 +21844,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -21843,7 +21887,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -22018,6 +22069,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -22035,14 +22087,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -22215,6 +22274,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -22238,7 +22298,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -22260,6 +22327,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI { AbstractInstruction *abstractInstruction; AbstractInstruction *anInstruction; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -22274,7 +22342,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); genStoreTrampolineCall(slotIndex); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -22286,7 +22354,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -22305,6 +22380,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -22322,7 +22398,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -22379,7 +22462,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -22404,6 +22487,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -22412,7 +22496,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -22462,6 +22553,7 @@ genVanillaInlinedIdenticalOrNotIf(sqInt orNot) BytecodeDescriptor *branchDescriptor1; sqInt constant; sqInt constant1; + sqInt i; void *jumpTarget; void *jumpTarget1; void *jumpTarget2; @@ -22580,7 +22672,14 @@ genVanillaInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(argIsConstant, rcvrIsConstant, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ assert((argReg != NoReg) || (rcvrReg != NoReg)); @@ -22651,60 +22750,38 @@ genVanillaInlinedIdenticalOrNotIf(sqInt orNot) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -22714,57 +22791,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 1 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -22772,16 +22853,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); + (desc->offset = ((methodOrBlockNumArgs + 1) - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -22843,10 +22925,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 1 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -22857,7 +22949,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -22866,7 +22965,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -22928,7 +23034,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -22936,7 +23041,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -22949,38 +23065,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -22991,6 +23110,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (1 /* numRegArgs */ + 1)) ? numArgs : (1 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -23066,6 +23201,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -23076,6 +23222,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -23095,7 +23242,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -23210,6 +23362,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -23285,7 +23438,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -23340,7 +23498,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -23355,6 +23513,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -23369,12 +23528,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -23400,30 +23567,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -23433,15 +23576,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -23457,15 +23609,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -23476,11 +23640,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -23488,18 +23674,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -23518,18 +23694,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -23538,17 +23731,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -23556,6 +23766,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -23563,8 +23775,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -23574,17 +23802,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -23595,6 +23840,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -23662,13 +23914,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -23686,6 +23931,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -23776,6 +24052,13 @@ v3NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMeth : 0); } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -23785,18 +24068,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/src/vm/cogitMIPSEL.c b/src/vm/cogitMIPSEL.c index 6db934c212..ebfec0e898 100644 --- a/src/vm/cogitMIPSEL.c +++ b/src/vm/cogitMIPSEL.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + CCodeGenerator VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 + StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2324 uuid: 904abc56-e5a8-467e-a337-880211e33805 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__cogitBuildInfo = __buildInfo; @@ -351,7 +351,6 @@ char *__cogitBuildInfo = __buildInfo; #define TypeMask 0x3 #define UnfailingPrimitive 3 #define UnimplementedPrimitive -7 -#define UnknownSimStackPtrFlag -2 #define V0 2 #define ValueIndex 1 #define VarBaseReg 22 @@ -438,7 +437,8 @@ typedef struct { typedef struct { AbstractInstruction *targetInstruction; - signed char simStackPtr; + unsigned char simStackPtr; + char isTargetOfBackwardBranch; unsigned short instructionIndex; #if LowcodeVM short simNativeStackPtr; @@ -565,7 +565,7 @@ static sqInt NoDbgRegParms fillInBlockHeadersAt(sqInt startAddress); static CogMethod * NoDbgRegParms fillInMethodHeadersizeselector(CogMethod *method, sqInt size, sqInt selector); static sqInt NoDbgRegParms findBackwardBranchIsBackwardBranchMcpcBcpcMatchingBcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetBcpc); static usqInt NoDbgRegParms findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc); -static usqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); @@ -630,7 +630,7 @@ static void NoDbgRegParms loadSubsequentBytesForDescriptorat(BytecodeDescriptor static AbstractInstruction * NoDbgRegParms gMoveAwR(sqInt address, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveCwR(sqInt wordConstant, sqInt reg); static AbstractInstruction * NoDbgRegParms gMoveMwrR(sqInt offset, sqInt baseReg, sqInt destReg); -static usqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod); static sqInt NoDbgRegParms mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg); static sqInt NoDbgRegParms mapObjectReferencesInClosedPIC(CogMethod *cPIC); static void mapObjectReferencesInGeneratedRuntime(void); @@ -1046,7 +1046,6 @@ static sqInt NoDbgRegParms registerMask(SimStackEntry * self_in_registerMask); static sqInt NoDbgRegParms registerMaskOrNone(SimStackEntry * self_in_registerMaskOrNone); static sqInt NoDbgRegParms registerOrNone(SimStackEntry * self_in_registerOrNone); static SimStackEntry * NoDbgRegParms storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg); -static sqInt NoDbgRegParms isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup); static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup); static AbstractInstruction * NoDbgRegParms checkLiteralforInstruction(sqInt literal, AbstractInstruction *anInstruction); static AbstractInstruction * NoDbgRegParms checkQuickConstantforInstruction(sqInt literal, AbstractInstruction *anInstruction); @@ -1196,7 +1195,6 @@ static sqInt NoDbgRegParms genStorePopRemoteTempAtneedsStoreCheck(sqInt popBoole static sqInt NoDbgRegParms genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex); static sqInt genUpArrowReturn(void); static sqInt NoDbgRegParms genVanillaInlinedIdenticalOrNotIf(sqInt orNot); -static void NoDbgRegParms initializeFixupAt(sqInt targetPC); static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc); static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc); @@ -1206,11 +1204,13 @@ static void NoDbgRegParms marshallSendArguments(sqInt numArgs); static sqInt maybeCompilingFirstPassOfBlockWithInitialPushNil(void); static sqInt NoDbgRegParms mergeWithFixupIfRequired(BytecodeFixup *fixup); static sqInt NoDbgRegParms methodAbortTrampolineFor(sqInt numArgs); +static sqInt methodFoundInvalidPostScan(void); static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta); static sqInt NoDbgRegParms needsFrameIfStackGreaterThanOne(sqInt stackDelta); static sqInt NoDbgRegParms numberOfSpillsInTopNItems(sqInt n); static sqInt NoDbgRegParms picAbortTrampolineFor(sqInt numArgs); static sqInt prevInstIsPCAnnotated(void); +static sqInt receiverIsInReceiverResultReg(void); static void NoDbgRegParms reinitializeFixupsFromthrough(sqInt start, sqInt end); static sqInt NoDbgRegParms scanBlock(BlockStart *blockStart); static sqInt scanMethod(void); @@ -1222,7 +1222,6 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqIn static void NoDbgRegParms ssAllocateRequiredReg(sqInt requiredReg); static void NoDbgRegParms ssAllocateRequiredRegand(sqInt requiredReg1, sqInt requiredReg2); static void NoDbgRegParms ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr); -static void NoDbgRegParms ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex); static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex); static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex); static void NoDbgRegParms ssPop(sqInt n); @@ -1232,16 +1231,18 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal); static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry); static sqInt NoDbgRegParms ssPushRegister(sqInt reg); static void NoDbgRegParms ssPush(sqInt n); +static SimStackEntry ssSelfDescriptor(void); static void NoDbgRegParms ssStoreAndReplacePoptoReg(sqInt popBoolean, sqInt reg); static sqInt NoDbgRegParms ssStorePoptoPreferredReg(sqInt popBoolean, sqInt preferredReg); static void NoDbgRegParms ssStorePoptoReg(sqInt popBoolean, sqInt reg); static CogSimStackEntry * ssTop(void); -static SimStackEntry ssTopDescriptor(void); static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n); static sqInt NoDbgRegParms stackEntryIsBoolean(CogSimStackEntry *simStackEntry); +static sqInt tempsValidAndVolatileEntriesSpilled(void); static sqInt NoDbgRegParms tryCollapseTempVectorInitializationOfSize(sqInt slots); static sqInt NoDbgRegParms v3PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils); static sqInt NoDbgRegParms v3NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj); +static sqInt violatesEnsureSpilledSpillAssert(void); static void voidReceiverResultRegContainsSelf(void); @@ -1650,7 +1651,6 @@ static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]; static sqInt opcodeIndex; static CogMethod *openPICList = 0; static sqInt openPICSize; -static CogSSOptStatus optStatus; static sqInt ordinarySendTrampolines[NumSendTrampolines]; static sqInt picAbortTrampolines[4]; static AbstractInstruction * picInterpretAbort; @@ -1674,7 +1674,6 @@ static sqInt simNativeSpillBase; static sqInt simNativeStack; static sqInt simNativeStackPtr; static sqInt simNativeStackSize; -static CogSimStackEntry simSelf; static sqInt simSpillBase; static SimStackEntry simStack[70]; static sqInt simStackPtr; @@ -1754,6 +1753,7 @@ static usqInt youngReferrers; #define fullBlockNoContextSwitchEntryOffset() cbNoSwitchEntryOffset #define fixupAtIndex(index) (&fixups[index]) #define simNativeStackAt(index) (simNativeStack + (index)) +#define simSelf() simStack #define simStackAt(index) (simStack + (index)) #define traceDescriptor(ign) 0 #define traceFixupmerge(igu,ana) 0 @@ -2222,7 +2222,7 @@ static sqInt NoDbgRegParms blockDispatchTargetsForperformarg(CogMethod *cogMethod, usqInt (*binaryFunction)(sqInt mcpc, sqInt arg), sqInt arg) { sqInt blockEntry; - usqInt end; + sqInt end; sqInt pc; sqInt result; usqInt targetpc; @@ -3524,12 +3524,18 @@ CogMethod * cogselector(sqInt aMethodObj, sqInt aSelectorOop) { CogMethod *cogMethod; + sqInt selector; /* inline exclude:selector: */ assert(!((methodHasCogMethod(aMethodObj)))); assert(!((isOopCompiledMethod(ultimateLiteralOf(aMethodObj))))); - compilationBreakpointisMNUCase(aSelectorOop, lengthOf(aSelectorOop), 0); + + /* coInterpreter stringOf: selector */ + selector = (aSelectorOop == (nilObject()) + ? maybeSelectorOfMethod(aMethodObj) + : aSelectorOop); + compilationBreakpointisMNUCase(selector, lengthOf(selector), 0); if (aMethodObj == breakMethod) { haltmsg("Compilation of breakMethod"); } @@ -4405,7 +4411,7 @@ configureMNUCPICmethodOperandnumArgsdelta(CogMethod *cPIC, sqInt methodOperand, static sqInt NoDbgRegParms cPICCompactAndIsNowEmpty(CogMethod *cPIC) { - usqInt entryPoint; + sqInt entryPoint; sqInt followingAddress; sqInt i; sqInt methods[MaxCPICCases]; @@ -4890,7 +4896,7 @@ findBlockMethodWithEntrystartBcpc(sqInt blockEntryMcpc, sqInt startBcpc) } /* Cogit>>#findMapLocationForMcpc:inMethod: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(usqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; @@ -6394,7 +6400,7 @@ gMoveMwrR(sqInt offset, sqInt baseReg, sqInt destReg) /* Answer the address of the null byte at the end of the method map. */ /* Cogit>>#mapEndFor: */ -static usqInt NoDbgRegParms +static sqInt NoDbgRegParms mapEndFor(CogMethod *cogMethod) { usqInt end; @@ -16269,8 +16275,9 @@ ensureSpilledAtfrom(SimStackEntry * self_in_ensureSpilledAtfrom, sqInt baseOffse if ((self_in_ensureSpilledAtfrom->spilled)) { if (((self_in_ensureSpilledAtfrom->type)) == SSSpill) { - assert((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) - && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)); + assert(((((self_in_ensureSpilledAtfrom->offset)) == baseOffset) + && (((self_in_ensureSpilledAtfrom->registerr)) == baseRegister)) + || (violatesEnsureSpilledSpillAssert())); return self_in_ensureSpilledAtfrom; } } @@ -16461,13 +16468,6 @@ storeToReg(SimStackEntry * self_in_storeToReg, sqInt reg) return self_in_storeToReg; } - /* CogSSBytecodeFixup>>#isBackwardBranchFixup */ -static sqInt NoDbgRegParms -isBackwardBranchFixup(BytecodeFixup * self_in_isBackwardBranchFixup) -{ - return ((self_in_isBackwardBranchFixup->simStackPtr)) == UnknownSimStackPtrFlag; -} - /* CogSSBytecodeFixup>>#isMergeFixup */ static sqInt NoDbgRegParms isMergeFixup(BytecodeFixup * self_in_isMergeFixup) @@ -18852,10 +18852,7 @@ compileAbstractInstructionsFromthrough(sqInt start, sqInt end) deadCode = 0; while (1) { maybeHaltIfDebugPC(); - /* begin fixupAt: */ - fixup = fixupAtIndex(bytecodePC - initialPC); - mergeWithFixupIfRequired(fixup); - /* begin assertCorrectSimStackPtr */ + mergeWithFixupIfRequired((fixup = fixupAt(bytecodePC))); descriptor = loadBytesAndGetDescriptor(); nextOpcodeIndex = opcodeIndex; result = (deadCode @@ -19187,6 +19184,9 @@ compileCogMethod(sqInt selector) return ((CogMethod *) numBlocks); } numCleanBlocks = scanForCleanBlocks(); + if (methodFoundInvalidPostScan()) { + return ((CogMethod *) ShouldNotJIT); + } allocateBlockStarts(numBlocks + numCleanBlocks); blockCount = 0; if (numCleanBlocks > 0) { @@ -19642,7 +19642,8 @@ duplicateTopBytecode(void) { SimStackEntry desc; - desc = ssTopDescriptor(); + /* begin ssTopDescriptor */ + desc = simStack[simStackPtr]; return ssPushDesc(desc); } @@ -19668,7 +19669,7 @@ ensureFixupAt(sqInt targetPC) (fixup->simStackPtr = simStackPtr); } else { - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { /* this is the target of a backward branch and so doesn't have a simStackPtr assigned yet. */ @@ -19709,18 +19710,17 @@ static void ensureReceiverResultRegContainsSelf(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { ssAllocateRequiredReg(ReceiverResultReg); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); + ((simSelf())->liveRegister = ReceiverResultReg); } - (optStatus.isReceiverResultRegLive = 1); } else { - assert((((simSelf.type)) == SSRegister) - && (((simSelf.registerr)) == ReceiverResultReg)); - assert(((optStatus.isReceiverResultRegLive)) - && (((optStatus.ssEntry)) == ((&simSelf)))); + assert(((((simSelf())->type)) == SSRegister) + && (((((simSelf())->registerr)) == ReceiverResultReg) + && (receiverIsInReceiverResultReg()))); } } @@ -19792,7 +19792,7 @@ eventualTargetOf(sqInt targetBytecodePC) return currentTarget; } } - if ((((fixupAt(nextPC))->simStackPtr)) == UnknownSimStackPtrFlag) { + if (((fixupAt(nextPC))->isTargetOfBackwardBranch)) { return currentTarget; } nextPC = eventualTargetOf(nextPC + ((descriptor->numBytes))); @@ -20301,11 +20301,19 @@ genJumpBackTo(sqInt targetBytecodePC) AbstractInstruction *abstractInstruction1; sqInt address; AbstractInstruction *anInstruction; + sqInt i; void *jumpTarget; void *jumpTarget1; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* can't fall through */ deadCode = 1; @@ -20341,13 +20349,21 @@ genJumpIfto(sqInt boolean, sqInt targetBytecodePC) CogSimStackEntry *desc; sqInt eventualTarget; BytecodeFixup *fixup; + sqInt i; void *jumpTarget; AbstractInstruction *ok; sqInt quickConstant; eventualTarget = eventualTargetOf(targetBytecodePC); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 1)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i < simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 1) + 1; + } desc = ssTop(); ssPop(1); if ((((desc->type)) == SSConstant) @@ -20419,10 +20435,12 @@ genJumpTo(sqInt targetBytecodePC) sqInt eventualTarget; BytecodeFixup * fixup; BytecodeDescriptor * generator; + sqInt i; + sqInt i1; eventualTarget = eventualTargetOf(targetBytecodePC); if ((eventualTarget > bytecodePC) - && (((simStackPtr > 0) + && (((simStackPtr >= methodOrBlockNumArgs) && (stackEntryIsBoolean(ssTop()))) && ((((generator = generatorForPC(eventualTarget))->isBranchTrue)) || (((generator = generatorForPC(eventualTarget))->isBranchFalse))))) { @@ -20432,13 +20450,27 @@ genJumpTo(sqInt targetBytecodePC) : 0)); ssPop(1); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); ssPop(-1); } else { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } fixup = ensureFixupAt(eventualTarget); } @@ -20476,7 +20508,7 @@ genMarshalledSendnumArgssendTable(sqInt selectorIndex, sqInt numArgs, sqInt *sen genLoadInlineCacheWithSelector(selectorIndex); ((genoperand(Call, sendTable[((numArgs < (NumSendTrampolines - 1)) ? numArgs : (NumSendTrampolines - 1))]))->annotation = annotation); /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); + ((simSelf())->liveRegister = NoReg); return ssPushRegister(ReceiverResultReg); } @@ -20697,6 +20729,7 @@ genPushActiveContextBytecode(void) static sqInt genPushClosureCopyCopiedValuesBytecode(void) { + sqInt i1; sqInt numArgs; sqInt numCopied; sqInt startpc; @@ -20707,7 +20740,14 @@ genPushClosureCopyCopiedValuesBytecode(void) /* begin genOutlineClosure:numArgs:numCopied: */ if (numCopied > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } voidReceiverResultRegContainsSelf(); ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -20821,6 +20861,7 @@ static sqInt genPushNewArrayBytecode(void) { sqInt i; + sqInt i1; int popValues; sqInt size; @@ -20828,7 +20869,14 @@ genPushNewArrayBytecode(void) voidReceiverResultRegContainsSelf(); if ((popValues = byte1 > 0x7F)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } else { ssAllocateCallRegand(SendNumArgsReg, ReceiverResultReg); @@ -20855,11 +20903,10 @@ genPushNewArrayBytecode(void) static sqInt genPushReceiverBytecode(void) { - if ((optStatus.isReceiverResultRegLive)) { + if ((((simSelf())->liveRegister)) == ReceiverResultReg) { return ssPushRegister(ReceiverResultReg); } - assert((registerOrNone(&simSelf)) == NoReg); - return ssPushDesc(simSelf); + return ssPushDesc(ssSelfDescriptor()); } /* StackToRegisterMappingCogit>>#genPushReceiverVariable: */ @@ -20925,7 +20972,7 @@ genPushTemporaryVariable(sqInt index) assert((inBlock > 0) || (needsFrame || (index < methodOrBlockNumArgs))); - return ssPushDesc(simStack[index]); + return ssPushDesc(simStack[index + 1]); } @@ -20937,9 +20984,9 @@ static sqInt genReturnReceiver(void) { if (needsFrame) { - if (!((optStatus.isReceiverResultRegLive))) { + if (!((((simSelf())->liveRegister)) == ReceiverResultReg)) { /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); } } return genUpArrowReturn(); @@ -21041,6 +21088,7 @@ genSpecialSelectorArithmetic(void) sqInt argInt; int argIsConst; sqInt argIsInt; + sqInt i; sqInt index; AbstractInstruction *jumpContinue; AbstractInstruction *jumpNotSmallInts; @@ -21060,7 +21108,7 @@ genSpecialSelectorArithmetic(void) rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && ((((rcvrInt = ((ssValue(1))->constant))) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsInt && (rcvrIsInt && (rcvrIsConst))) { @@ -21103,7 +21151,14 @@ genSpecialSelectorArithmetic(void) } if (argIsInt) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } popToReg(ssValue(1), ReceiverResultReg); ssPop(2); } @@ -21278,6 +21333,7 @@ genSpecialSelectorComparison(void) sqInt argIsIntConst; BytecodeDescriptor *branchDescriptor; BytecodeDescriptor *branchDescriptor1; + sqInt i; sqInt index; sqInt inlineCAB; AbstractInstruction *jumpNotSmallInts; @@ -21295,14 +21351,21 @@ genSpecialSelectorComparison(void) sqInt targetPC; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } primDescriptor = generatorAt(byte0); argIsIntConst = ((((ssTop())->type)) == SSConstant) && ((((argInt = ((ssTop())->constant))) & 1)); rcvrIsInt = (((rcvrIsConst = (((ssValue(1))->type)) == SSConstant)) && (((((ssValue(1))->constant)) & 1))) || ((mclassIsSmallInteger()) - && (isSameEntryAs(ssValue(1), (&simSelf)))); + && (isSameEntryAs(ssValue(1), simSelf()))); if (argIsIntConst && (rcvrIsInt && (rcvrIsConst))) { @@ -21475,6 +21538,7 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean { AbstractInstruction *anInstruction; sqInt association; + sqInt i; sqInt topReg; assert(needsFrame); @@ -21498,7 +21562,14 @@ genStorePopLiteralVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, ValueIndex, ReceiverResultReg, TempReg, needsStoreCheck, 0); } # endif /* IMMUTABILITY */ @@ -21520,6 +21591,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI { AbstractInstruction *abstractInstruction; AbstractInstruction *anInstruction; + sqInt i; AbstractInstruction *immutabilityFailure; AbstractInstruction *mutableJump; @@ -21534,7 +21606,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI mutableJump = genJumpMutablescratchReg(ReceiverResultReg, TempReg); genStoreTrampolineCall(slotIndex); /* begin putSelfInReceiverResultReg */ - storeToReg((&simSelf), ReceiverResultReg); + storeToReg(simSelf(), ReceiverResultReg); /* begin Jump: */ immutabilityFailure = genoperand(Jump, ((sqInt)0)); jmpTarget(mutableJump, genoperandoperand(Label, (labelCounter += 1), bytecodePC)); @@ -21546,7 +21618,14 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI genLoadSlotsourceRegdestReg(SenderIndex, ReceiverResultReg, TempReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperand(MoveCqR, slotIndex, SendNumArgsReg); /* begin CallRT: */ @@ -21565,6 +21644,7 @@ genStorePopMaybeContextReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqI static sqInt NoDbgRegParms genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolean, sqInt slotIndex, sqInt needsStoreCheck, sqInt needsImmCheck) { + sqInt i; sqInt needsImmCheck1; sqInt needsStoreCheck1; sqInt topReg; @@ -21582,7 +21662,14 @@ genStorePopReceiverVariableneedsStoreCheckneedsImmutabilityCheck(sqInt popBoolea ssAllocateRequiredReg(ClassReg); ssStoreAndReplacePoptoReg(popBoolean, ClassReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } return genStoreWithImmutabilityCheckSourceRegslotIndexdestRegscratchRegneedsStoreCheckneedRestoreRcvr(ClassReg, slotIndex, ReceiverResultReg, TempReg, needsStoreCheck1, 1); } # endif /* IMMUTABILITY */ @@ -21639,7 +21726,7 @@ genStorePopTemporaryVariable(sqInt popBoolean, sqInt tempIndex) offset = frameOffsetOfTemporary(tempIndex); /* begin checkQuickConstant:forInstruction: */ anInstruction = genoperandoperandoperand(MoveRMwr, reg, offset, FPReg); - ((simStackAt(tempIndex))->bcptr = bytecodePC); + ((simStackAt(tempIndex + 1))->bcptr = bytecodePC); return 0; } @@ -21664,6 +21751,7 @@ genUpArrowReturn(void) { AbstractInstruction *abstractInstruction; AbstractInstruction *abstractInstruction1; + sqInt i; sqInt offset; @@ -21672,7 +21760,14 @@ genUpArrowReturn(void) if (inBlock > 0) { assert(needsFrame); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } /* begin CallRT: */ abstractInstruction = genoperand(Call, ceNonLocalReturnTrampoline); (abstractInstruction->annotation = IsRelativeCall); @@ -21724,6 +21819,7 @@ genVanillaInlinedIdenticalOrNotIf(sqInt orNot) BytecodeDescriptor *branchDescriptor1; sqInt constant; sqInt constant1; + sqInt i; void *jumpTarget; void *jumpTarget1; void *jumpTarget2; @@ -21842,7 +21938,14 @@ genVanillaInlinedIdenticalOrNotIf(sqInt orNot) return genIdenticalNoBranchArgIsConstantrcvrIsConstantargRegrcvrRegorNotIf(argIsConstant, rcvrIsConstant, argReg, rcvrReg, orNot); } /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - 2, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= (simStackPtr - 2)) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= (simStackPtr - 2); i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = (simStackPtr - 2) + 1; + } /* begin genCmpArgIsConstant:rcvrIsConstant:argReg:rcvrReg: */ assert((argReg != NoReg) || (rcvrReg != NoReg)); @@ -21913,60 +22016,38 @@ genVanillaInlinedIdenticalOrNotIf(sqInt orNot) return 0; } - -/* Make sure there's a flagged fixup at the targetPC in fixups. - These are the targets of backward branches. A backward branch fixup's - simStackPtr needs to be set when generating the code for the bytecode at - the targetPC. - Initially a fixup's target is just a flag. Later on it is replaced with a - proper instruction. */ - - /* StackToRegisterMappingCogit>>#initializeFixupAt: */ -static void NoDbgRegParms -initializeFixupAt(sqInt targetPC) -{ - BytecodeFixup * fixup; - - /* begin fixupAt: */ - fixup = fixupAtIndex(targetPC - initialPC); - /* begin initializeFixup: */ - (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); - /* begin setIsBackwardBranchFixup */ - (fixup->simStackPtr) = UnknownSimStackPtrFlag; - } - /* StackToRegisterMappingCogit>>#initSimStackForFramefulMethod: */ static void NoDbgRegParms initSimStackForFramefulMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSBaseOffset); - (simSelf.spilled = 1); - (simSelf.registerr = FPReg); - (simSelf.offset = FoxMFReceiver); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 0); - (optStatus.ssEntry = (&simSelf)); /* N.B. Includes num args */ - simSpillBase = methodOrBlockNumTemps; - simStackPtr = simSpillBase - 1; - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; + cascade0 = simSelf(); + (cascade0->type = SSBaseOffset); + (cascade0->spilled = 1); + (cascade0->registerr = FPReg); + (cascade0->offset = FoxMFReceiver); + (cascade0->liveRegister = NoReg); + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxCallerSavedIP + ((methodOrBlockNumArgs - i) * BytesPerWord)); + (desc->offset = FoxCallerSavedIP + (((methodOrBlockNumArgs - i) + 1) * BytesPerWord)); (desc->bcptr = startpc); } - for (i = methodOrBlockNumArgs; i <= simStackPtr; i += 1) { + for (i = (methodOrBlockNumArgs + 1); i <= simStackPtr; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = FPReg); - (desc->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerWord)); + (desc->offset = FoxMFReceiver - ((i - methodOrBlockNumArgs) * BytesPerWord)); (desc->bcptr = startpc); } } @@ -21976,57 +22057,61 @@ initSimStackForFramefulMethod(sqInt startpc) closure value primitive(s) and hence a frameless block has all arguments and copied values pushed to the stack. However, - the method receiver (self) is put in the ReceiverResultRegister by the - block entry. */ + the method receiver (self) is put in the ReceiverResultReg by the block + entry. + */ /* StackToRegisterMappingCogit>>#initSimStackForFramelessBlock: */ static void NoDbgRegParms initSimStackForFramelessBlock(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps >= methodOrBlockNumArgs); - for (i = 0; i < methodOrBlockNumTemps; i += 1) { + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->spilled = 1); (desc->registerr = SPReg); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } - simSpillBase = (simStackPtr = methodOrBlockNumTemps - 1); + + /* N.B. Includes num args */ + simStackPtr = methodOrBlockNumTemps; + simSpillBase = methodOrBlockNumTemps + 1; } /* StackToRegisterMappingCogit>>#initSimStackForFramelessMethod: */ static void NoDbgRegParms initSimStackForFramelessMethod(sqInt startpc) { + CogSimStackEntry * cascade0; CogSimStackEntry *desc; sqInt i; - (simSelf.type = SSRegister); - (simSelf.spilled = 0); - (simSelf.registerr = ReceiverResultReg); - /* begin initOptStatus: */ - (optStatus.isReceiverResultRegLive = 1); - (optStatus.ssEntry = (&simSelf)); + cascade0 = simSelf(); + (cascade0->type = SSRegister); + (cascade0->spilled = 0); + (cascade0->registerr = ReceiverResultReg); + (cascade0->liveRegister = ReceiverResultReg); assert(methodOrBlockNumTemps == methodOrBlockNumArgs); assert((numRegArgs()) <= 2); if (((methodOrBlockNumArgs >= 1) && (methodOrBlockNumArgs <= 1 /* numRegArgs */))) { - desc = simStackAt(0); + desc = simStackAt(1); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg0Reg); (desc->bcptr = startpc); if (methodOrBlockNumArgs > 1) { - desc = simStackAt(1); + desc = simStackAt(2); (desc->type = SSRegister); (desc->spilled = 0); (desc->registerr = Arg1Reg); @@ -22034,16 +22119,17 @@ initSimStackForFramelessMethod(sqInt startpc) } } else { - for (i = 0; i < methodOrBlockNumArgs; i += 1) { + for (i = 1; i <= methodOrBlockNumArgs; i += 1) { desc = simStackAt(i); (desc->type = SSBaseOffset); (desc->registerr = SPReg); (desc->spilled = 1); - (desc->offset = ((methodOrBlockNumArgs - 1) - i) * BytesPerWord); + (desc->offset = (methodOrBlockNumArgs - i) * BytesPerWord); (desc->bcptr = startpc); } } - simSpillBase = (simStackPtr = methodOrBlockNumArgs - 1); + simStackPtr = methodOrBlockNumArgs; + simSpillBase = methodOrBlockNumArgs + 1; } /* StackToRegisterMappingCogit>>#liveRegisters */ @@ -22105,10 +22191,20 @@ marshallSendArguments(sqInt numArgs) { sqInt anyRefs; CogSimStackEntry * cascade0; + sqInt i; + sqInt i1; + sqInt i2; sqInt numSpilled; /* begin ssFlushTo: */ - ssFlushTonativeFlushTo((simStackPtr - numArgs) - 1, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= ((simStackPtr - numArgs) - 1)) { + for (i2 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i2 < (simStackPtr - numArgs); i2 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i2), frameOffsetOfTemporary(i2 - 1), FPReg); + } + simSpillBase = ((simStackPtr - numArgs) - 1) + 1; + } if (numArgs > 1 /* numRegArgs */) { /* If there are no spills and no references to ReceiverResultReg @@ -22119,7 +22215,14 @@ marshallSendArguments(sqInt numArgs) if ((numSpilled > 0) || (anyRefs)) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } storeToReg(simStackAt(simStackPtr - numArgs), ReceiverResultReg); } else { @@ -22128,7 +22231,14 @@ marshallSendArguments(sqInt numArgs) (cascade0->type = SSRegister); (cascade0->registerr = ReceiverResultReg); /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= simStackPtr; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } } else { @@ -22190,7 +22300,6 @@ maybeCompilingFirstPassOfBlockWithInitialPushNil(void) In addition, if this is a backjump merge point, we patch the fixup to hold the current simStackPtr for later assertions. */ -/* case 1 */ /* StackToRegisterMappingCogit>>#mergeWithFixupIfRequired: */ static sqInt NoDbgRegParms @@ -22198,7 +22307,18 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) { CogSimStackEntry * cascade0; sqInt i; - + sqInt i1; + + /* begin assertCorrectSimStackPtr */ + assert((simSpillBase >= methodOrBlockNumTemps) + || ((maybeCompilingFirstPassOfBlockWithInitialPushNil()) + && (simSpillBase > methodOrBlockNumArgs))); + if (needsFrame + && (simSpillBase > 0)) { + assert((((simStackAt(simSpillBase - 1))->spilled)) == 1); + assert((simSpillBase > simStackPtr) + || ((((simStackAt(simSpillBase))->spilled)) == 0)); + } if (((fixup->targetInstruction)) == 0) { return 0; } @@ -22211,38 +22331,41 @@ mergeWithFixupIfRequired(BytecodeFixup *fixup) if (deadCode) { /* case 3 */ - /* Would like to assert fixup simStackPtr >= (methodOrBlockNumTemps - 1) but can't because - a) the initialNils hack, b) deadCode removal allows arriving at an isBackwardBranchFixup. */ - assert((((fixup->simStackPtr)) >= (methodOrBlockNumTemps - 1)) - || ((inBlock == InVanillaBlock) - || (isBackwardBranchFixup(fixup)))); - if (!(((fixup->simStackPtr)) == UnknownSimStackPtrFlag)) { - simStackPtr = (fixup->simStackPtr); - } + /* Would like to assert fixup simStackPtr >= methodOrBlockNumTemps + but can't because of the initialNils hack. */ + assert((((fixup->simStackPtr)) >= methodOrBlockNumTemps) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + simStackPtr = (fixup->simStackPtr); } else { /* case 4 */ /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= simStackPtr) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= simStackPtr; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = simStackPtr + 1; + } } deadCode = 0; - if (((fixup->simStackPtr)) == UnknownSimStackPtrFlag) { + if ((fixup->isTargetOfBackwardBranch)) { (fixup->simStackPtr = simStackPtr); } (fixup->targetInstruction = genoperandoperand(Label, (labelCounter += 1), bytecodePC)); assert(simStackPtr == ((fixup->simStackPtr))); /* begin restoreSimStackAtMergePoint: */ - simSpillBase = methodOrBlockNumTemps; - /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - for (i = methodOrBlockNumTemps; i <= simStackPtr; i += 1) { - cascade0 = simStackAt(i); + ((simSelf())->liveRegister = NoReg); + for (i1 = (methodOrBlockNumTemps + 1); i1 <= simStackPtr; i1 += 1) { + cascade0 = simStackAt(i1); (cascade0->type = SSSpill); - (cascade0->offset = FoxMFReceiver - (((i - methodOrBlockNumArgs) + 1) * BytesPerOop)); + (cascade0->offset = FoxMFReceiver - ((i1 - methodOrBlockNumArgs) * BytesPerOop)); (cascade0->registerr = FPReg); (cascade0->spilled = 1); } + simSpillBase = simStackPtr + 1; return 0; } @@ -22253,6 +22376,22 @@ methodAbortTrampolineFor(sqInt numArgs) return methodAbortTrampolines[((numArgs < (1 /* numRegArgs */ + 1)) ? numArgs : (1 /* numRegArgs */ + 1))]; } + +/* This is a hook for subclasses to filter out methods they can't deal with. */ +/* Frameless methods with local temporaries cause problems, + mostly in asserts, and yet they matter not at all for performance. + Shun them. */ + + /* StackToRegisterMappingCogit>>#methodFoundInvalidPostScan */ +static sqInt +methodFoundInvalidPostScan(void) +{ + if (!needsFrame) { + return methodOrBlockNumTemps > methodOrBlockNumArgs; + } + return 0; +} + /* StackToRegisterMappingCogit>>#needsFrameIfMod16GENumArgs: */ static sqInt NoDbgRegParms needsFrameIfMod16GENumArgs(sqInt stackDelta) @@ -22328,6 +22467,17 @@ prevInstIsPCAnnotated(void) } +/* Used to mark ReceiverResultReg as dead or not containing simSelf. + Used when the simStack has already been flushed, e.g. for sends. */ + + /* StackToRegisterMappingCogit>>#receiverIsInReceiverResultReg */ +static sqInt +receiverIsInReceiverResultReg(void) +{ + return (((simSelf())->liveRegister)) == ReceiverResultReg; +} + + /* When a block must be recompiled due to overestimating the numInitialNils fixups must be restored, which means rescannning since backward branches need their targets initialized. */ @@ -22338,6 +22488,7 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt nExts; sqInt pc; BytecodeFixup * self_in_reinitialize; @@ -22357,7 +22508,12 @@ reinitializeFixupsFromthrough(sqInt start, sqInt end) /* begin spanFor:at:exts:in: */ distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj); targetPC = (pc + ((descriptor->numBytes))) + distance; - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } if ((descriptor->isBlockCreation)) { /* begin spanFor:at:exts:in: */ @@ -22472,6 +22628,7 @@ scanMethod(void) { BytecodeDescriptor *descriptor; sqInt distance; + BytecodeFixup * fixup; sqInt framelessStackDelta; sqInt latestContinuation; sqInt nExts; @@ -22547,7 +22704,12 @@ scanMethod(void) targetPC = (pc + ((descriptor->numBytes))) + distance; if ((assert(((descriptor->spanFunction)) != null), (((descriptor->spanFunction))(descriptor, pc, nExts, methodObj)) < 0)) { - initializeFixupAt(targetPC); + /* begin initializeFixupAt: */ + fixup = fixupAtIndex(targetPC - initialPC); + /* begin initializeFixup: */ + (fixup->targetInstruction) = ((AbstractInstruction *) NeedsMergeFixupFlag); + /* begin setIsBackwardBranchFixup */ + (fixup->isTargetOfBackwardBranch) = 1; } else { latestContinuation = ((latestContinuation < targetPC) ? targetPC : latestContinuation); @@ -22602,7 +22764,7 @@ ssAllocateCallRegand(sqInt requiredReg1, sqInt requiredReg2) static void NoDbgRegParms ssAllocateCallRegandand(sqInt requiredReg1, sqInt requiredReg2, sqInt requiredReg3) { - ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | ((1U << requiredReg1) | ((1U << requiredReg2) | (1U << requiredReg3))), simStackPtr); + ssAllocateRequiredRegMaskupThrough(CallerSavedRegisterMask | (((1U << requiredReg1) | (1U << requiredReg2)) | (1U << requiredReg3)), simStackPtr); } /* StackToRegisterMappingCogit>>#ssAllocateRequiredRegMask:upThrough: */ @@ -22617,6 +22779,7 @@ static void NoDbgRegParms ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt stackPtr, sqInt nativeStackPtr) { sqInt i; + sqInt i1; sqInt lastRequired; sqInt lastRequiredNative; sqInt liveRegs; @@ -22631,12 +22794,20 @@ ssAllocateRequiredRegMaskupThroughupThroughNative(sqInt requiredRegsMask, sqInt liveRegs = (1U << FPReg) | (1U << SPReg); for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) { liveRegs = liveRegs | (registerMask(simStackAt(i))); - if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) { + if ((registerMask(simStackAt(i))) & requiredRegsMask) { lastRequired = i; } } if (liveRegs & requiredRegsMask) { - ssFlushTonativeFlushTo(lastRequired, lastRequiredNative); + /* begin ssFlushTo: */ + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= lastRequired) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= lastRequired; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = lastRequired + 1; + } assert(!(((liveRegisters()) & requiredRegsMask))); } } @@ -22662,30 +22833,6 @@ ssAllocateRequiredRegupThrough(sqInt requiredReg, sqInt stackPtr) ssAllocateRequiredRegMaskupThrough(1U << requiredReg, stackPtr); } - /* StackToRegisterMappingCogit>>#ssFlushTo:nativeFlushTo: */ -static void NoDbgRegParms -ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) -{ - sqInt i; - - for (i = 0; i < methodOrBlockNumTemps; i += 1) { - assert(((((simStackAt(i))->type)) == SSBaseOffset) - || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); - } - for (i = methodOrBlockNumTemps; i < simSpillBase; i += 1) { - - /* simSpillBase and simStackPtr are 0-relative */ - assert(((simStackAt(i))->spilled)); - } - if (simSpillBase <= index) { - for (i = (((simSpillBase < methodOrBlockNumTemps) ? methodOrBlockNumTemps : simSpillBase)); i <= index; i += 1) { - assert(needsFrame); - ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i), FPReg); - } - simSpillBase = index + 1; - } -} - /* Any occurrences on the stack of the value being stored (which is the top of stack) @@ -22695,15 +22842,24 @@ ssFlushTonativeFlushTo(sqInt index, sqInt nativeIndex) static void NoDbgRegParms ssFlushUpThroughReceiverVariable(sqInt slotIndex) { + sqInt i; sqInt index; /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == ReceiverResultReg) && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -22719,15 +22875,27 @@ ssFlushUpThroughReceiverVariable(sqInt slotIndex) static void NoDbgRegParms ssFlushUpThroughTemporaryVariable(sqInt tempIndex) { + sqInt i; sqInt index; + sqInt offset; + offset = ((simStackAt(tempIndex + 1))->offset); + assert(offset == (frameOffsetOfTemporary(tempIndex))); /* begin ssFlushUpThrough: */ - for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) { + assert(simSpillBase >= 0); + for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) { if (((((simStackAt(index))->type)) == SSBaseOffset) && (((((simStackAt(index))->registerr)) == FPReg) - && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) { + && ((((simStackAt(index))->offset)) == offset))) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(index, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= index) { + for (i = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i <= index; i += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i), frameOffsetOfTemporary(i - 1), FPReg); + } + simSpillBase = index + 1; + } goto l1; } } @@ -22738,11 +22906,33 @@ ssFlushUpThroughTemporaryVariable(sqInt tempIndex) static void NoDbgRegParms ssPop(sqInt n) { - assert(((simStackPtr - n) >= (methodOrBlockNumTemps - 1)) + sqInt i; + + assert(((simStackPtr - n) >= methodOrBlockNumTemps) || (((!needsFrame) - && ((simStackPtr - n) >= -1)) + && ((simStackPtr - n) >= 0)) || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))); simStackPtr -= n; + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } } /* StackToRegisterMappingCogit>>#ssPushAnnotatedConstant: */ @@ -22750,18 +22940,8 @@ static sqInt NoDbgRegParms ssPushAnnotatedConstant(sqInt literal) { AbstractInstruction *abstractInstruction; - CogSimStackEntry * cascade0; - ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } - cascade0 = ssTop(); - (cascade0->type = SSConstant); - (cascade0->spilled = 0); - (cascade0->constant = literal); - (cascade0->bcptr = bytecodePC); + ssPushConstant(literal); /* begin annotateInstructionForBytecode */ if (prevInstIsPCAnnotated()) { /* begin Nop */ @@ -22780,18 +22960,35 @@ static sqInt NoDbgRegParms ssPushBaseoffset(sqInt reg, sqInt offset) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSBaseOffset); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->offset = offset); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -22800,17 +22997,34 @@ static sqInt NoDbgRegParms ssPushConstant(sqInt literal) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSConstant); (cascade0->spilled = 0); (cascade0->constant = literal); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -22818,6 +23032,8 @@ ssPushConstant(sqInt literal) static sqInt NoDbgRegParms ssPushDesc(SimStackEntry simStackEntry) { + sqInt i; + if (((simStackEntry.type)) == SSSpill) { (simStackEntry.type = SSBaseOffset); } @@ -22825,8 +23041,24 @@ ssPushDesc(SimStackEntry simStackEntry) (simStackEntry.bcptr = bytecodePC); simStack[(simStackPtr += 1)] = simStackEntry; /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); } return 0; } @@ -22836,17 +23068,34 @@ static sqInt NoDbgRegParms ssPushRegister(sqInt reg) { CogSimStackEntry * cascade0; + sqInt i; ssPush(1); - /* begin updateSimSpillBase */ - if (simSpillBase > simStackPtr) { - simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr); - } cascade0 = ssTop(); (cascade0->type = SSRegister); (cascade0->spilled = 0); (cascade0->registerr = reg); (cascade0->bcptr = bytecodePC); + /* begin updateSimSpillBase */ + assert(((simSpillBase > methodOrBlockNumTemps) + && (simStackPtr >= methodOrBlockNumTemps)) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil())); + if (simSpillBase > simStackPtr) { + simSpillBase = simStackPtr + 1; + while (((simSpillBase - 1) > methodOrBlockNumTemps) + && (!(((simStackAt(simSpillBase - 1))->spilled)))) { + simSpillBase -= 1; + } + } + else { + while ((((simStackAt(simSpillBase))->spilled)) + && (simSpillBase <= simStackPtr)) { + simSpillBase += 1; + } + } + for (i = (methodOrBlockNumTemps + 1); i <= ((((simSpillBase - 1) < simStackPtr) ? (simSpillBase - 1) : simStackPtr)); i += 1) { + assert((((simStackAt(i))->spilled)) == 1); + } return 0; } @@ -22857,6 +23106,13 @@ ssPush(sqInt n) simStackPtr += n; } + /* StackToRegisterMappingCogit>>#ssSelfDescriptor */ +static SimStackEntry +ssSelfDescriptor(void) +{ + return simStack[0]; +} + /* In addition to ssStorePop:toReg:, if this is a store and not a popInto I change the simulated stack to use the register @@ -22924,13 +23180,6 @@ ssTop(void) return simStackAt(simStackPtr); } - /* StackToRegisterMappingCogit>>#ssTopDescriptor */ -static SimStackEntry -ssTopDescriptor(void) -{ - return simStack[simStackPtr]; -} - /* StackToRegisterMappingCogit>>#ssValue: */ static CogSimStackEntry * NoDbgRegParms ssValue(sqInt n) @@ -22948,6 +23197,37 @@ stackEntryIsBoolean(CogSimStackEntry *simStackEntry) } +/* Answer if the stack is valid up to, but not including, simSpillBase. */ + + /* StackToRegisterMappingCogit>>#tempsValidAndVolatileEntriesSpilled */ +static sqInt +tempsValidAndVolatileEntriesSpilled(void) +{ + sqInt culprit; + sqInt i; + + culprit = 0; + for (i = 1; i <= methodOrBlockNumTemps; i += 1) { + if (!(((((simStackAt(i))->type)) == SSBaseOffset) + || (maybeCompilingFirstPassOfBlockWithInitialPushNil()))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + for (i = (methodOrBlockNumTemps + 1); i < simSpillBase; i += 1) { + if (!(((simStackAt(i))->spilled))) { + if (!(culprit)) { + culprit = i; + } + return 0; + } + } + return 1; +} + + /* If the sequence of bytecodes is push: (Array new: 1) popIntoTemp: tempIndex @@ -23038,6 +23318,13 @@ v3NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMeth : 0); } + /* StackToRegisterMappingCogit>>#violatesEnsureSpilledSpillAssert */ +static sqInt +violatesEnsureSpilledSpillAssert(void) +{ + return 1; +} + /* Used when ReceiverResultReg is allocated for other than simSelf, and there may be references to ReceiverResultReg which need to be spilled. */ @@ -23047,18 +23334,26 @@ static void voidReceiverResultRegContainsSelf(void) { sqInt i; + sqInt i1; sqInt spillIndex; /* begin voidReceiverOptStatus */ - (optStatus.isReceiverResultRegLive = 0); - spillIndex = -1; - for (i = (((methodOrBlockNumTemps < simSpillBase) ? simSpillBase : methodOrBlockNumTemps)); i <= simStackPtr; i += 1) { + ((simSelf())->liveRegister = NoReg); + spillIndex = 0; + for (i = ((((methodOrBlockNumTemps + 1) < simSpillBase) ? simSpillBase : (methodOrBlockNumTemps + 1))); i <= simStackPtr; i += 1) { if ((registerOrNone(simStackAt(i))) == ReceiverResultReg) { spillIndex = i; } } if (spillIndex > 0) { /* begin ssFlushTo: */ - ssFlushTonativeFlushTo(simStackPtr - spillIndex, simNativeStackPtr); + assert(tempsValidAndVolatileEntriesSpilled()); + if (simSpillBase <= spillIndex) { + for (i1 = ((((((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) < simStackPtr) ? (((simSpillBase < (methodOrBlockNumTemps + 1)) ? (methodOrBlockNumTemps + 1) : simSpillBase)) : simStackPtr)); i1 <= spillIndex; i1 += 1) { + assert(needsFrame); + ensureSpilledAtfrom(simStackAt(i1), frameOffsetOfTemporary(i1 - 1), FPReg); + } + simSpillBase = spillIndex + 1; + } } } diff --git a/src/vm/cointerp.c b/src/vm/cointerp.c index adec6723cb..14b66faac8 100644 --- a/src/vm/cointerp.c +++ b/src/vm/cointerp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -481,7 +481,6 @@ extern void flushExternalPrimitiveOf(sqInt methodObj); static void flushMethodCache(void); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameNumArgs(char *theFP); @@ -1221,7 +1220,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2193,7 +2192,7 @@ static void (*primitiveTable[MaxPrimitiveIndex + 2 /* 577 */])(void) = { 0 }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[SqueakV3] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[SqueakV3] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -12180,24 +12179,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -18333,7 +18314,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -45632,7 +45621,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; @@ -50186,7 +50175,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -50203,7 +50200,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -50211,11 +50208,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -50249,7 +50246,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -53331,7 +53336,7 @@ static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt oop; @@ -53602,7 +53607,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt classOop; @@ -53631,23 +53635,20 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - -# if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = ((rcvr & 1)) - || ( + if ((rcvr & 1)) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY ((longAt(rcvr)) & (hex(ImmutabilityBit))) != 0 # else /* IMMUTABILITY */ 0 # endif /* IMMUTABILITY */ - ); -# else /* IMMUTABILITY */ - badRcvr = (rcvr & 1); -# endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } /* begin formatOf: */ @@ -53689,10 +53690,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l15; + goto l14; } value = value1; - goto l15; + goto l14; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ classOop = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(ClassLargePositiveInteger) << (shiftForWord()))))); @@ -53701,19 +53702,19 @@ primitiveSlotAtPut(void) ccIndex = (((usqInt) (longAt(newValue))) >> (compactClassFieldLSB())) & 0x1F; if (ccIndex == 0) { ok = ((longAt(newValue - BaseHeaderSize)) & AllButTypeMask) == classOop; - goto l14; + goto l13; } ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l14; + goto l13; ok = classOop == (fetchPointerofObject(ccIndex - 1, longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(CompactClasses) << (shiftForWord()))))))); - l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + l13: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } bs = numBytesOfBytes(newValue); if (bs > (sizeof(usqIntptr_t))) { @@ -53722,18 +53723,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((fetchLong64ofObject(0, newValue))); - goto l15; + goto l14; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l15; + goto l14; } - l15: /* end positiveMachineIntegerValueOf: */; + l14: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -53972,7 +53973,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/src/vm/cointerp.h b/src/vm/cointerp.h index 98ddcabf9f..5e5f2d3630 100644 --- a/src/vm/cointerp.h +++ b/src/vm/cointerp.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ @@ -256,6 +256,7 @@ extern sqInt literalofMethod(sqInt offset, sqInt methodPointer); extern void longPrintOop(sqInt oop); extern sqInt longStoreBytecodeForHeader(sqInt methodHeader); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodClassAssociationOf(sqInt methodPointer); extern sqInt methodClassOf(sqInt methodPointer); extern sqInt methodPrimitiveIndex(void); diff --git a/src/vm/cointerpmt.c b/src/vm/cointerpmt.c index aa087f8680..4d9f66906d 100644 --- a/src/vm/cointerpmt.c +++ b/src/vm/cointerpmt.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreterMT VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreterMT VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -537,7 +537,6 @@ static void NoDbgRegParms findNewMethodInClassTag(sqInt classTagArg); extern void flushExternalPrimitiveOf(sqInt methodObj); static void flushMethodCache(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameNumArgs(char *theFP); @@ -1302,7 +1301,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -1703,6 +1702,7 @@ sqInt deferDisplayUpdates; struct VirtualMachine* interpreterProxy; static void (*interruptCheckChain)(void) = 0; sqInt suppressHeartbeatFlag; +sqInt willNotThreadWarnCount; sqInt debugCallbackInvokes; sqInt debugCallbackReturns; static int (*sHEAFn)() = 0; @@ -2290,10 +2290,9 @@ static void (*primitiveTable[MaxPrimitiveIndex + 2 /* 577 */])(void) = { 0 }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; -sqInt willNotThreadWarnCount; /*** Macros ***/ @@ -12544,24 +12543,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -20791,7 +20772,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -47731,7 +47720,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; @@ -52252,7 +52241,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -52269,7 +52266,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -52277,11 +52274,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -52315,7 +52312,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -55334,7 +55339,7 @@ static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt oop; @@ -55605,7 +55610,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt classOop; @@ -55634,23 +55638,20 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - -# if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = ((rcvr & 1)) - || ( + if ((rcvr & 1)) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY ((longAt(rcvr)) & (hex(ImmutabilityBit))) != 0 # else /* IMMUTABILITY */ 0 # endif /* IMMUTABILITY */ - ); -# else /* IMMUTABILITY */ - badRcvr = (rcvr & 1); -# endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } /* begin formatOf: */ @@ -55692,10 +55693,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l15; + goto l14; } value = value1; - goto l15; + goto l14; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ classOop = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(ClassLargePositiveInteger) << (shiftForWord()))))); @@ -55704,19 +55705,19 @@ primitiveSlotAtPut(void) ccIndex = (((usqInt) (longAt(newValue))) >> (compactClassFieldLSB())) & 0x1F; if (ccIndex == 0) { ok = ((longAt(newValue - BaseHeaderSize)) & AllButTypeMask) == classOop; - goto l14; + goto l13; } ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l14; + goto l13; ok = classOop == (fetchPointerofObject(ccIndex - 1, longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(CompactClasses) << (shiftForWord()))))))); - l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + l13: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } bs = numBytesOfBytes(newValue); if (bs > (sizeof(usqIntptr_t))) { @@ -55725,18 +55726,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((fetchLong64ofObject(0, newValue))); - goto l15; + goto l14; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l15; + goto l14; } - l15: /* end positiveMachineIntegerValueOf: */; + l14: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -55975,7 +55976,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/src/vm/cointerpmt.h b/src/vm/cointerpmt.h index 0ebf1d3432..f6c553141a 100644 --- a/src/vm/cointerpmt.h +++ b/src/vm/cointerpmt.h @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ @@ -259,6 +259,7 @@ extern sqInt literalofMethod(sqInt offset, sqInt methodPointer); extern void longPrintOop(sqInt oop); extern sqInt longStoreBytecodeForHeader(sqInt methodHeader); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodClassAssociationOf(sqInt methodPointer); extern sqInt methodClassOf(sqInt methodPointer); extern sqInt methodPrimitiveIndex(void); diff --git a/src/vm/gcc3x-cointerp.c b/src/vm/gcc3x-cointerp.c index f072f71a2a..bcc4c17834 100644 --- a/src/vm/gcc3x-cointerp.c +++ b/src/vm/gcc3x-cointerp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -484,7 +484,6 @@ extern void flushExternalPrimitiveOf(sqInt methodObj); static void flushMethodCache(void); extern void forceInterruptCheckFromHeartbeat(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameNumArgs(char *theFP); @@ -1224,7 +1223,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -2196,7 +2195,7 @@ static void (*primitiveTable[MaxPrimitiveIndex + 2 /* 577 */])(void) = { 0 }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog[SqueakV3] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog[SqueakV3] VM [CoInterpreterPrimitives VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; @@ -12189,24 +12188,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -18342,7 +18323,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -45641,7 +45630,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; @@ -50195,7 +50184,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -50212,7 +50209,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -50220,11 +50217,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -50258,7 +50255,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -53340,7 +53345,7 @@ static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt oop; @@ -53611,7 +53616,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt classOop; @@ -53640,23 +53644,20 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - -# if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = ((rcvr & 1)) - || ( + if ((rcvr & 1)) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY ((longAt(rcvr)) & (hex(ImmutabilityBit))) != 0 # else /* IMMUTABILITY */ 0 # endif /* IMMUTABILITY */ - ); -# else /* IMMUTABILITY */ - badRcvr = (rcvr & 1); -# endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } /* begin formatOf: */ @@ -53698,10 +53699,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l15; + goto l14; } value = value1; - goto l15; + goto l14; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ classOop = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(ClassLargePositiveInteger) << (shiftForWord()))))); @@ -53710,19 +53711,19 @@ primitiveSlotAtPut(void) ccIndex = (((usqInt) (longAt(newValue))) >> (compactClassFieldLSB())) & 0x1F; if (ccIndex == 0) { ok = ((longAt(newValue - BaseHeaderSize)) & AllButTypeMask) == classOop; - goto l14; + goto l13; } ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l14; + goto l13; ok = classOop == (fetchPointerofObject(ccIndex - 1, longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(CompactClasses) << (shiftForWord()))))))); - l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + l13: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } bs = numBytesOfBytes(newValue); if (bs > (sizeof(usqIntptr_t))) { @@ -53731,18 +53732,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((fetchLong64ofObject(0, newValue))); - goto l15; + goto l14; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l15; + goto l14; } - l15: /* end positiveMachineIntegerValueOf: */; + l14: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -53981,7 +53982,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/src/vm/gcc3x-cointerpmt.c b/src/vm/gcc3x-cointerpmt.c index b4224cc177..2f9b228131 100644 --- a/src/vm/gcc3x-cointerpmt.c +++ b/src/vm/gcc3x-cointerpmt.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - CoInterpreterMT VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CoInterpreterMT VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "CoInterpreterMT VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -540,7 +540,6 @@ static void NoDbgRegParms findNewMethodInClassTag(sqInt classTagArg); extern void flushExternalPrimitiveOf(sqInt methodObj); static void flushMethodCache(void); static sqInt NoDbgRegParms frameCallerContext(char *theFP); -static sqInt NoDbgRegParms frameCallerContextput(char *theFP, sqInt aValue); static sqInt NoDbgRegParms frameHasContext(char *theFP); static sqInt NoDbgRegParms frameIsBlockActivation(char *theFP); static sqInt NoDbgRegParms frameNumArgs(char *theFP); @@ -1305,7 +1304,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -1706,6 +1705,7 @@ sqInt deferDisplayUpdates; struct VirtualMachine* interpreterProxy; static void (*interruptCheckChain)(void) = 0; sqInt suppressHeartbeatFlag; +sqInt willNotThreadWarnCount; sqInt debugCallbackInvokes; sqInt debugCallbackReturns; static int (*sHEAFn)() = 0; @@ -2293,10 +2293,9 @@ static void (*primitiveTable[MaxPrimitiveIndex + 2 /* 577 */])(void) = { 0 }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Cog MT VM [CoInterpreterMT VMMaker.oscog-eem.2347]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace; -sqInt willNotThreadWarnCount; /*** Macros ***/ @@ -12553,24 +12552,6 @@ frameCallerContext(char *theFP) return callerContextOrNil; } - -/* In the StackInterpreter the saved ip field of a base frame holds the - base frame's caller context. But in the Cog VM the first word on the - stack holds the base frame's caller context, which is immediately - above the stacked receiver. */ - - /* CoInterpreter>>#frameCallerContext:put: */ -static sqInt NoDbgRegParms -frameCallerContextput(char *theFP, sqInt aValue) -{ - assert(isBaseFrame(theFP)); - assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); - assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); - return longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) - ? ((mframeCogMethod(theFP))->cmNumArgs) - : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aValue); -} - /* CoInterpreter>>#frameHasContext: */ static sqInt NoDbgRegParms frameHasContext(char *theFP) @@ -20800,7 +20781,15 @@ primitiveTerminateTo(void) senderOop5 = longAt((thisCtx + BaseHeaderSize) + (((int)((usqInt)(SenderIndex) << (shiftForWord()))))); assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); - frameCallerContextput(theFP, aContextOrNil); + /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), aContextOrNil); } else { /* begin storePointer:ofObject:withValue: */ @@ -47740,7 +47729,7 @@ maybeLeakCheckExternalPrimCall(sqInt aMethodObj) to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; @@ -52261,7 +52250,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) StackPage *thePage1; if ((longAt(theFP + FoxSavedFP)) == 0) { - frameCallerContextput(theFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theFP)); + assert(((theFP + (frameStackedReceiverOffset(theFP))) + (2 * BytesPerWord)) == (((stackPageFor(theFP))->baseAddress))); + assert((longAt((theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)) == (frameContext(theFP))); + longAtput((theFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theFP))->cmNumArgs) + : byteAt((theFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theFP; } /* begin ensureCallerContext: */ @@ -52278,7 +52275,7 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) assert(addressCouldBeObj(callerContextOrNil)); assert((callerContextOrNil == (nilObject())) || (isContext(callerContextOrNil))); - goto l4; + goto l5; } /* begin ensureFrameIsMarried:SP: */ if (((((usqInt)(longAt(callerFP + FoxMethod)))) < (startOfMemory()) @@ -52286,11 +52283,11 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) : (byteAt((callerFP + FoxIFrameFlags) + 2)) != 0)) { assert(isContext(frameContext(callerFP))); longAt(callerFP + FoxThisContext); - goto l4; + goto l5; } marryFrameSP(callerFP, (assert(!(isBaseFrame(theFP))), (theFP + (frameStackedReceiverOffset(theFP))) + BytesPerWord)); - l4: /* end ensureCallerContext: */; + l5: /* end ensureCallerContext: */; /* begin stackPageFor: */ thePage = stackPageAtpages((assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages)))))), pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage))), GIV(pages)); @@ -52324,7 +52321,15 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) markStackPageMostRecentlyUsed(newPage); } assert(isBaseFrame(theMovedFP)); - frameCallerContextput(theMovedFP, anOop); + /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); + assert(isBaseFrame(theMovedFP)); + assert(((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + (2 * BytesPerWord)) == (((stackPageFor(theMovedFP))->baseAddress))); + assert((longAt((theMovedFP + (frameStackedReceiverOffset(theMovedFP))) + BytesPerWord)) == (frameContext(theMovedFP))); + longAtput((theMovedFP + (frameStackedReceiverOffsetNumArgs(((((usqInt)(longAt(theMovedFP + FoxMethod)))) < (startOfMemory()) + ? ((mframeCogMethod(theMovedFP))->cmNumArgs) + : byteAt((theMovedFP + FoxIFrameFlags) + 1))))) + (2 * BytesPerWord), anOop); return theMovedFP; } @@ -55343,7 +55348,7 @@ static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt oop; @@ -55614,7 +55619,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt classOop; @@ -55643,23 +55647,20 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - -# if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = ((rcvr & 1)) - || ( + if ((rcvr & 1)) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY ((longAt(rcvr)) & (hex(ImmutabilityBit))) != 0 # else /* IMMUTABILITY */ 0 # endif /* IMMUTABILITY */ - ); -# else /* IMMUTABILITY */ - badRcvr = (rcvr & 1); -# endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } /* begin formatOf: */ @@ -55701,10 +55702,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l15; + goto l14; } value = value1; - goto l15; + goto l14; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ classOop = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(ClassLargePositiveInteger) << (shiftForWord()))))); @@ -55713,19 +55714,19 @@ primitiveSlotAtPut(void) ccIndex = (((usqInt) (longAt(newValue))) >> (compactClassFieldLSB())) & 0x1F; if (ccIndex == 0) { ok = ((longAt(newValue - BaseHeaderSize)) & AllButTypeMask) == classOop; - goto l14; + goto l13; } ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l14; + goto l13; ok = classOop == (fetchPointerofObject(ccIndex - 1, longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(CompactClasses) << (shiftForWord()))))))); - l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + l13: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } bs = numBytesOfBytes(newValue); if (bs > (sizeof(usqIntptr_t))) { @@ -55734,18 +55735,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((fetchLong64ofObject(0, newValue))); - goto l15; + goto l14; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l15; + goto l14; } - l15: /* end positiveMachineIntegerValueOf: */; + l14: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -55984,7 +55985,7 @@ primitiveStoreStackp(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/stacksrc/vm/gcc3x-interp.c b/stacksrc/vm/gcc3x-interp.c index 5c44c73d91..c6eee4fb85 100644 --- a/stacksrc/vm/gcc3x-interp.c +++ b/stacksrc/vm/gcc3x-interp.c @@ -2,11 +2,11 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -970,7 +970,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -1952,7 +1952,7 @@ static void (*primitiveTable[MaxPrimitiveIndex + 2 /* 577 */])(void) = { 0 }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2347]"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -36271,7 +36271,7 @@ longAt((aMethodObj + BaseHeaderSize) + (((int)((usqInt)(HeaderIndex) << (shiftFo to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; @@ -41936,6 +41936,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -41990,6 +41992,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -45840,7 +45844,7 @@ static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt oop; @@ -46111,7 +46115,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt classOop; @@ -46140,23 +46143,20 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - -# if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = ((rcvr & 1)) - || ( + if ((rcvr & 1)) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY ((longAt(rcvr)) & (hex(ImmutabilityBit))) != 0 # else /* IMMUTABILITY */ 0 # endif /* IMMUTABILITY */ - ); -# else /* IMMUTABILITY */ - badRcvr = (rcvr & 1); -# endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } /* begin formatOf: */ @@ -46198,10 +46198,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l15; + goto l14; } value = value1; - goto l15; + goto l14; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ classOop = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(ClassLargePositiveInteger) << (shiftForWord()))))); @@ -46210,19 +46210,19 @@ primitiveSlotAtPut(void) ccIndex = (((usqInt) (longAt(newValue))) >> (compactClassFieldLSB())) & 0x1F; if (ccIndex == 0) { ok = ((longAt(newValue - BaseHeaderSize)) & AllButTypeMask) == classOop; - goto l14; + goto l13; } ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l14; + goto l13; ok = classOop == (fetchPointerofObject(ccIndex - 1, longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(CompactClasses) << (shiftForWord()))))))); - l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + l13: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } bs = numBytesOfBytes(newValue); if (bs > (sizeof(usqIntptr_t))) { @@ -46231,18 +46231,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((fetchLong64ofObject(0, newValue))); - goto l15; + goto l14; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l15; + goto l14; } - l15: /* end positiveMachineIntegerValueOf: */; + l14: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -46694,6 +46694,8 @@ primitiveTerminateTo(void) assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -46790,7 +46792,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform) diff --git a/stacksrc/vm/interp.c b/stacksrc/vm/interp.c index 8fea66aa33..269534f2b0 100644 --- a/stacksrc/vm/interp.c +++ b/stacksrc/vm/interp.c @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 from - StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 + StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2320 uuid: e2692e35-5fc8-4623-95d0-b445b3329f75 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.2347 uuid: 062614a7-e3da-4b30-997a-9568911b9ff5 " __DATE__ ; char *__interpBuildInfo = __buildInfo; @@ -967,7 +967,7 @@ static sqInt NoDbgRegParms marriedContextpointsTostackDeltaForCurrentFrame(sqInt static void NoDbgRegParms marryContextInNewStackPageAndInitializeInterpreterRegisters(sqInt aContext); static sqInt NoDbgRegParms marryFrameSP(char *theFP, char *theSP); static sqInt NoDbgRegParms maybeLeakCheckExternalPrimCall(sqInt aMethodObj); -static sqInt NoDbgRegParms maybeSelectorOfMethod(sqInt methodObj); +extern sqInt maybeSelectorOfMethod(sqInt methodObj); extern sqInt methodArgumentCount(void); extern sqInt methodArg(sqInt index); extern sqInt methodClassAssociationOf(sqInt methodPointer); @@ -1949,7 +1949,7 @@ static void (*primitiveTable[MaxPrimitiveIndex + 2 /* 577 */])(void) = { 0 }; sqInt checkedPluginName; char expensiveAsserts = 0; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2320]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreterPrimitives VMMaker.oscog-eem.2347]"; volatile int sendTrace; sqInt suppressHeartbeatFlag; @@ -36262,7 +36262,7 @@ longAt((aMethodObj + BaseHeaderSize) + (((int)((usqInt)(HeaderIndex) << (shiftFo to the enclosing block or compiled method. */ /* StackInterpreter>>#maybeSelectorOfMethod: */ -static sqInt NoDbgRegParms +sqInt maybeSelectorOfMethod(sqInt methodObj) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; @@ -41927,6 +41927,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) if ((longAt(theFP + FoxSavedFP)) == 0) { /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theFP + FoxCallerContext, anOop); return theFP; } @@ -41981,6 +41983,8 @@ storeSenderOfFramewithValue(char *theFP, sqInt anOop) } assert(isBaseFrame(theMovedFP)); /* begin frameCallerContext:put: */ + assert((anOop == (nilObject())) + || (isContext(anOop))); longAtput(theMovedFP + FoxCallerContext, anOop); return theMovedFP; } @@ -45831,7 +45835,7 @@ static void primitiveSignalAtMilliseconds(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT sqInt ccIndex; - usqLong deltaMsecs; + sqLong deltaMsecs; usqInt msecs; sqInt msecsObj; sqInt oop; @@ -46102,7 +46106,6 @@ primitiveSlotAt(void) static void primitiveSlotAtPut(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - sqInt badRcvr; sqInt bs; sqInt ccIndex; sqInt classOop; @@ -46131,23 +46134,20 @@ primitiveSlotAtPut(void) (GIV(primFailCode) = PrimErrBadArgument); return; } - -# if IMMUTABILITY - /* begin isOopImmutable: */ - badRcvr = ((rcvr & 1)) - || ( + if ((rcvr & 1)) { + /* begin primitiveFailFor: */ + (GIV(primFailCode) = PrimErrBadReceiver); + return; + } + if ( # if IMMUTABILITY ((longAt(rcvr)) & (hex(ImmutabilityBit))) != 0 # else /* IMMUTABILITY */ 0 # endif /* IMMUTABILITY */ - ); -# else /* IMMUTABILITY */ - badRcvr = (rcvr & 1); -# endif /* IMMUTABILITY */ - if (badRcvr) { + ) { /* begin primitiveFailFor: */ - (GIV(primFailCode) = PrimErrBadReceiver); + (GIV(primFailCode) = PrimErrNoModification); return; } /* begin formatOf: */ @@ -46189,10 +46189,10 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = null; - goto l15; + goto l14; } value = value1; - goto l15; + goto l14; } /* begin isClassOfNonImm:equalTo:compactClassIndex: */ classOop = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(ClassLargePositiveInteger) << (shiftForWord()))))); @@ -46201,19 +46201,19 @@ primitiveSlotAtPut(void) ccIndex = (((usqInt) (longAt(newValue))) >> (compactClassFieldLSB())) & 0x1F; if (ccIndex == 0) { ok = ((longAt(newValue - BaseHeaderSize)) & AllButTypeMask) == classOop; - goto l14; + goto l13; } ok = ClassLargePositiveIntegerCompactIndex == ccIndex; - goto l14; + goto l13; ok = classOop == (fetchPointerofObject(ccIndex - 1, longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((int)((usqInt)(CompactClasses) << (shiftForWord()))))))); - l14: /* end isClassOfNonImm:equalTo:compactClassIndex: */; + l13: /* end isClassOfNonImm:equalTo:compactClassIndex: */; if (!ok) { /* begin primitiveFail */ if (!GIV(primFailCode)) { GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } bs = numBytesOfBytes(newValue); if (bs > (sizeof(usqIntptr_t))) { @@ -46222,18 +46222,18 @@ primitiveSlotAtPut(void) GIV(primFailCode) = 1; } value = 0; - goto l15; + goto l14; } if (((sizeof(usqIntptr_t)) == 8) && (bs > 4)) { value = SQ_SWAP_8_BYTES_IF_BIGENDIAN((fetchLong64ofObject(0, newValue))); - goto l15; + goto l14; } else { value = ((unsigned int) (SQ_SWAP_4_BYTES_IF_BIGENDIAN((long32At((newValue + BaseHeaderSize) + (0U << 2)))))); - goto l15; + goto l14; } - l15: /* end positiveMachineIntegerValueOf: */; + l14: /* end positiveMachineIntegerValueOf: */; if (GIV(primFailCode)) { GIV(primFailCode) = PrimErrBadArgument; return; @@ -46685,6 +46685,8 @@ primitiveTerminateTo(void) assert((senderOop5 & 1)); theFP = pointerForOop(senderOop5 - 1); /* begin frameCallerContext:put: */ + assert((aContextOrNil == (nilObject())) + || (isContext(aContextOrNil))); longAtput(theFP + FoxCallerContext, aContextOrNil); } else { @@ -46781,7 +46783,7 @@ primitiveTerminateTo(void) (read-only; Cog only; otherwise nil) 64 the number of methods that currently have jitted machine-code 65 whether the VM supports a certain feature, MULTIPLE_BYTECODE_SETS is - bit 0, IMMTABILITY is bit 1 + bit 0, IMMUTABILITY is bit 1 66 the byte size of a stack page 67 the max allowed size of old space (Spur only; nil otherwise; 0 implies no limit except that of the underlying platform)