[Vm-dev] [commit][3423] CogVM source as per VMMaker.oscog-eem.1435

commits at squeakvm.org commits at squeakvm.org
Tue Aug 18 00:29:36 UTC 2015


Revision: 3423
Author:   eliot
Date:     2015-08-17 17:29:33 -0700 (Mon, 17 Aug 2015)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.1435

Fix negative 64-bit shift in the 64-bit Spur interpreter.

Finally merge and refactor [Co]InterpreterStackPages into these plus a common
superclass CogStackPages.  Rename InterpreterStackPage to CogStackPage.  Add
stats to compute the average and maximum number of live pages at map.

Make marshallAbsentReceiverSendArguments: use wordSize instead of BytesPerWord.

Add the V46 source files to the sources collection.

Make the Newspeak VM packager include the V50 sources file instead of V41.
Ryan has already moved the Newspeak bootstrap to Squeak 5.0 Spur!

Modified Paths:
--------------
    branches/Cog/build.linux32ARM/editnewspeakinstall.sh
    branches/Cog/build.linux32x86/editnewspeakinstall.sh
    branches/Cog/build.linux64x64/editnewspeakinstall.sh
    branches/Cog/nsspursrc/vm/cogit.h
    branches/Cog/nsspursrc/vm/cogitARMv5.c
    branches/Cog/nsspursrc/vm/cogitIA32.c
    branches/Cog/nsspursrc/vm/cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.h
    branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspurstack64src/vm/gcc3x-interp.c
    branches/Cog/nsspurstack64src/vm/interp.c
    branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
    branches/Cog/nsspurstacksrc/vm/interp.c
    branches/Cog/spursistasrc/vm/cogit.h
    branches/Cog/spursistasrc/vm/cogitARMv5.c
    branches/Cog/spursistasrc/vm/cogitIA32.c
    branches/Cog/spursistasrc/vm/cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.h
    branches/Cog/spursistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/cogit.h
    branches/Cog/spursrc/vm/cogitARMv5.c
    branches/Cog/spursrc/vm/cogitIA32.c
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/spurstack64src/vm/gcc3x-interp.c
    branches/Cog/spurstack64src/vm/interp.c
    branches/Cog/spurstacksrc/vm/gcc3x-interp.c
    branches/Cog/spurstacksrc/vm/interp.c
    branches/Cog/src/vm/cogit.h
    branches/Cog/src/vm/cogitARMv5.c
    branches/Cog/src/vm/cogitIA32.c
    branches/Cog/src/vm/cointerp.c
    branches/Cog/src/vm/cointerp.h
    branches/Cog/src/vm/cointerpmt.c
    branches/Cog/src/vm/cointerpmt.h
    branches/Cog/src/vm/gcc3x-cointerp.c
    branches/Cog/src/vm/gcc3x-cointerpmt.c
    branches/Cog/stacksrc/vm/gcc3x-interp.c
    branches/Cog/stacksrc/vm/interp.c

Added Paths:
-----------
    branches/Cog/sources/SqueakV46.sources

Property Changed:
----------------
    branches/Cog/platforms/Cross/vm/sqSCCSVersion.h

Modified: branches/Cog/build.linux32ARM/editnewspeakinstall.sh
===================================================================
--- branches/Cog/build.linux32ARM/editnewspeakinstall.sh	2015-08-12 17:30:04 UTC (rev 3422)
+++ branches/Cog/build.linux32ARM/editnewspeakinstall.sh	2015-08-18 00:29:33 UTC (rev 3423)
@@ -2,8 +2,8 @@
 # Edit the installed directory tree to rename squeak to nsvm and install source
 INSTALLDIR="$1"
 cd $INSTALLDIR
-SOURCE=../../sources/SqueakV41.sources
-test -f $SOURCE || SOURCE=../../../sources/SqueakV41.sources
+SOURCE=../../sources/SqueakV50.sources
+test -f $SOURCE || SOURCE=../../../sources/SqueakV50.sources
 if [ -f squeak ]; then
 	mv squeak nsvm
 	ex -u NONE "+g/squeak/s/squeak/nsvm/g" +w +q nsvm

Modified: branches/Cog/build.linux32x86/editnewspeakinstall.sh
===================================================================
--- branches/Cog/build.linux32x86/editnewspeakinstall.sh	2015-08-12 17:30:04 UTC (rev 3422)
+++ branches/Cog/build.linux32x86/editnewspeakinstall.sh	2015-08-18 00:29:33 UTC (rev 3423)
@@ -2,8 +2,8 @@
 # Edit the installed directory tree to rename squeak to nsvm and install source
 INSTALLDIR="$1"
 cd $INSTALLDIR
-SOURCE=../../sources/SqueakV41.sources
-test -f $SOURCE || SOURCE=../../../sources/SqueakV41.sources
+SOURCE=../../sources/SqueakV50.sources
+test -f $SOURCE || SOURCE=../../../sources/SqueakV50.sources
 if [ -f squeak ]; then
 	mv squeak nsvm
 	ex -u NONE "+g/squeak/s/squeak/nsvm/g" +w +q nsvm

Modified: branches/Cog/build.linux64x64/editnewspeakinstall.sh
===================================================================
--- branches/Cog/build.linux64x64/editnewspeakinstall.sh	2015-08-12 17:30:04 UTC (rev 3422)
+++ branches/Cog/build.linux64x64/editnewspeakinstall.sh	2015-08-18 00:29:33 UTC (rev 3423)
@@ -2,8 +2,8 @@
 # Edit the installed directory tree to rename squeak to nsvm and install source
 INSTALLDIR="$1"
 cd $INSTALLDIR
-SOURCE=../../sources/SqueakV41.sources
-test -f $SOURCE || SOURCE=../../../sources/SqueakV41.sources
+SOURCE=../../sources/SqueakV50.sources
+test -f $SOURCE || SOURCE=../../../sources/SqueakV50.sources
 if [ -f squeak ]; then
 	mv squeak nsvm
 	ex -u NONE "+g/squeak/s/squeak/nsvm/g" +w +q nsvm

Modified: branches/Cog/nsspursrc/vm/cogit.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.h	2015-08-12 17:30:04 UTC (rev 3422)
+++ branches/Cog/nsspursrc/vm/cogit.h	2015-08-18 00:29:33 UTC (rev 3423)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027
+	CCodeGenerator VMMaker.oscog-eem.1435 uuid: 114c4214-dede-4f25-9bbb-c912623d0ef4
  */
 
 

Modified: branches/Cog/nsspursrc/vm/cogitARMv5.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogitARMv5.c	2015-08-12 17:30:04 UTC (rev 3422)
+++ branches/Cog/nsspursrc/vm/cogitARMv5.c	2015-08-18 00:29:33 UTC (rev 3423)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027
+	CCodeGenerator VMMaker.oscog-eem.1432 uuid: 926b6e9a-689f-411b-8b70-baa322cf73e7
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1432 uuid: 926b6e9a-689f-411b-8b70-baa322cf73e7
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1432 uuid: 926b6e9a-689f-411b-8b70-baa322cf73e7 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -10869,12 +10869,12 @@
 generateMapAtstart(sqInt addressOrNull, sqInt startAddress)
 {
     unsigned char annotation;
-    usqInt delta;
+    sqInt delta;
     sqInt i;
     AbstractInstruction *instruction;
     sqInt length;
-    usqInt location;
-    usqInt mapEntry;
+    sqInt location;
+    sqInt mapEntry;
     sqInt maxDelta;
     usqInt mcpc;
 

Modified: branches/Cog/nsspursrc/vm/cogitIA32.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogitIA32.c	2015-08-12 17:30:04 UTC (rev 3422)
+++ branches/Cog/nsspursrc/vm/cogitIA32.c	2015-08-18 00:29:33 UTC (rev 3423)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027
+	CCodeGenerator VMMaker.oscog-eem.1432 uuid: 926b6e9a-689f-411b-8b70-baa322cf73e7
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1432 uuid: 926b6e9a-689f-411b-8b70-baa322cf73e7
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1432 uuid: 926b6e9a-689f-411b-8b70-baa322cf73e7 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 

Modified: branches/Cog/nsspursrc/vm/cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.c	2015-08-12 17:30:04 UTC (rev 3422)
+++ branches/Cog/nsspursrc/vm/cointerp.c	2015-08-18 00:29:33 UTC (rev 3423)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1435 uuid: 114c4214-dede-4f25-9bbb-c912623d0ef4
    from
-	CoInterpreter VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027
+	CoInterpreter VMMaker.oscog-eem.1435 uuid: 114c4214-dede-4f25-9bbb-c912623d0ef4
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1435 uuid: 114c4214-dede-4f25-9bbb-c912623d0ef4 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -122,7 +122,7 @@
 	struct _StackPage *prevPage;
  } StackPage;
 
-#define InterpreterStackPage StackPage
+#define CogStackPage StackPage
 
 
 
@@ -420,6 +420,17 @@
 
 extern sqInt interpret(void);
 static CogMethod * cmHomeMethod(CogBlockMethod * self_in_cmHomeMethod) NoDbgRegParms;
+static sqInt addressIsInPage(StackPage * self_in_addressIsInPage, char *address) NoDbgRegParms;
+static sqInt isFree(StackPage * self_in_isFree) NoDbgRegParms;
+static void freeStackPageNoAssert(StackPage *aPage) NoDbgRegParms;
+static sqInt freeStackPage(StackPage *aPage) NoDbgRegParms;
+static void markStackPageMostRecentlyUsed(StackPage *page) NoDbgRegParms;
+static void markStackPageNextMostRecentlyUsed(StackPage *page) NoDbgRegParms;
+static StackPage * newStackPage(void);
+static sqInt pageListIsWellFormed(void);
+static StackPage * stackPageAt(sqInt index) NoDbgRegParms;
+static StackPage * stackPageFor(void *pointer) NoDbgRegParms;
+static double statAverageLivePagesWhenMapping(void);
 extern signed char accessorDepthForPrimitiveIndex(sqInt primIndex);
 static void activateCoggedNewMethod(sqInt inInterpreter) NoDbgRegParms;
 static void activateNewMethod(void);
@@ -627,15 +638,8 @@
 static void primitiveWait(void);
 static void primitiveYield(void);
 static void unmarkAllFrames(void);
-static void freeStackPageNoAssert(StackPage *aPage) NoDbgRegParms;
-static sqInt freeStackPage(StackPage *aPage) NoDbgRegParms;
 static void initializeStacknumSlotspageSize(char *theStackPages, sqInt stackSlots, sqInt slotsPerPage) NoDbgRegParms;
-static void markStackPageMostRecentlyUsed(StackPage *page) NoDbgRegParms;
-static void markStackPageNextMostRecentlyUsed(StackPage *page) NoDbgRegParms;
 static sqInt pageIndexFor(void *pointer) NoDbgRegParms;
-static sqInt pageListIsWellFormed(void);
-static StackPage * stackPageAt(sqInt index) NoDbgRegParms;
-static StackPage * stackPageFor(void *pointer) NoDbgRegParms;
 extern char * cStringOrNullFor(sqInt oop);
 extern sqInt failed(void);
 static sqInt isNegativeIntegerValueOf(sqInt oop) NoDbgRegParms;
@@ -831,8 +835,6 @@
 extern usqInt sizeOfAlienData(sqInt oop);
 extern void * startOfAlienData(sqInt oop);
 extern sqInt success(sqInt successBoolean);
-static sqInt addressIsInPage(StackPage * self_in_addressIsInPage, char *address) NoDbgRegParms;
-static sqInt isFree(StackPage * self_in_isFree) NoDbgRegParms;
 extern sqInt ceClassAtIndex(sqInt classIndex);
 extern void ceScheduleScavenge(void);
 static void clearLeakMapAndMapAccessibleObjects(void);
@@ -1407,7 +1409,6 @@
 extern sqInt methodUsesAlternateBytecodeSet(sqInt aMethodObj);
 EXPORT(void) moduleUnloaded(char *aModuleName);
 static char * nameOfClass(sqInt classOop) NoDbgRegParms;
-static StackPage * newStackPage(void);
 static sqInt noInlineSigned32BitIntegerFor(sqInt integerValue) NoDbgRegParms;
 static sqInt noInlineTemporaryin(sqInt offset, char *theFP) NoDbgRegParms;
 static sqInt noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop) NoDbgRegParms;
@@ -1620,11 +1621,11 @@
 _iss sqInt remapBufferCount;
 _iss sqInt localAbsentReceiverOrZero;
 _iss usqInt freeListsMask;
+_iss StackPage * mostRecentlyUsedPage;
 _iss usqInt firstFreeChunk;
 _iss sqInt longRunningPrimitiveCheckSemaphore;
 _iss SpurContiguousObjStack unscannedEphemerons;
 _iss sqInt numStackPages;
-_iss StackPage * mostRecentlyUsedPage;
 _iss SpurNewSpaceSpace pastSpace;
 _iss sqInt longRunningPrimitiveCheckMethod;
 _iss usqInt oldSpaceStart;
@@ -1720,6 +1721,9 @@
 _iss sqInt statCodeCompactionCount;
 _iss usqLong statCodeCompactionUsecs;
 _iss sqInt statMarkCount;
+_iss sqInt statMaxPageCountWhenMapping;
+_iss sqInt statNumMaps;
+_iss sqInt statPageCountWhenMappingSum;
 _iss sqInt statRootTableCount;
 _iss sqInt tenuringProportion;
 _iss sqInt classByteArrayCompactIndex;
@@ -2411,7 +2415,7 @@
 /*560*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1
 	};
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1430";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1435";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -2421,6 +2425,9 @@
 #define cPICNumCasesHack hack hack hack i.e. the getter macro does all the work
 #define nextOpenPIC methodObject
 #define nextOpenPICHack hack hack hack i.e. the getter macro does all the work
+#define mostRecentlyUsedPage() GIV(mostRecentlyUsedPage)
+#define stackPageAtpages(index,pages) ((pages) + (index))
+#define statMaxPageCountWhenMapping() GIV(statMaxPageCountWhenMapping)
 #define compilationBreakpointisMNUCase(sel, len, isMNU) do { \
 	if ((len) == (isMNU ? -breakSelectorLength : breakSelectorLength) \
 	 && !strncmp((char *)((sel) + BaseHeaderSize), breakSelector, (isMNU ? -breakSelectorLength : breakSelectorLength))) { \
@@ -2444,9 +2451,7 @@
 } while (0)
 #define primTraceLogIndex(aValue) (GIV(primTraceLogIndex) = (aValue))
 #define setDesiredCogCodeSize(dccs) (desiredCogCodeSize = (dccs))
-#define mostRecentlyUsedPage() GIV(mostRecentlyUsedPage)
 #define pageIndexForstackBasePlus1bytesPerPage(pointer,stkBasePlus1,pageByteSize) (((char *)(pointer) - (stkBasePlus1)) / (pageByteSize))
-#define stackPageAtpages(index,pages) ((pages) + (index))
 #define startOfMemory() heapBase
 #define shiftForWord() 2
 #define wordSize() 4
@@ -2513,7 +2518,7 @@
 		stackPageBytes = stackPageByteSize();
 		/* begin computeStackZoneSize */
 		null;
-		stackPagesBytes = (GIV(numStackPages) * ((sizeof(InterpreterStackPage)) + (stackPageByteSize()))) + BytesPerWord;
+		stackPagesBytes = (GIV(numStackPages) * ((sizeof(CogStackPage)) + (stackPageByteSize()))) + BytesPerWord;
 		theStackMemory = alloca(stackPagesBytes);
 		memset(theStackMemory, 0, stackPagesBytes);
 		sqMakeMemoryNotExecutableFromTo(((usqInt)(startOfMemory())), ((usqInt)GIV(endOfMemory)));
@@ -5280,8 +5285,8 @@
 						/* begin stackPageAt: */
 						/* begin pageIndexFor: */
 						assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages))))));
-						index2 = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
-						thePage1 = stackPageAtpages(index2, GIV(pages));
+						index = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
+						thePage1 = stackPageAtpages(index, GIV(pages));
 						callerContextOrNil = longAt((thePage1->baseAddress));
 						assert(addressCouldBeObj(callerContextOrNil));
 						assert((callerContextOrNil == (nilObject()))
@@ -5340,8 +5345,8 @@
 				/* begin stackPageAt: */
 				/* begin pageIndexFor: */
 				assert((((((char *) frameToReturnTo)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) frameToReturnTo)) <= (((char *) GIV(pages))))));
-				index1 = pageIndexForstackBasePlus1bytesPerPage(frameToReturnTo, GIV(stackBasePlus1), GIV(bytesPerPage));
-				newPage = stackPageAtpages(index1, GIV(pages));
+				index4 = pageIndexForstackBasePlus1bytesPerPage(frameToReturnTo, GIV(stackBasePlus1), GIV(bytesPerPage));
+				newPage = stackPageAtpages(index4, GIV(pages));
 				if (newPage != GIV(stackPage)) {
 					/* begin frameCallerContext: */
 					theFP2 = (GIV(stackPage)->baseFP);
@@ -5350,8 +5355,8 @@
 					/* begin stackPageAt: */
 					/* begin pageIndexFor: */
 					assert((((((char *) theFP2)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP2)) <= (((char *) GIV(pages))))));
-					index4 = pageIndexForstackBasePlus1bytesPerPage(theFP2, GIV(stackBasePlus1), GIV(bytesPerPage));
-					thePage3 = stackPageAtpages(index4, GIV(pages));
+					index3 = pageIndexForstackBasePlus1bytesPerPage(theFP2, GIV(stackBasePlus1), GIV(bytesPerPage));
+					thePage3 = stackPageAtpages(index3, GIV(pages));
 					callerContextOrNil2 = longAt((thePage3->baseAddress));
 					assert(addressCouldBeObj(callerContextOrNil2));
 					assert((callerContextOrNil2 == (nilObject()))
@@ -5367,8 +5372,8 @@
 							/* begin stackPageAt: */
 							/* begin pageIndexFor: */
 							assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages))))));
-							index = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
-							thePage = stackPageAtpages(index, GIV(pages));
+							index1 = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
+							thePage = stackPageAtpages(index1, GIV(pages));
 							if (theFP != ((thePage->headFP))) {
 
 								/* Since we've just deallocated a page we know that newStackPage won't deallocate an existing one. */
@@ -5382,8 +5387,8 @@
 							/* begin stackPageAt: */
 							/* begin pageIndexFor: */
 							assert((((((char *) theFP1)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP1)) <= (((char *) GIV(pages))))));
-							index3 = pageIndexForstackBasePlus1bytesPerPage(theFP1, GIV(stackBasePlus1), GIV(bytesPerPage));
-							thePage2 = stackPageAtpages(index3, GIV(pages));
+							index2 = pageIndexForstackBasePlus1bytesPerPage(theFP1, GIV(stackBasePlus1), GIV(bytesPerPage));
+							thePage2 = stackPageAtpages(index2, GIV(pages));
 							callerContextOrNil1 = longAt((thePage2->baseAddress));
 							assert(addressCouldBeObj(callerContextOrNil1));
 							assert((callerContextOrNil1 == (nilObject()))
@@ -5604,8 +5609,8 @@
 							frameAbove = 0;
 						l235:	/* end findFrameAbove:inPage: */;
 							/* begin newStackPage */
-							lruOrFree = ((mostRecentlyUsedPage())->nextPage);
-							if (isFree(lruOrFree)) {
+							lruOrFree = (GIV(mostRecentlyUsedPage)->nextPage);
+							if (((lruOrFree->baseFP)) == 0) {
 								newPage = lruOrFree;
 								goto l236;
 							}
@@ -15274,6 +15279,238 @@
 	return ((CogMethod *) ((((usqInt)self_in_cmHomeMethod)) - ((self_in_cmHomeMethod->homeOffset))));
 }
 
+
+/*	For assert-checking */
+
+	/* CogStackPage>>#addressIsInPage: */
+static sqInt
+addressIsInPage(StackPage * self_in_addressIsInPage, char *address)
+{
+	return (((self_in_addressIsInPage->lastAddress)) < address)
+	 && (address < ((self_in_addressIsInPage->baseAddress)));
+}
+
+	/* CogStackPage>>#isFree */
+static sqInt
+isFree(StackPage * self_in_isFree)
+{
+	return ((self_in_isFree->baseFP)) == 0;
+}
+
+
+/*	<InterpreterStackPage> */
+/*	MRUP-->used page<->used page<->used page<->used page<--LRUP
+	^ <-next-prev-> ^
+	| |
+	v <-prev-next-> v
+	free page<->free page<->free page<->free page */
+
+	/* CogStackPages>>#freeStackPageNoAssert: */
+static void
+freeStackPageNoAssert(StackPage *aPage)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    StackPage *prev;
+
+	(aPage->baseFP = 0);
+	if (aPage == GIV(mostRecentlyUsedPage)) {
+		GIV(mostRecentlyUsedPage) = (GIV(mostRecentlyUsedPage)->prevPage);
+		return;
+	}
+	if ((((prev = (aPage->prevPage))->baseFP)) == 0) {
+		return;
+	}
+	(prev->nextPage = (aPage->nextPage));
+	(((aPage->nextPage))->prevPage = prev);
+	(aPage->nextPage = (GIV(mostRecentlyUsedPage)->nextPage));
+	(((GIV(mostRecentlyUsedPage)->nextPage))->prevPage = aPage);
+	(aPage->prevPage = GIV(mostRecentlyUsedPage));
+	(GIV(mostRecentlyUsedPage)->nextPage = aPage);
+}
+
+
+/*	<InterpreterStackPage> */
+/*	MRUP-->used page<->used page<->used page<->used page<--LRUP
+	^ <-next-prev-> ^
+	| |
+	v <-prev-next-> v
+	free page<->free page<->free page<->free page */
+
+	/* CogStackPages>>#freeStackPage: */
+static sqInt
+freeStackPage(StackPage *aPage)
+{
+	freeStackPageNoAssert(aPage);
+	assert(pageListIsWellFormed());
+}
+
+
+/*	<InterpreterStackPage> */
+/*	MRUP-->used page<->used page<->used page<->used page<--LRUP
+	^ <-next-prev-> ^
+	| |
+	v <-prev-next-> v
+	free page<->free page<->free page<->free page */
+
+	/* CogStackPages>>#markStackPageMostRecentlyUsed: */
+static void
+markStackPageMostRecentlyUsed(StackPage *page)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+	if (page == GIV(mostRecentlyUsedPage)) {
+		return;
+	}
+	if (((page->prevPage)) == GIV(mostRecentlyUsedPage)) {
+		GIV(mostRecentlyUsedPage) = page;
+		assert(pageListIsWellFormed());
+		return;
+	}
+	(((page->prevPage))->nextPage = (page->nextPage));
+	(((page->nextPage))->prevPage = (page->prevPage));
+	(((GIV(mostRecentlyUsedPage)->nextPage))->prevPage = page);
+	(page->prevPage = GIV(mostRecentlyUsedPage));
+	(page->nextPage = (GIV(mostRecentlyUsedPage)->nextPage));
+	(GIV(mostRecentlyUsedPage)->nextPage = page);
+	GIV(mostRecentlyUsedPage) = page;
+	assert(pageListIsWellFormed());
+}
+
+
+/*	<InterpreterStackPage> */
+/*	This method is used to move a page to a position in the list such that it
+	cannot be deallocated when a new page is allocated, without changing the
+	most recently
+	used page. There must be at least 3 pages in the system. So making the
+	page the MRU's prevPage is sufficient to ensure it won't be deallocated. */
+/*	MRUP-->used page<->used page<->used page<->used page<--LRUP
+	^ <-next-prev-> ^
+	| |
+	v <-prev-next-> v
+	free page<->free page<->free page<->free page */
+
+	/* CogStackPages>>#markStackPageNextMostRecentlyUsed: */
+static void
+markStackPageNextMostRecentlyUsed(StackPage *page)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+	assert(page != GIV(mostRecentlyUsedPage));
+	if (((page->nextPage)) == GIV(mostRecentlyUsedPage)) {
+		return;
+	}
+	(((page->prevPage))->nextPage = (page->nextPage));
+	(((page->nextPage))->prevPage = (page->prevPage));
+	(((GIV(mostRecentlyUsedPage)->prevPage))->nextPage = page);
+	(page->prevPage = (GIV(mostRecentlyUsedPage)->prevPage));
+	(page->nextPage = GIV(mostRecentlyUsedPage));
+	(GIV(mostRecentlyUsedPage)->prevPage = page);
+	assert(pageListIsWellFormed());
+}
+
+
+/*	MRUP-->used page<->used page<->used page<->used page<--LRUP
+	^ <-next-prev-> ^
+	| |
+	v <-prev-next-> v
+	free page<->free page<->free page<->free page */
+
+	/* CogStackPages>>#newStackPage */
+static StackPage *
+newStackPage(void)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    StackPage *lruOrFree;
+
+	lruOrFree = (GIV(mostRecentlyUsedPage)->nextPage);
+	if (((lruOrFree->baseFP)) == 0) {
+		return lruOrFree;
+	}
+	divorceFramesIn(lruOrFree);
+	return lruOrFree;
+}
+
+
+/*	Answer if the stack page list is well-formed.
+	MRUP-->used page<->used page<->used page<->used page<--LRUP
+	^ <-next-prev-> ^
+	| |
+	v <-prev-next-> v
+	free page<->free page<->free page<->free page */
+
+	/* CogStackPages>>#pageListIsWellFormed */
+static sqInt
+pageListIsWellFormed(void)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt count;
+    sqInt limit;
+    sqInt ok;
+    StackPage *page;
+
+	ok = 1;
+	page = (GIV(mostRecentlyUsedPage)->nextPage);
+	count = 1;
+	limit = GIV(numStackPages) * 2;
+	while ((((page->baseFP)) == 0)
+	 && ((page != GIV(mostRecentlyUsedPage))
+	 && (count <= limit))) {
+		if (!(asserta(((((page->nextPage))->prevPage)) == page))) {
+			ok = 0;
+		}
+		page = (page->nextPage);
+		count += 1;
+	}
+	while ((page != GIV(mostRecentlyUsedPage))
+	 && (count <= limit)) {
+		if (!(asserta(((((page->nextPage))->prevPage)) == page))) {
+			ok = 0;
+		}
+		if (asserta(!(isFree(page)))) {
+			if (!(asserta((addressIsInPage(page, (page->baseFP)))
+				 && (addressIsInPage(page, (page->headSP)))))) {
+				ok = 0;
+			}
+		}
+		else {
+			ok = 0;
+		}
+		page = (page->nextPage);
+		count += 1;
+	}
+	if (!(asserta(count == (numStkPages())))) {
+		ok = 0;
+	}
+	return ok;
+}
+
+
+/*	Answer the page for a page index.
+	N.B. This is a zero-relative index. */
+
+	/* CogStackPages>>#stackPageAt: */
+static StackPage *
+stackPageAt(sqInt index)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+	return stackPageAtpages(index, GIV(pages));
+}
+
+
+/*	<Integer> */
+
+	/* CogStackPages>>#stackPageFor: */
+static StackPage *
+stackPageFor(void *pointer)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+    sqInt index;
+
+	/* begin stackPageAt: */
+	/* begin pageIndexFor: */
+	assert((((((char *) pointer)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) pointer)) <= (((char *) GIV(pages))))));
+	index = pageIndexForstackBasePlus1bytesPerPage(pointer, GIV(stackBasePlus1), GIV(bytesPerPage));
+	return stackPageAtpages(index, GIV(pages));
+}
+
+	/* CogStackPages>>#statAverageLivePagesWhenMapping */
+static double
+statAverageLivePagesWhenMapping(void)
+{   DECL_MAYBE_SQ_GLOBAL_STRUCT
+	return (((double) GIV(statPageCountWhenMappingSum) )) / GIV(statNumMaps);
+}
+
 	/* CoInterpreter>>#accessorDepthForPrimitiveIndex: */
 signed char
 accessorDepthForPrimitiveIndex(sqInt primIndex)
@@ -16209,8 +16446,8 @@
 			frameAbove = 0;
 		l1:	/* end findFrameAbove:inPage: */;
 			/* begin newStackPage */
-			lruOrFree = ((mostRecentlyUsedPage())->nextPage);
-			if (isFree(lruOrFree)) {
+			lruOrFree = (GIV(mostRecentlyUsedPage)->nextPage);
+			if (((lruOrFree->baseFP)) == 0) {
 				newPage = lruOrFree;
 				goto l2;
 			}
@@ -17155,8 +17392,8 @@
 			/* begin stackPageAt: */
 			/* begin pageIndexFor: */
 			assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages))))));
-			index = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
-			thePage1 = stackPageAtpages(index, GIV(pages));
+			index2 = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
+			thePage1 = stackPageAtpages(index2, GIV(pages));
 			callerContextOrNil = longAt((thePage1->baseAddress));
 			assert(addressCouldBeObj(callerContextOrNil));
 			assert((callerContextOrNil == (nilObject()))
@@ -17217,8 +17454,8 @@
 	/* begin stackPageAt: */
 	/* begin pageIndexFor: */
 	assert((((((char *) frameToReturnTo)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) frameToReturnTo)) <= (((char *) GIV(pages))))));
-	index4 = pageIndexForstackBasePlus1bytesPerPage(frameToReturnTo, GIV(stackBasePlus1), GIV(bytesPerPage));
-	newPage = stackPageAtpages(index4, GIV(pages));
+	index1 = pageIndexForstackBasePlus1bytesPerPage(frameToReturnTo, GIV(stackBasePlus1), GIV(bytesPerPage));
+	newPage = stackPageAtpages(index1, GIV(pages));
 	if (newPage != GIV(stackPage)) {
 		/* begin frameCallerContext: */
 		theFP2 = (GIV(stackPage)->baseFP);
@@ -17227,8 +17464,8 @@
 		/* begin stackPageAt: */
 		/* begin pageIndexFor: */
 		assert((((((char *) theFP2)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP2)) <= (((char *) GIV(pages))))));
-		index3 = pageIndexForstackBasePlus1bytesPerPage(theFP2, GIV(stackBasePlus1), GIV(bytesPerPage));
-		thePage3 = stackPageAtpages(index3, GIV(pages));
+		index4 = pageIndexForstackBasePlus1bytesPerPage(theFP2, GIV(stackBasePlus1), GIV(bytesPerPage));
+		thePage3 = stackPageAtpages(index4, GIV(pages));
 		callerContextOrNil2 = longAt((thePage3->baseAddress));
 		assert(addressCouldBeObj(callerContextOrNil2));
 		assert((callerContextOrNil2 == (nilObject()))
@@ -17245,8 +17482,8 @@
 				/* begin stackPageAt: */
 				/* begin pageIndexFor: */
 				assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages))))));
-				index1 = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
-				thePage = stackPageAtpages(index1, GIV(pages));
+				index = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
+				thePage = stackPageAtpages(index, GIV(pages));
 				/* begin frameCallerContext: */
 				theFP1 = (thePage->baseFP);
 				assert(isBaseFrame(theFP1));
@@ -17254,8 +17491,8 @@
 				/* begin stackPageAt: */
 				/* begin pageIndexFor: */
 				assert((((((char *) theFP1)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP1)) <= (((char *) GIV(pages))))));
-				index2 = pageIndexForstackBasePlus1bytesPerPage(theFP1, GIV(stackBasePlus1), GIV(bytesPerPage));
-				thePage2 = stackPageAtpages(index2, GIV(pages));
+				index3 = pageIndexForstackBasePlus1bytesPerPage(theFP1, GIV(stackBasePlus1), GIV(bytesPerPage));
+				thePage2 = stackPageAtpages(index3, GIV(pages));
 				callerContextOrNil1 = longAt((thePage2->baseAddress));
 				assert(addressCouldBeObj(callerContextOrNil1));
 				assert((callerContextOrNil1 == (nilObject()))
@@ -20551,8 +20788,8 @@
 	}
 	theMethod = objOop;
 	/* begin newStackPage */
-	lruOrFree = ((mostRecentlyUsedPage())->nextPage);
-	if (isFree(lruOrFree)) {
+	lruOrFree = (GIV(mostRecentlyUsedPage)->nextPage);
+	if (((lruOrFree->baseFP)) == 0) {
 		page = lruOrFree;
 		goto l2;
 	}
@@ -20757,6 +20994,7 @@
     char *callerFP;
     char *frameRcvrOffset;
     sqInt i;
+    sqInt numLivePages;
     sqInt oop;
     char *theFP;
     usqInt theIP;
@@ -20765,11 +21003,13 @@
     char *theSP;
 
 	theIP = 0;
+	numLivePages = 0;
 	for (i = 0; i < GIV(numStackPages); i += 1) {
 		/* begin stackPageAt: */
 		thePage = stackPageAtpages(i, GIV(pages));
 		if (!(((thePage->baseFP)) == 0)) {
 			assert(ifCurrentStackPageHasValidHeadPointers(thePage));
+			numLivePages += 1;
 			theSP = (thePage->headSP);
 
 			/* Skip the instruction pointer on top of stack of inactive pages. */
@@ -20855,6 +21095,10 @@
 			}
 		}
 	}
+	/* begin recordLivePagesOnMapping: */
+	GIV(statNumMaps) += 1;
+	GIV(statPageCountWhenMappingSum) += numLivePages;
+	GIV(statMaxPageCountWhenMapping) = ((GIV(statMaxPageCountWhenMapping) < numLivePages) ? numLivePages : GIV(statMaxPageCountWhenMapping));
 }
 
 
@@ -27130,8 +27374,8 @@
 			/* explicit assignment of suspendedContext can cause switch to interior frame. */
 
 			/* begin newStackPage */
-			lruOrFree = ((mostRecentlyUsedPage())->nextPage);
-			if (isFree(lruOrFree)) {
+			lruOrFree = (GIV(mostRecentlyUsedPage)->nextPage);
+			if (((lruOrFree->baseFP)) == 0) {
 				newPage = lruOrFree;
 				goto l3;
 			}
@@ -29531,52 +29775,6 @@
 }
 
 
-/*	<InterpreterStackPage> */
-/*	MRUP-->used page<->used page<->used page<->used page<--LRUP
-	^ <-next-prev-> ^
-	| |
-	v <-prev-next-> v
-	free page<->free page<->free page<->free page */
-
-	/* CoInterpreterStackPages>>#freeStackPageNoAssert: */
-static void
-freeStackPageNoAssert(StackPage *aPage)
-{   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    StackPage *prev;
-
-	(aPage->baseFP = 0);
-	if (aPage == GIV(mostRecentlyUsedPage)) {
-		GIV(mostRecentlyUsedPage) = (GIV(mostRecentlyUsedPage)->prevPage);
-		return;
-	}
-	if ((((prev = (aPage->prevPage))->baseFP)) == 0) {
-		return;
-	}
-	(prev->nextPage = (aPage->nextPage));
-	(((aPage->nextPage))->prevPage = prev);
-	(aPage->nextPage = (GIV(mostRecentlyUsedPage)->nextPage));
-	(((GIV(mostRecentlyUsedPage)->nextPage))->prevPage = aPage);
-	(aPage->prevPage = GIV(mostRecentlyUsedPage));
-	(GIV(mostRecentlyUsedPage)->nextPage = aPage);
-}
-
-
-/*	<InterpreterStackPage> */
-/*	MRUP-->used page<->used page<->used page<->used page<--LRUP
-	^ <-next-prev-> ^
-	| |
-	v <-prev-next-> v
-	free page<->free page<->free page<->free page */
-
-	/* CoInterpreterStackPages>>#freeStackPage: */
-static sqInt
-freeStackPage(StackPage *aPage)
-{
-	freeStackPageNoAssert(aPage);
-	assert(pageListIsWellFormed());
-}
-
-
 /*	Initialize the stack pages. In the C VM theStackPages will be alloca'ed
 	memory to hold the
 	stack pages on the C stack. In the simulator they are housed in the memory
@@ -29597,7 +29795,7 @@
     sqInt theIndex;
 
 	null;
-	structStackPageSize = sizeof(InterpreterStackPage);
+	structStackPageSize = sizeof(CogStackPage);
 	GIV(bytesPerPage) = slotsPerPage * BytesPerWord;
 
 	/* Because stack pages grow down baseAddress is at the top of a stack page and so to avoid
@@ -29662,66 +29860,6 @@
 }
 
 
-/*	<InterpreterStackPage> */
-/*	MRUP-->used page<->used page<->used page<->used page<--LRUP
-	^ <-next-prev-> ^
-	| |
-	v <-prev-next-> v
-	free page<->free page<->free page<->free page */
-
-	/* CoInterpreterStackPages>>#markStackPageMostRecentlyUsed: */
-static void
-markStackPageMostRecentlyUsed(StackPage *page)
-{   DECL_MAYBE_SQ_GLOBAL_STRUCT
-	if (page == GIV(mostRecentlyUsedPage)) {
-		return;
-	}
-	if (((page->prevPage)) == GIV(mostRecentlyUsedPage)) {
-		GIV(mostRecentlyUsedPage) = page;
-		assert(pageListIsWellFormed());
-		return;
-	}
-	(((page->prevPage))->nextPage = (page->nextPage));
-	(((page->nextPage))->prevPage = (page->prevPage));
-	(((GIV(mostRecentlyUsedPage)->nextPage))->prevPage = page);
-	(page->prevPage = GIV(mostRecentlyUsedPage));
-	(page->nextPage = (GIV(mostRecentlyUsedPage)->nextPage));
-	(GIV(mostRecentlyUsedPage)->nextPage = page);
-	GIV(mostRecentlyUsedPage) = page;
-	assert(pageListIsWellFormed());
-}
-
-
-/*	<InterpreterStackPage> */
-/*	This method is used to move a page to a position in the list such that it
-	cannot be deallocated when a new page is allocated, without changing the
-	most recently
-	used page. There must be at least 3 pages in the system. So making the
-	page the MRU's prevPage is sufficient to ensure it won't be deallocated. */
-/*	MRUP-->used page<->used page<->used page<->used page<--LRUP
-	^ <-next-prev-> ^
-	| |
-	v <-prev-next-> v
-	free page<->free page<->free page<->free page */
-
-	/* CoInterpreterStackPages>>#markStackPageNextMostRecentlyUsed: */
-static void
-markStackPageNextMostRecentlyUsed(StackPage *page)
-{   DECL_MAYBE_SQ_GLOBAL_STRUCT
-	assert(page != GIV(mostRecentlyUsedPage));
-	if (((page->nextPage)) == GIV(mostRecentlyUsedPage)) {
-		return;
-	}
-	(((page->prevPage))->nextPage = (page->nextPage));
-	(((page->nextPage))->prevPage = (page->prevPage));
-	(((GIV(mostRecentlyUsedPage)->prevPage))->nextPage = page);
-	(page->prevPage = (GIV(mostRecentlyUsedPage)->prevPage));
-	(page->nextPage = GIV(mostRecentlyUsedPage));
-	(GIV(mostRecentlyUsedPage)->prevPage = page);
-	assert(pageListIsWellFormed());
-}
-
-
 /*	<Integer> */
 /*	Answer the page index for a pointer into stack memory, i.e. the index
 	for the page the address is in. N.B. This is a zero-relative index. */
@@ -29735,86 +29873,6 @@
 }
 
 
-/*	Answer if the stack page list is well-formed.
-	MRUP-->used page<->used page<->used page<->used page<--LRUP
-	^ <-next-prev-> ^
-	| |
-	v <-prev-next-> v
-	free page<->free page<->free page<->free page */
-
-	/* CoInterpreterStackPages>>#pageListIsWellFormed */
-static sqInt
-pageListIsWellFormed(void)
-{   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt count;
-    sqInt limit;
-    sqInt ok;
-    StackPage *page;
-
-	ok = 1;
-	page = (GIV(mostRecentlyUsedPage)->nextPage);
-	count = 1;
-	limit = GIV(numStackPages) * 2;
-	while ((((page->baseFP)) == 0)
-	 && ((page != GIV(mostRecentlyUsedPage))
-	 && (count <= limit))) {
-		if (!(asserta(((((page->nextPage))->prevPage)) == page))) {
-			ok = 0;
-		}
-		page = (page->nextPage);
-		count += 1;
-	}
-	while ((page != GIV(mostRecentlyUsedPage))
-	 && (count <= limit)) {
-		if (!(asserta(((((page->nextPage))->prevPage)) == page))) {
-			ok = 0;
-		}
-		if (asserta(!(isFree(page)))) {
-			if (!(asserta((addressIsInPage(page, (page->baseFP)))
-				 && (addressIsInPage(page, (page->headSP)))))) {
-				ok = 0;
-			}
-		}
-		else {
-			ok = 0;
-		}
-		page = (page->nextPage);
-		count += 1;
-	}
-	if (!(asserta(count == (numStkPages())))) {
-		ok = 0;
-	}
-	return ok;
-}
-
-
-/*	Answer the page for a page index.
-	N.B. This is a zero-relative index. */
-
-	/* CoInterpreterStackPages>>#stackPageAt: */
-static StackPage *
-stackPageAt(sqInt index)
-{   DECL_MAYBE_SQ_GLOBAL_STRUCT
-	return stackPageAtpages(index, GIV(pages));
-}
-
-
-/*	<Integer> */
-
-	/* CoInterpreterStackPages>>#stackPageFor: */
-static StackPage *
-stackPageFor(void *pointer)
-{   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt index;
-
-	/* begin stackPageAt: */
-	/* begin pageIndexFor: */
-	assert((((((char *) pointer)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) pointer)) <= (((char *) GIV(pages))))));
-	index = pageIndexForstackBasePlus1bytesPerPage(pointer, GIV(stackBasePlus1), GIV(bytesPerPage));
-	return stackPageAtpages(index, GIV(pages));
-}
-
-
 /*	Answer either a malloced string with the null-terminated contents of oop
 	if oop is a string,
 	or the null pointer if oop is nil, or fail. It is the client's
@@ -31716,6 +31774,10 @@
 	}
 }
 
+
+/*	Perform a bitShift. In 32-bits deal only with non-negative 32-bit
+	integers. In 64-bits deal with signed 64-bit quantities (max (2^63)-1). */
+
 	/* InterpreterPrimitives>>#primitiveBitShift */
 static void
 primitiveBitShift(void)
@@ -42929,24 +42991,6 @@
 	}
 }
 
-
-/*	For assert-checking */
-
-	/* InterpreterStackPage>>#addressIsInPage: */
-static sqInt
-addressIsInPage(StackPage * self_in_addressIsInPage, char *address)
-{
-	return (((self_in_addressIsInPage->lastAddress)) < address)
-	 && (address < ((self_in_addressIsInPage->baseAddress)));
-}
-
-	/* InterpreterStackPage>>#isFree */
-static sqInt
-isFree(StackPage * self_in_isFree)
-{
-	return ((self_in_isFree->baseFP)) == 0;
-}
-
 	/* Spur32BitCoMemoryManager>>#ceClassAtIndex: */
 sqInt
 ceClassAtIndex(sqInt classIndex)
@@ -60414,7 +60458,7 @@
     usqInt prevFree;
     usqInt prevFreeChunk;
     usqInt prevPrevFree;
-    usqInt prevPrevFreeChunk;
+    sqInt prevPrevFreeChunk;
     sqInt slotBytes;
     sqInt slotBytes1;
     usqInt there;
@@ -67841,8 +67885,8 @@
 		/* othewise move all frames above to a new stack and then peel the frame off. */
 
 		/* begin newStackPage */
-		lruOrFree = ((mostRecentlyUsedPage())->nextPage);
-		if (isFree(lruOrFree)) {
+		lruOrFree = (GIV(mostRecentlyUsedPage)->nextPage);
+		if (((lruOrFree->baseFP)) == 0) {
 			newPage = lruOrFree;
 			goto l1;
 		}
@@ -69408,8 +69452,8 @@
 	marryFrameSP(callerFP1, theSP);
 l2:	/* end ensureCallerContext: */;
 	/* begin newStackPage */
-	lruOrFree = ((mostRecentlyUsedPage())->nextPage);
-	if (isFree(lruOrFree)) {
+	lruOrFree = (GIV(mostRecentlyUsedPage)->nextPage);
+	if (((lruOrFree->baseFP)) == 0) {
 		newPage = lruOrFree;
 		goto l1;
 	}
@@ -72779,27 +72823,6 @@
 }
 
 
-/*	MRUP-->used page<->used page<->used page<->used page<--LRUP
-	^ <-next-prev-> ^
-	| |
-	v <-prev-next-> v
-	free page<->free page<->free page<->free page */
-
-	/* StackInterpreter>>#newStackPage */
-static StackPage *
-newStackPage(void)
-{
-    StackPage *lruOrFree;
-
-	lruOrFree = ((mostRecentlyUsedPage())->nextPage);
-	if (isFree(lruOrFree)) {
-		return lruOrFree;
-	}
-	divorceFramesIn(lruOrFree);
-	return lruOrFree;
-}
-
-
 /*	Answer a full 32 bit integer object for the given integer value. */
 
 	/* StackInterpreter>>#noInlineSigned32BitIntegerFor: */
@@ -78433,8 +78456,8 @@
 		markStackPageNextMostRecentlyUsed(thePage);
 	}
 	/* begin newStackPage */
-	lruOrFree = ((mostRecentlyUsedPage())->nextPage);
-	if (isFree(lruOrFree)) {
+	lruOrFree = (GIV(mostRecentlyUsedPage)->nextPage);
+	if (((lruOrFree->baseFP)) == 0) {
 		newPage = lruOrFree;
 		goto l1;
 	}
@@ -82495,7 +82518,10 @@
 	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)
-	68 - 69 reserved for more Cog-related info
+	68	the average number of live stack pages when scanned by GC (at
+	scavenge/gc/become et al)
+	69	the maximum number of live stack pages when scanned by GC (at
+	scavenge/gc/become et al)
 	70	the vmProxyMajorVersion (the interpreterProxy VM_MAJOR_VERSION)
 	71	the vmProxyMinorVersion (the interpreterProxy VM_MINOR_VERSION)
 	Note: Thanks to Ian Piumarta for this primitive. */
@@ -82542,6 +82568,8 @@
     sqInt valuePointer3;
     sqInt valuePointer30;
     sqInt valuePointer31;
+    sqInt valuePointer32;
+    sqInt valuePointer33;
     sqInt valuePointer4;
     sqInt valuePointer5;
     sqInt valuePointer6;
@@ -82865,14 +82893,34 @@
 		assert(!(isForwarded(result)));
 		longAtput((result + BaseHeaderSize) + (66 << (shiftForWord())), valuePointer3);
 
+		/* begin storePointer:ofObject:withValue: */
+		valuePointer30 = floatObjectOf(statAverageLivePagesWhenMapping());
+		assert(!(isForwarded(result)));
+		if (isOldObject(result)) {
+
+			/* most stores into young objects */
+
+			if (((valuePointer30 & 3) == 0)
+			 && (oopisLessThan(valuePointer30, GIV(newSpaceLimit)))) {
+				/* begin possibleRootStoreInto: */
+				if (!(((((usqInt) (longAt(result))) >> 29) & 1) != 0)) {
+					remember(result);
+				}
+			}
+		}
+		longAtput((result + BaseHeaderSize) + (67 << (shiftForWord())), valuePointer30);
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer30 = (((VM_PROXY_MAJOR) << 1) | 1);
+		valuePointer31 = (((statMaxPageCountWhenMapping()) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (69 << (shiftForWord())), valuePointer30);
+		longAtput((result + BaseHeaderSize) + (68 << (shiftForWord())), valuePointer31);
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer31 = (((VM_PROXY_MINOR) << 1) | 1);
+		valuePointer32 = (((VM_PROXY_MAJOR) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (70 << (shiftForWord())), valuePointer31);
+		longAtput((result + BaseHeaderSize) + (69 << (shiftForWord())), valuePointer32);
+		/* begin storePointerUnchecked:ofObject:withValue: */
+		valuePointer33 = (((VM_PROXY_MINOR) << 1) | 1);
+		assert(!(isForwarded(result)));
+		longAtput((result + BaseHeaderSize) + (70 << (shiftForWord())), valuePointer33);
 		assert(paramsArraySize == 71);
 		/* begin pop:thenPush: */
 		longAtput((sp = GIV(stackPointer) + ((1 - 1) * BytesPerWord)), result);
@@ -83087,6 +83135,12 @@
 		 && (1)) {
 			result = (((maxOldSpaceSize()) << 1) | 1);
 		}
+		if (arg == 68) {
+			result = floatObjectOf(statAverageLivePagesWhenMapping());
+		}
+		if (arg == 69) {
+			result = (((statMaxPageCountWhenMapping()) << 1) | 1);
+		}
 		if (arg == 70) {
 			result = (((VM_PROXY_MAJOR) << 1) | 1);
 		}

Modified: branches/Cog/nsspursrc/vm/cointerp.h
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.h	2015-08-12 17:30:04 UTC (rev 3422)
+++ branches/Cog/nsspursrc/vm/cointerp.h	2015-08-18 00:29:33 UTC (rev 3423)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1435 uuid: 114c4214-dede-4f25-9bbb-c912623d0ef4
  */
 
 

Modified: branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2015-08-12 17:30:04 UTC (rev 3422)
+++ branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2015-08-18 00:29:33 UTC (rev 3423)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1435 uuid: 114c4214-dede-4f25-9bbb-c912623d0ef4
    from
-	CoInterpreter VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027
+	CoInterpreter VMMaker.oscog-eem.1435 uuid: 114c4214-dede-4f25-9bbb-c912623d0ef4
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1430 uuid: 3d5ca520-ac41-40be-8a8b-95a18d1cb027 " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1435 uuid: 114c4214-dede-4f25-9bbb-c912623d0ef4 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -125,7 +125,7 @@
 	struct _StackPage *prevPage;
  } StackPage;
 
-#define InterpreterStackPage StackPage
+#define CogStackPage StackPage
 
 
 
@@ -423,6 +423,17 @@
 
 extern sqInt interpret(void);
 static CogMethod * cmHomeMethod(CogBlockMethod * self_in_cmHomeMethod) NoDbgRegParms;
+static sqInt addressIsInPage(StackPage * self_in_addressIsInPage, char *address) NoDbgRegParms;
+static sqInt isFree(StackPage * self_in_isFree) NoDbgRegParms;
+static void freeStackPageNoAssert(StackPage *aPage) NoDbgRegParms;
+static sqInt freeStackPage(StackPage *aPage) NoDbgRegParms;
+static void markStackPageMostRecentlyUsed(StackPage *page) NoDbgRegParms;
+static void markStackPageNextMostRecentlyUsed(StackPage *page) NoDbgRegParms;
+static StackPage * newStackPage(void);
+static sqInt pageListIsWellFormed(void);
+static StackPage * stackPageAt(sqInt index) NoDbgRegParms;
+static StackPage * stackPageFor(void *pointer) NoDbgRegParms;
+static double statAverageLivePagesWhenMapping(void);
 extern signed char accessorDepthForPrimitiveIndex(sqInt primIndex);
 static void activateCoggedNewMethod(sqInt inInterpreter) NoDbgRegParms;
 static void activateNewMethod(void);
@@ -630,15 +641,8 @@
 static void primitiveWait(void);
 static void primitiveYield(void);
 static void unmarkAllFrames(void);
-static void freeStackPageNoAssert(StackPage *aPage) NoDbgRegParms;
-static sqInt freeStackPage(StackPage *aPage) NoDbgRegParms;
 static void initializeStacknumSlotspageSize(char *theStackPages, sqInt stackSlots, sqInt slotsPerPage) NoDbgRegParms;
-static void markStackPageMostRecentlyUsed(StackPage *page) NoDbgRegParms;
-static void markStackPageNextMostRecentlyUsed(StackPage *page) NoDbgRegParms;
 static sqInt pageIndexFor(void *pointer) NoDbgRegParms;
-static sqInt pageListIsWellFormed(void);
-static StackPage * stackPageAt(sqInt index) NoDbgRegParms;
-static StackPage * stackPageFor(void *pointer) NoDbgRegParms;
 extern char * cStringOrNullFor(sqInt oop);
 extern sqInt failed(void);
 static sqInt isNegativeIntegerValueOf(sqInt oop) NoDbgRegParms;
@@ -834,8 +838,6 @@
 extern usqInt sizeOfAlienData(sqInt oop);
 extern void * startOfAlienData(sqInt oop);
 extern sqInt success(sqInt successBoolean);
-static sqInt addressIsInPage(StackPage * self_in_addressIsInPage, char *address) NoDbgRegParms;
-static sqInt isFree(StackPage * self_in_isFree) NoDbgRegParms;
 extern sqInt ceClassAtIndex(sqInt classIndex);
 extern void ceScheduleScavenge(void);
 static void clearLeakMapAndMapAccessibleObjects(void);
@@ -1410,7 +1412,6 @@
 extern sqInt methodUsesAlternateBytecodeSet(sqInt aMethodObj);
 EXPORT(void) moduleUnloaded(char *aModuleName);
 static char * nameOfClass(sqInt classOop) NoDbgRegParms;
-static StackPage * newStackPage(void);
 static sqInt noInlineSigned32BitIntegerFor(sqInt integerValue) NoDbgRegParms;
 static sqInt noInlineTemporaryin(sqInt offset, char *theFP) NoDbgRegParms;
 static sqInt noInlineTemporaryinput(sqInt offset, char *theFP, sqInt valueOop) NoDbgRegParms;
@@ -1623,11 +1624,11 @@
 _iss sqInt remapBufferCount;
 _iss sqInt localAbsentReceiverOrZero;
 _iss usqInt freeListsMask;
+_iss StackPage * mostRecentlyUsedPage;
 _iss usqInt firstFreeChunk;
 _iss sqInt longRunningPrimitiveCheckSemaphore;
 _iss SpurContiguousObjStack unscannedEphemerons;
 _iss sqInt numStackPages;
-_iss StackPage * mostRecentlyUsedPage;
 _iss SpurNewSpaceSpace pastSpace;
 _iss sqInt longRunningPrimitiveCheckMethod;
 _iss usqInt oldSpaceStart;
@@ -1723,6 +1724,9 @@
 _iss sqInt statCodeCompactionCount;
 _iss usqLong statCodeCompactionUsecs;
 _iss sqInt statMarkCount;
+_iss sqInt statMaxPageCountWhenMapping;
+_iss sqInt statNumMaps;
+_iss sqInt statPageCountWhenMappingSum;
 _iss sqInt statRootTableCount;
 _iss sqInt tenuringProportion;
 _iss sqInt classByteArrayCompactIndex;
@@ -2414,7 +2418,7 @@
 /*560*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1
 	};
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1430";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1435";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -2424,6 +2428,9 @@
 #define cPICNumCasesHack hack hack hack i.e. the getter macro does all the work
 #define nextOpenPIC methodObject
 #define nextOpenPICHack hack hack hack i.e. the getter macro does all the work
+#define mostRecentlyUsedPage() GIV(mostRecentlyUsedPage)
+#define stackPageAtpages(index,pages) ((pages) + (index))
+#define statMaxPageCountWhenMapping() GIV(statMaxPageCountWhenMapping)
 #define compilationBreakpointisMNUCase(sel, len, isMNU) do { \
 	if ((len) == (isMNU ? -breakSelectorLength : breakSelectorLength) \
 	 && !strncmp((char *)((sel) + BaseHeaderSize), breakSelector, (isMNU ? -breakSelectorLength : breakSelectorLength))) { \
@@ -2447,9 +2454,7 @@
 } while (0)
 #define primTraceLogIndex(aValue) (GIV(primTraceLogIndex) = (aValue))
 #define setDesiredCogCodeSize(dccs) (desiredCogCodeSize = (dccs))
-#define mostRecentlyUsedPage() GIV(mostRecentlyUsedPage)
 #define pageIndexForstackBasePlus1bytesPerPage(pointer,stkBasePlus1,pageByteSize) (((char *)(pointer) - (stkBasePlus1)) / (pageByteSize))
-#define stackPageAtpages(index,pages) ((pages) + (index))
 #define startOfMemory() heapBase
 #define shiftForWord() 2
 #define wordSize() 4
@@ -2522,7 +2527,7 @@
 		stackPageBytes = stackPageByteSize();
 		/* begin computeStackZoneSize */
 		null;
-		stackPagesBytes = (GIV(numStackPages) * ((sizeof(InterpreterStackPage)) + (stackPageByteSize()))) + BytesPerWord;
+		stackPagesBytes = (GIV(numStackPages) * ((sizeof(CogStackPage)) + (stackPageByteSize()))) + BytesPerWord;
 		theStackMemory = alloca(stackPagesBytes);
 		memset(theStackMemory, 0, stackPagesBytes);
 		sqMakeMemoryNotExecutableFromTo(((usqInt)(startOfMemory())), ((usqInt)GIV(endOfMemory)));
@@ -5289,8 +5294,8 @@
 						/* begin stackPageAt: */
 						/* begin pageIndexFor: */
 						assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages))))));
-						index2 = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
-						thePage1 = stackPageAtpages(index2, GIV(pages));
+						index = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
+						thePage1 = stackPageAtpages(index, GIV(pages));
 						callerContextOrNil = longAt((thePage1->baseAddress));
 						assert(addressCouldBeObj(callerContextOrNil));
 						assert((callerContextOrNil == (nilObject()))
@@ -5349,8 +5354,8 @@
 				/* begin stackPageAt: */
 				/* begin pageIndexFor: */
 				assert((((((char *) frameToReturnTo)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) frameToReturnTo)) <= (((char *) GIV(pages))))));
-				index1 = pageIndexForstackBasePlus1bytesPerPage(frameToReturnTo, GIV(stackBasePlus1), GIV(bytesPerPage));
-				newPage = stackPageAtpages(index1, GIV(pages));
+				index4 = pageIndexForstackBasePlus1bytesPerPage(frameToReturnTo, GIV(stackBasePlus1), GIV(bytesPerPage));
+				newPage = stackPageAtpages(index4, GIV(pages));
 				if (newPage != GIV(stackPage)) {
 					/* begin frameCallerContext: */
 					theFP2 = (GIV(stackPage)->baseFP);
@@ -5359,8 +5364,8 @@
 					/* begin stackPageAt: */
 					/* begin pageIndexFor: */
 					assert((((((char *) theFP2)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP2)) <= (((char *) GIV(pages))))));
-					index4 = pageIndexForstackBasePlus1bytesPerPage(theFP2, GIV(stackBasePlus1), GIV(bytesPerPage));
-					thePage3 = stackPageAtpages(index4, GIV(pages));
+					index3 = pageIndexForstackBasePlus1bytesPerPage(theFP2, GIV(stackBasePlus1), GIV(bytesPerPage));
+					thePage3 = stackPageAtpages(index3, GIV(pages));
 					callerContextOrNil2 = longAt((thePage3->baseAddress));
 					assert(addressCouldBeObj(callerContextOrNil2));
 					assert((callerContextOrNil2 == (nilObject()))
@@ -5376,8 +5381,8 @@
 							/* begin stackPageAt: */
 							/* begin pageIndexFor: */
 							assert((((((char *) theFP)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP)) <= (((char *) GIV(pages))))));
-							index = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
-							thePage = stackPageAtpages(index, GIV(pages));
+							index1 = pageIndexForstackBasePlus1bytesPerPage(theFP, GIV(stackBasePlus1), GIV(bytesPerPage));
+							thePage = stackPageAtpages(index1, GIV(pages));
 							if (theFP != ((thePage->headFP))) {
 
 								/* Since we've just deallocated a page we know that newStackPage won't deallocate an existing one. */
@@ -5391,8 +5396,8 @@
 							/* begin stackPageAt: */
 							/* begin pageIndexFor: */
 							assert((((((char *) theFP1)) >= (GIV(stackBasePlus1) - 1)) && ((((char *) theFP1)) <= (((char *) GIV(pages))))));
-							index3 = pageIndexForstackBasePlus1bytesPerPage(theFP1, GIV(stackBasePlus1), GIV(bytesPerPage));
-							thePage2 = stackPageAtpages(index3, GIV(pages));
+							index2 = pageIndexForstackBasePlus1bytesPerPage(theFP1, GIV(stackBasePlus1), GIV(bytesPerPage));
+							thePage2 = stackPageAtpages(index2, GIV(pages));
 							callerContextOrNil1 = longAt((thePage2->baseAddress));
 							assert(addressCouldBeObj(callerContextOrNil1));
 							assert((callerContextOrNil1 == (nilObject()))
@@ -5613,8 +5618,8 @@
 							frameAbove = 0;
 						l235:	/* end findFrameAbove:inPage: */;
 							/* begin newStackPage */
-							lruOrFree = ((mostRecentlyUsedPage())->nextPage);
-							if (isFree(lruOrFree)) {
+							lruOrFree = (GIV(mostRecentlyUsedPage)->nextPage);
+							if (((lruOrFree->baseFP)) == 0) {
 								newPage = lruOrFree;
 								goto l236;
 							}
@@ -15283,6 +15288,238 @@
 	return ((CogMethod *) ((((usqInt)self_in_cmHomeMethod)) - ((self_in_cmHomeMethod->homeOffset))));
 }
 
+
+/*	For assert-checking */
+
+	/* CogStackPage>>#addressIsInPage: */
+static sqInt
+addressIsInPage(StackPage * self_in_addressIsInPage, char *address)
+{
+	return (((self_in_addressIsInPage->lastAddress)) < address)
+	 && (address < ((self_in_addressIsInPage->baseAddress)));
+}
+
+	/* CogStackPage>>#isFree */
+static sqInt
+isFree(StackPage * self_in_isFree)
+{
+	return ((self_in_isFree->baseFP)) == 0;
+}
+
+
+/*	<InterpreterStackPage> */

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list