[Vm-dev] [commit][3393] CogVM source as per VMMaker.oscog-eem.1401

commits at squeakvm.org commits at squeakvm.org
Mon Jun 29 23:59:02 UTC 2015


Revision: 3393
Author:   eliot
Date:     2015-06-29 16:59:01 -0700 (Mon, 29 Jun 2015)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.1401

Spur:
Provide a limit to the size of old space on Spur.  Access maxOldSpaceSize
via vmParameterAt: 67 & command line parameter -maxoldspace.

Cogit:
Simplify pushRemoteTemp register management to be able to improve further the
overall register management.

Have optStatus hold onto the sim stack entry it is holding, if any.

Sista Cogit:
fixed trinaryInlined primitive which was forcing a reg to be ReceiverResult reg when it shouldn't.

Modified Paths:
--------------
    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/platforms/Mac OS/vm/sqMacUnixCommandLineInterface.c
    branches/Cog/platforms/unix/vm/sqUnixMain.c
    branches/Cog/platforms/win32/vm/sqWin32Main.c
    branches/Cog/platforms/win32/vm/sqWin32Window.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

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

Modified: branches/Cog/nsspursrc/vm/cogit.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.h	2015-06-28 19:15:19 UTC (rev 3392)
+++ branches/Cog/nsspursrc/vm/cogit.h	2015-06-29 23:59:01 UTC (rev 3393)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1388 uuid: 5946eb20-1cae-4cba-98b5-467aa146ffab
+	CCodeGenerator VMMaker.oscog-eem.1401 uuid: 036f0933-639a-49dd-8a1d-a03bcdcb0a0a
  */
 
 

Modified: branches/Cog/nsspursrc/vm/cogitARMv5.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogitARMv5.c	2015-06-28 19:15:19 UTC (rev 3392)
+++ branches/Cog/nsspursrc/vm/cogitARMv5.c	2015-06-29 23:59:01 UTC (rev 3393)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1388 uuid: 5946eb20-1cae-4cba-98b5-467aa146ffab
+	CCodeGenerator VMMaker.oscog-eem.1401 uuid: 036f0933-639a-49dd-8a1d-a03bcdcb0a0a
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1388 uuid: 5946eb20-1cae-4cba-98b5-467aa146ffab
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1401 uuid: 036f0933-639a-49dd-8a1d-a03bcdcb0a0a
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1388 uuid: 5946eb20-1cae-4cba-98b5-467aa146ffab " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1401 uuid: 036f0933-639a-49dd-8a1d-a03bcdcb0a0a " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -1157,6 +1157,7 @@
 static sqInt genSpecialSelectorComparison(void);
 static sqInt genSpecialSelectorEqualsEquals(void);
 static sqInt genSpecialSelectorEqualsEqualsWithForwarders(void);
+static sqInt genStaticallyResolvedSpecialSelectorComparison(void);
 static sqInt genStorePopLiteralVariable(sqInt popBoolean, sqInt litVarIndex) NoDbgRegParms;
 static sqInt genStorePopMaybeContextReceiverVariable(sqInt popBoolean, sqInt slotIndex) NoDbgRegParms;
 static sqInt genStorePopReceiverVariable(sqInt popBoolean, sqInt slotIndex) NoDbgRegParms;
@@ -1207,6 +1208,7 @@
 static CogSimStackEntry ssTopDescriptor(void);
 static CogSimStackEntry * ssValue(sqInt n) NoDbgRegParms;
 static sqInt tryCollapseTempVectorInitializationOfSize(sqInt slots) NoDbgRegParms;
+static void updateSimSpillBase(void);
 static sqInt v3or4PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils) NoDbgRegParms;
 static sqInt v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj) NoDbgRegParms;
 
@@ -23563,13 +23565,11 @@
 ensureReceiverResultRegContainsSelf(void)
 {
 	if (needsFrame) {
-		if (!(((optStatus.isReceiverResultRegLive))
-			 && (((optStatus.ssEntry)) == ((&simSelf))))) {
+		if (!((optStatus.isReceiverResultRegLive))) {
 			ssAllocateRequiredReg(ReceiverResultReg);
 			storeToReg((&simSelf), ReceiverResultReg);
 		}
 		(optStatus.isReceiverResultRegLive = 1);
-		(optStatus.ssEntry = (&simSelf));
 	}
 	else {
 		assert((((simSelf.type)) == SSRegister)
@@ -24434,6 +24434,7 @@
 	startpc = bytecodePC + (((generatorAt(byte0))->numBytes));
 	addBlockStartAtnumArgsnumCopiedspan(startpc, (numArgs = (byte1 & 7) + ((extA % 16) * 8)), (numCopied = ((((usqInt) byte1) >> 3) & 7) + ((extA / 16) * 8)), byte2 + (extB << 8));
 	extA = (extB = 0);
+	/* begin genInlineClosure:numArgs:numCopied: */
 	assert(getActiveContextAllocatesInMachineCode());
 	(optStatus.isReceiverResultRegLive = 0);
 	ssAllocateCallRegandand(ReceiverResultReg, SendNumArgsReg, ClassReg);
@@ -24442,19 +24443,9 @@
 		reg = ssStorePoptoPreferredReg(1, TempReg);
 		genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, (ClosureFirstCopiedValueIndex + numCopied) - i, ReceiverResultReg);
 	}
-	return ssPushRegister(ReceiverResultReg);
+	ssPushRegister(ReceiverResultReg);
 
-	if (numCopied > 0) {
-		ssFlushTo(simStackPtr);
-	}
-	(optStatus.isReceiverResultRegLive = 0);
-	ssAllocateCallRegandand(ReceiverResultReg, SendNumArgsReg, ClassReg);
-
-	genCreateClosureAtnumArgsnumCopiedcontextNumArgslargeinBlock(startpc + 1, numArgs, numCopied, methodOrBlockNumArgs, methodNeedsLargeContext(methodObj), inBlock);
-	if (numCopied > 0) {
-		ssPop(numCopied);
-	}
-	return ssPushRegister(ReceiverResultReg);
+	return 0;
 }
 
 
@@ -25714,6 +25705,7 @@
 	assert(needsFrame);
 	startpc = bytecodePC + (((generatorAt(byte0))->numBytes));
 	addBlockStartAtnumArgsnumCopiedspan(startpc, (numArgs = byte1 & 15), (numCopied = ((usqInt) byte1) >> 4), (byte2 << 8) + byte3);
+	/* begin genInlineClosure:numArgs:numCopied: */
 	assert(getActiveContextAllocatesInMachineCode());
 	(optStatus.isReceiverResultRegLive = 0);
 	ssAllocateCallRegandand(ReceiverResultReg, SendNumArgsReg, ClassReg);
@@ -25722,19 +25714,9 @@
 		reg = ssStorePoptoPreferredReg(1, TempReg);
 		genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, (ClosureFirstCopiedValueIndex + numCopied) - i, ReceiverResultReg);
 	}
-	return ssPushRegister(ReceiverResultReg);
+	ssPushRegister(ReceiverResultReg);
 
-	if (numCopied > 0) {
-		ssFlushTo(simStackPtr);
-	}
-	(optStatus.isReceiverResultRegLive = 0);
-	ssAllocateCallRegandand(ReceiverResultReg, SendNumArgsReg, ClassReg);
-
-	genCreateClosureAtnumArgsnumCopiedcontextNumArgslargeinBlock(startpc + 1, numArgs, numCopied, methodOrBlockNumArgs, methodNeedsLargeContext(methodObj), inBlock);
-	if (numCopied > 0) {
-		ssPop(numCopied);
-	}
-	return ssPushRegister(ReceiverResultReg);
+	return 0;
 }
 
 
@@ -25883,8 +25865,7 @@
 static sqInt
 genPushReceiverBytecode(void)
 {
-	if (((optStatus.isReceiverResultRegLive))
-	 && (((optStatus.ssEntry)) == ((&simSelf)))) {
+	if ((optStatus.isReceiverResultRegLive)) {
 		return ssPushRegister(ReceiverResultReg);
 	}
 	return ssPushDesc(simSelf);
@@ -25922,14 +25903,23 @@
 genPushRemoteTempLongBytecode(void)
 {
     sqInt offset;
+    sqInt regMask;
+    sqInt remoteTempReg;
+    sqInt tempVectReg;
 
-	ssAllocateRequiredRegand(ClassReg, SendNumArgsReg);
+	tempVectReg = allocateRegNotConflictingWith(0);
 	/* begin MoveMw:r:R: */
 	offset = frameOffsetOfTemporary(byte2);
 	/* begin gen:quickConstant:operand:operand: */
-	checkQuickConstantforInstruction(offset, genoperandoperandoperand(MoveMwrR, offset, FPReg, ClassReg));
-	genLoadSlotsourceRegdestReg(byte1, ClassReg, SendNumArgsReg);
-	return ssPushRegister(SendNumArgsReg);
+	checkQuickConstantforInstruction(offset, genoperandoperandoperand(MoveMwrR, offset, FPReg, tempVectReg));
+	/* begin availableRegOrNilNotConflictingWith: */
+	regMask = registerMaskFor(tempVectReg);
+	remoteTempReg = availableRegisterOrNilFor(backEnd, (liveRegisters()) | regMask);
+	if (!(remoteTempReg)) {
+		remoteTempReg = tempVectReg;
+	}
+	genLoadSlotsourceRegdestReg(byte1, tempVectReg, remoteTempReg);
+	return ssPushRegister(remoteTempReg);
 }
 
 
@@ -25955,11 +25945,8 @@
 genReturnReceiver(void)
 {
 	if (needsFrame) {
-		if (!(((optStatus.isReceiverResultRegLive))
-			 && (((optStatus.ssEntry)) == ((&simSelf))))) {
-			/* begin MoveMw:r:R: */
-			/* begin gen:quickConstant:operand:operand: */
-			checkQuickConstantforInstruction(FoxMFReceiver, genoperandoperandoperand(MoveMwrR, FoxMFReceiver, FPReg, ReceiverResultReg));
+		if (!((optStatus.isReceiverResultRegLive))) {
+			storeToReg((&simSelf), ReceiverResultReg);
 		}
 	}
 	return genUpArrowReturn();
@@ -26434,9 +26421,7 @@
     sqInt postBranchPC1;
     BytecodeDescriptor *primDescriptor;
     BytecodeDescriptor *primDescriptor1;
-    sqInt rcvrInt;
     sqInt rcvrIsInt;
-    sqInt result;
     sqInt target;
     sqInt targetBytecodePC;
     sqInt targetBytecodePC1;
@@ -26447,39 +26432,10 @@
 	argIsInt = ((((ssTop())->type)) == SSConstant)
 	 && ((((argInt = ((ssTop())->constant))) & 1));
 	rcvrIsInt = ((((ssValue(1))->type)) == SSConstant)
-	 && ((((rcvrInt = ((ssValue(1))->constant))) & 1));
+	 && (((((ssValue(1))->constant)) & 1));
 	if (argIsInt
 	 && (rcvrIsInt)) {
-		;
-		
-		switch ((primDescriptor->opcode)) {
-		case JumpLess:
-			result = rcvrInt < argInt;
-			break;
-		case JumpLessOrEqual:
-			result = rcvrInt <= argInt;
-			break;
-		case JumpGreater:
-			result = rcvrInt > argInt;
-			break;
-		case JumpGreaterOrEqual:
-			result = rcvrInt >= argInt;
-			break;
-		case JumpZero:
-			result = rcvrInt == argInt;
-			break;
-		case JumpNonZero:
-			result = rcvrInt != argInt;
-			break;
-		default:
-			error("Case not found and no otherwise clause");
-		}
-		annotateBytecodeIfAnnotated(ssValue(1));
-		annotateBytecodeIfAnnotated(ssTop());
-		ssPop(2);
-		return ssPushAnnotatedConstant((result
-			? trueObject()
-			: falseObject()));
+		return genStaticallyResolvedSpecialSelectorComparison();
 	}
 	/* begin extractMaybeBranchDescriptorInto: */
 	primDescriptor1 = generatorAt(byte0);
@@ -26857,6 +26813,53 @@
 }
 
 
+/*	Assumes both operands are ints */
+
+	/* StackToRegisterMappingCogit>>#genStaticallyResolvedSpecialSelectorComparison */
+static sqInt
+genStaticallyResolvedSpecialSelectorComparison(void)
+{
+    sqInt argInt;
+    BytecodeDescriptor *primDescriptor;
+    sqInt rcvrInt;
+    sqInt result;
+
+	primDescriptor = generatorAt(byte0);
+	argInt = ((ssTop())->constant);
+	rcvrInt = ((ssValue(1))->constant);
+	
+	
+	switch ((primDescriptor->opcode)) {
+	case JumpLess:
+		result = rcvrInt < argInt;
+		break;
+	case JumpLessOrEqual:
+		result = rcvrInt <= argInt;
+		break;
+	case JumpGreater:
+		result = rcvrInt > argInt;
+		break;
+	case JumpGreaterOrEqual:
+		result = rcvrInt >= argInt;
+		break;
+	case JumpZero:
+		result = rcvrInt == argInt;
+		break;
+	case JumpNonZero:
+		result = rcvrInt != argInt;
+		break;
+	default:
+		error("Case not found and no otherwise clause");
+	}
+	annotateBytecodeIfAnnotated(ssValue(1));
+	annotateBytecodeIfAnnotated(ssTop());
+	ssPop(2);
+	return ssPushAnnotatedConstant((result
+		? trueObject()
+		: falseObject()));
+}
+
+
 /*	The only reason we assert needsFrame here is that in a frameless method
 	ReceiverResultReg must and does contain only self, but the ceStoreCheck
 	trampoline expects the target of the store to be in ReceiverResultReg. So
@@ -27187,30 +27190,34 @@
     sqInt rThird1;
     sqInt rTop;
     sqInt rTop1;
+    sqInt thirdIsReceiver;
     sqInt topRegistersMask;
 
 	rNext1 = 0;
 	rThird1 = 0;
 	rTop1 = 0;
+	needsStoreCheck = !(isUnannotatableConstant(ssTop()));
 	/* begin allocateRegForStackTopThreeEntriesInto:thirdIsReceiver: */
+	thirdIsReceiver = (prim == 0)
+	 && (needsStoreCheck);
 	topRegistersMask = 0;
 	if (((((ssTop())->type)) == SSRegister)
-	 && ((!(prim == 0))
+	 && ((!thirdIsReceiver)
 	 || ((((ssTop())->registerr)) != ReceiverResultReg))) {
 		topRegistersMask = registerMaskFor((rTop1 = ((ssTop())->registerr)));
 	}
 	if (((((ssValue(1))->type)) == SSRegister)
-	 && ((!(prim == 0))
+	 && ((!thirdIsReceiver)
 	 || ((((ssValue(1))->registerr)) != ReceiverResultReg))) {
 		topRegistersMask = topRegistersMask | (registerMaskFor((rNext1 = ((ssValue(1))->registerr))));
 	}
 	if (((((ssValue(2))->type)) == SSRegister)
-	 && ((!(prim == 0))
+	 && ((!thirdIsReceiver)
 	 || ((((ssValue(2))->registerr)) == ReceiverResultReg))) {
 		topRegistersMask = topRegistersMask | (registerMaskFor((rThird1 = ((ssValue(2))->registerr))));
 	}
 	if (!(rThird1)) {
-		if (prim == 0) {
+		if (thirdIsReceiver) {
 
 			/* Free ReceiverResultReg if it was not free */
 
@@ -27237,7 +27244,6 @@
 	assert((rr != ra1)
 	 && ((rr != ra2)
 	 && (ra1 != ra2)));
-	needsStoreCheck = !(isUnannotatableConstant(ssTop()));
 	popToReg(ssTop(), ra2);
 	ssPop(1);
 	popToReg(ssTop(), ra1);
@@ -27421,12 +27427,13 @@
     CogSimStackEntry *desc;
     sqInt i;
 
-	(optStatus.isReceiverResultRegLive = 0);
 	(simSelf.type = SSBaseOffset);
 	(simSelf.spilled = 1);
 	(simSelf.annotateUse = 0);
 	(simSelf.registerr = FPReg);
 	(simSelf.offset = FoxMFReceiver);
+	(optStatus.isReceiverResultRegLive = 0);
+	(optStatus.ssEntry = (&simSelf));
 
 	/* N.B. Includes num args */
 
@@ -28178,15 +28185,16 @@
     CogSimStackEntry *desc;
     sqInt index;
 
+	/* begin ssFlushUpThrough: */
 	for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) {
-		desc = simStackAt(index);
-		if ((((desc->type)) == SSBaseOffset)
-		 && ((((desc->registerr)) == ReceiverResultReg)
-		 && (((desc->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) {
+		if (((((simStackAt(index))->type)) == SSBaseOffset)
+		 && (((((simStackAt(index))->registerr)) == ReceiverResultReg)
+		 && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) {
 			ssFlushTo(index);
-			return;
+			goto l1;
 		}
 	}
+l1:	/* end ssFlushUpThrough: */;
 }
 
 
@@ -28201,15 +28209,16 @@
     CogSimStackEntry *desc;
     sqInt index;
 
-	for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) {
-		desc = simStackAt(index);
-		if ((((desc->type)) == SSBaseOffset)
-		 && ((((desc->registerr)) == FPReg)
-		 && (((desc->offset)) == (frameOffsetOfTemporary(tempIndex))))) {
+	/* begin ssFlushUpThrough: */
+	for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) {
+		if (((((simStackAt(index))->type)) == SSBaseOffset)
+		 && (((((simStackAt(index))->registerr)) == FPReg)
+		 && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) {
 			ssFlushTo(index);
-			return;
+			goto l1;
 		}
 	}
+l1:	/* end ssFlushUpThrough: */;
 }
 
 	/* StackToRegisterMappingCogit>>#ssPop: */
@@ -28229,9 +28238,7 @@
     CogSimStackEntry * cascade0;
 
 	ssPush(1);
-	if (simSpillBase > simStackPtr) {
-		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
-	}
+	updateSimSpillBase();
 	cascade0 = ssTop();
 	(cascade0->type = SSConstant);
 	(cascade0->annotateUse = 1);
@@ -28248,9 +28255,7 @@
     CogSimStackEntry * cascade0;
 
 	ssPush(1);
-	if (simSpillBase > simStackPtr) {
-		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
-	}
+	updateSimSpillBase();
 	cascade0 = ssTop();
 	(cascade0->type = SSBaseOffset);
 	(cascade0->spilled = 0);
@@ -28268,9 +28273,7 @@
     CogSimStackEntry * cascade0;
 
 	ssPush(1);
-	if (simSpillBase > simStackPtr) {
-		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
-	}
+	updateSimSpillBase();
 	cascade0 = ssTop();
 	(cascade0->type = SSConstant);
 	(cascade0->spilled = 0);
@@ -28291,9 +28294,7 @@
 	(simStackEntry.annotateUse = 0);
 	(simStackEntry.bcptr = bytecodePC);
 	simStack[(simStackPtr += 1)] = simStackEntry;
-	if (simSpillBase > simStackPtr) {
-		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
-	}
+	updateSimSpillBase();
 	return 0;
 }
 
@@ -28304,9 +28305,7 @@
     CogSimStackEntry * cascade0;
 
 	ssPush(1);
-	if (simSpillBase > simStackPtr) {
-		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
-	}
+	updateSimSpillBase();
 	cascade0 = ssTop();
 	(cascade0->type = SSRegister);
 	(cascade0->spilled = 0);
@@ -28449,6 +28448,15 @@
 	return 1;
 }
 
+	/* StackToRegisterMappingCogit>>#updateSimSpillBase */
+static void
+updateSimSpillBase(void)
+{
+	if (simSpillBase > simStackPtr) {
+		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
+	}
+}
+
 	/* StackToRegisterMappingCogit>>#v3or4PushNilSize:numInitialNils: */
 static sqInt
 v3or4PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils)

Modified: branches/Cog/nsspursrc/vm/cogitIA32.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogitIA32.c	2015-06-28 19:15:19 UTC (rev 3392)
+++ branches/Cog/nsspursrc/vm/cogitIA32.c	2015-06-29 23:59:01 UTC (rev 3393)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1388 uuid: 5946eb20-1cae-4cba-98b5-467aa146ffab
+	CCodeGenerator VMMaker.oscog-eem.1401 uuid: 036f0933-639a-49dd-8a1d-a03bcdcb0a0a
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1388 uuid: 5946eb20-1cae-4cba-98b5-467aa146ffab
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1401 uuid: 036f0933-639a-49dd-8a1d-a03bcdcb0a0a
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1388 uuid: 5946eb20-1cae-4cba-98b5-467aa146ffab " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1401 uuid: 036f0933-639a-49dd-8a1d-a03bcdcb0a0a " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -1078,6 +1078,7 @@
 static sqInt genSpecialSelectorComparison(void);
 static sqInt genSpecialSelectorEqualsEquals(void);
 static sqInt genSpecialSelectorEqualsEqualsWithForwarders(void);
+static sqInt genStaticallyResolvedSpecialSelectorComparison(void);
 static sqInt genStorePopLiteralVariable(sqInt popBoolean, sqInt litVarIndex) NoDbgRegParms;
 static sqInt genStorePopMaybeContextReceiverVariable(sqInt popBoolean, sqInt slotIndex) NoDbgRegParms;
 static sqInt genStorePopReceiverVariable(sqInt popBoolean, sqInt slotIndex) NoDbgRegParms;
@@ -1128,6 +1129,7 @@
 static CogSimStackEntry ssTopDescriptor(void);
 static CogSimStackEntry * ssValue(sqInt n) NoDbgRegParms;
 static sqInt tryCollapseTempVectorInitializationOfSize(sqInt slots) NoDbgRegParms;
+static void updateSimSpillBase(void);
 static sqInt v3or4PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils) NoDbgRegParms;
 static sqInt v3or4NumPushNils(BytecodeDescriptor *descriptor, sqInt pc, sqInt nExts, sqInt aMethodObj) NoDbgRegParms;
 
@@ -23140,13 +23142,11 @@
 ensureReceiverResultRegContainsSelf(void)
 {
 	if (needsFrame) {
-		if (!(((optStatus.isReceiverResultRegLive))
-			 && (((optStatus.ssEntry)) == ((&simSelf))))) {
+		if (!((optStatus.isReceiverResultRegLive))) {
 			ssAllocateRequiredReg(ReceiverResultReg);
 			storeToReg((&simSelf), ReceiverResultReg);
 		}
 		(optStatus.isReceiverResultRegLive = 1);
-		(optStatus.ssEntry = (&simSelf));
 	}
 	else {
 		assert((((simSelf.type)) == SSRegister)
@@ -24111,6 +24111,7 @@
 	startpc = bytecodePC + (((generatorAt(byte0))->numBytes));
 	addBlockStartAtnumArgsnumCopiedspan(startpc, (numArgs = (byte1 & 7) + ((extA % 16) * 8)), (numCopied = ((((usqInt) byte1) >> 3) & 7) + ((extA / 16) * 8)), byte2 + (extB << 8));
 	extA = (extB = 0);
+	/* begin genInlineClosure:numArgs:numCopied: */
 	assert(getActiveContextAllocatesInMachineCode());
 	(optStatus.isReceiverResultRegLive = 0);
 	ssAllocateCallRegandand(ReceiverResultReg, SendNumArgsReg, ClassReg);
@@ -24119,19 +24120,9 @@
 		reg = ssStorePoptoPreferredReg(1, TempReg);
 		genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, (ClosureFirstCopiedValueIndex + numCopied) - i, ReceiverResultReg);
 	}
-	return ssPushRegister(ReceiverResultReg);
+	ssPushRegister(ReceiverResultReg);
 
-	if (numCopied > 0) {
-		ssFlushTo(simStackPtr);
-	}
-	(optStatus.isReceiverResultRegLive = 0);
-	ssAllocateCallRegandand(ReceiverResultReg, SendNumArgsReg, ClassReg);
-
-	genCreateClosureAtnumArgsnumCopiedcontextNumArgslargeinBlock(startpc + 1, numArgs, numCopied, methodOrBlockNumArgs, methodNeedsLargeContext(methodObj), inBlock);
-	if (numCopied > 0) {
-		ssPop(numCopied);
-	}
-	return ssPushRegister(ReceiverResultReg);
+	return 0;
 }
 
 
@@ -25458,6 +25449,7 @@
 	assert(needsFrame);
 	startpc = bytecodePC + (((generatorAt(byte0))->numBytes));
 	addBlockStartAtnumArgsnumCopiedspan(startpc, (numArgs = byte1 & 15), (numCopied = ((usqInt) byte1) >> 4), (byte2 << 8) + byte3);
+	/* begin genInlineClosure:numArgs:numCopied: */
 	assert(getActiveContextAllocatesInMachineCode());
 	(optStatus.isReceiverResultRegLive = 0);
 	ssAllocateCallRegandand(ReceiverResultReg, SendNumArgsReg, ClassReg);
@@ -25466,19 +25458,9 @@
 		reg = ssStorePoptoPreferredReg(1, TempReg);
 		genStoreSourceRegslotIndexintoNewObjectInDestReg(reg, (ClosureFirstCopiedValueIndex + numCopied) - i, ReceiverResultReg);
 	}
-	return ssPushRegister(ReceiverResultReg);
+	ssPushRegister(ReceiverResultReg);
 
-	if (numCopied > 0) {
-		ssFlushTo(simStackPtr);
-	}
-	(optStatus.isReceiverResultRegLive = 0);
-	ssAllocateCallRegandand(ReceiverResultReg, SendNumArgsReg, ClassReg);
-
-	genCreateClosureAtnumArgsnumCopiedcontextNumArgslargeinBlock(startpc + 1, numArgs, numCopied, methodOrBlockNumArgs, methodNeedsLargeContext(methodObj), inBlock);
-	if (numCopied > 0) {
-		ssPop(numCopied);
-	}
-	return ssPushRegister(ReceiverResultReg);
+	return 0;
 }
 
 
@@ -25639,8 +25621,7 @@
 static sqInt
 genPushReceiverBytecode(void)
 {
-	if (((optStatus.isReceiverResultRegLive))
-	 && (((optStatus.ssEntry)) == ((&simSelf)))) {
+	if ((optStatus.isReceiverResultRegLive)) {
 		return ssPushRegister(ReceiverResultReg);
 	}
 	return ssPushDesc(simSelf);
@@ -25679,16 +25660,25 @@
 {
     AbstractInstruction *anInstruction;
     sqInt offset;
+    sqInt regMask;
+    sqInt remoteTempReg;
+    sqInt tempVectReg;
 
-	ssAllocateRequiredRegand(ClassReg, SendNumArgsReg);
+	tempVectReg = allocateRegNotConflictingWith(0);
 	/* begin MoveMw:r:R: */
 	offset = frameOffsetOfTemporary(byte2);
 	/* begin gen:quickConstant:operand:operand: */
 	/* begin checkQuickConstant:forInstruction: */
-	anInstruction = genoperandoperandoperand(MoveMwrR, offset, FPReg, ClassReg);
+	anInstruction = genoperandoperandoperand(MoveMwrR, offset, FPReg, tempVectReg);
 	anInstruction;
-	genLoadSlotsourceRegdestReg(byte1, ClassReg, SendNumArgsReg);
-	return ssPushRegister(SendNumArgsReg);
+	/* begin availableRegOrNilNotConflictingWith: */
+	regMask = registerMaskFor(tempVectReg);
+	remoteTempReg = availableRegisterOrNilFor(backEnd, (liveRegisters()) | regMask);
+	if (!(remoteTempReg)) {
+		remoteTempReg = tempVectReg;
+	}
+	genLoadSlotsourceRegdestReg(byte1, tempVectReg, remoteTempReg);
+	return ssPushRegister(remoteTempReg);
 }
 
 
@@ -25713,16 +25703,9 @@
 static sqInt
 genReturnReceiver(void)
 {
-    AbstractInstruction *anInstruction;
-
 	if (needsFrame) {
-		if (!(((optStatus.isReceiverResultRegLive))
-			 && (((optStatus.ssEntry)) == ((&simSelf))))) {
-			/* begin MoveMw:r:R: */
-			/* begin gen:quickConstant:operand:operand: */
-			/* begin checkQuickConstant:forInstruction: */
-			anInstruction = genoperandoperandoperand(MoveMwrR, FoxMFReceiver, FPReg, ReceiverResultReg);
-			anInstruction;
+		if (!((optStatus.isReceiverResultRegLive))) {
+			storeToReg((&simSelf), ReceiverResultReg);
 		}
 	}
 	return genUpArrowReturn();
@@ -26237,9 +26220,7 @@
     sqInt postBranchPC1;
     BytecodeDescriptor *primDescriptor;
     BytecodeDescriptor *primDescriptor1;
-    sqInt rcvrInt;
     sqInt rcvrIsInt;
-    sqInt result;
     sqInt target;
     sqInt targetBytecodePC;
     sqInt targetBytecodePC1;
@@ -26250,39 +26231,10 @@
 	argIsInt = ((((ssTop())->type)) == SSConstant)
 	 && ((((argInt = ((ssTop())->constant))) & 1));
 	rcvrIsInt = ((((ssValue(1))->type)) == SSConstant)
-	 && ((((rcvrInt = ((ssValue(1))->constant))) & 1));
+	 && (((((ssValue(1))->constant)) & 1));
 	if (argIsInt
 	 && (rcvrIsInt)) {
-		;
-		
-		switch ((primDescriptor->opcode)) {
-		case JumpLess:
-			result = rcvrInt < argInt;
-			break;
-		case JumpLessOrEqual:
-			result = rcvrInt <= argInt;
-			break;
-		case JumpGreater:
-			result = rcvrInt > argInt;
-			break;
-		case JumpGreaterOrEqual:
-			result = rcvrInt >= argInt;
-			break;
-		case JumpZero:
-			result = rcvrInt == argInt;
-			break;
-		case JumpNonZero:
-			result = rcvrInt != argInt;
-			break;
-		default:
-			error("Case not found and no otherwise clause");
-		}
-		annotateBytecodeIfAnnotated(ssValue(1));
-		annotateBytecodeIfAnnotated(ssTop());
-		ssPop(2);
-		return ssPushAnnotatedConstant((result
-			? trueObject()
-			: falseObject()));
+		return genStaticallyResolvedSpecialSelectorComparison();
 	}
 	/* begin extractMaybeBranchDescriptorInto: */
 	primDescriptor1 = generatorAt(byte0);
@@ -26689,6 +26641,53 @@
 }
 
 
+/*	Assumes both operands are ints */
+
+	/* StackToRegisterMappingCogit>>#genStaticallyResolvedSpecialSelectorComparison */
+static sqInt
+genStaticallyResolvedSpecialSelectorComparison(void)
+{
+    sqInt argInt;
+    BytecodeDescriptor *primDescriptor;
+    sqInt rcvrInt;
+    sqInt result;
+
+	primDescriptor = generatorAt(byte0);
+	argInt = ((ssTop())->constant);
+	rcvrInt = ((ssValue(1))->constant);
+	
+	
+	switch ((primDescriptor->opcode)) {
+	case JumpLess:
+		result = rcvrInt < argInt;
+		break;
+	case JumpLessOrEqual:
+		result = rcvrInt <= argInt;
+		break;
+	case JumpGreater:
+		result = rcvrInt > argInt;
+		break;
+	case JumpGreaterOrEqual:
+		result = rcvrInt >= argInt;
+		break;
+	case JumpZero:
+		result = rcvrInt == argInt;
+		break;
+	case JumpNonZero:
+		result = rcvrInt != argInt;
+		break;
+	default:
+		error("Case not found and no otherwise clause");
+	}
+	annotateBytecodeIfAnnotated(ssValue(1));
+	annotateBytecodeIfAnnotated(ssTop());
+	ssPop(2);
+	return ssPushAnnotatedConstant((result
+		? trueObject()
+		: falseObject()));
+}
+
+
 /*	The only reason we assert needsFrame here is that in a frameless method
 	ReceiverResultReg must and does contain only self, but the ceStoreCheck
 	trampoline expects the target of the store to be in ReceiverResultReg. So
@@ -27026,30 +27025,34 @@
     sqInt rThird1;
     sqInt rTop;
     sqInt rTop1;
+    sqInt thirdIsReceiver;
     sqInt topRegistersMask;
 
 	rNext1 = 0;
 	rThird1 = 0;
 	rTop1 = 0;
+	needsStoreCheck = !(isUnannotatableConstant(ssTop()));
 	/* begin allocateRegForStackTopThreeEntriesInto:thirdIsReceiver: */
+	thirdIsReceiver = (prim == 0)
+	 && (needsStoreCheck);
 	topRegistersMask = 0;
 	if (((((ssTop())->type)) == SSRegister)
-	 && ((!(prim == 0))
+	 && ((!thirdIsReceiver)
 	 || ((((ssTop())->registerr)) != ReceiverResultReg))) {
 		topRegistersMask = registerMaskFor((rTop1 = ((ssTop())->registerr)));
 	}
 	if (((((ssValue(1))->type)) == SSRegister)
-	 && ((!(prim == 0))
+	 && ((!thirdIsReceiver)
 	 || ((((ssValue(1))->registerr)) != ReceiverResultReg))) {
 		topRegistersMask = topRegistersMask | (registerMaskFor((rNext1 = ((ssValue(1))->registerr))));
 	}
 	if (((((ssValue(2))->type)) == SSRegister)
-	 && ((!(prim == 0))
+	 && ((!thirdIsReceiver)
 	 || ((((ssValue(2))->registerr)) == ReceiverResultReg))) {
 		topRegistersMask = topRegistersMask | (registerMaskFor((rThird1 = ((ssValue(2))->registerr))));
 	}
 	if (!(rThird1)) {
-		if (prim == 0) {
+		if (thirdIsReceiver) {
 
 			/* Free ReceiverResultReg if it was not free */
 
@@ -27076,7 +27079,6 @@
 	assert((rr != ra1)
 	 && ((rr != ra2)
 	 && (ra1 != ra2)));
-	needsStoreCheck = !(isUnannotatableConstant(ssTop()));
 	popToReg(ssTop(), ra2);
 	ssPop(1);
 	popToReg(ssTop(), ra1);
@@ -27262,12 +27264,13 @@
     CogSimStackEntry *desc;
     sqInt i;
 
-	(optStatus.isReceiverResultRegLive = 0);
 	(simSelf.type = SSBaseOffset);
 	(simSelf.spilled = 1);
 	(simSelf.annotateUse = 0);
 	(simSelf.registerr = FPReg);
 	(simSelf.offset = FoxMFReceiver);
+	(optStatus.isReceiverResultRegLive = 0);
+	(optStatus.ssEntry = (&simSelf));
 
 	/* N.B. Includes num args */
 
@@ -28032,15 +28035,16 @@
     CogSimStackEntry *desc;
     sqInt index;
 
+	/* begin ssFlushUpThrough: */
 	for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) {
-		desc = simStackAt(index);
-		if ((((desc->type)) == SSBaseOffset)
-		 && ((((desc->registerr)) == ReceiverResultReg)
-		 && (((desc->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) {
+		if (((((simStackAt(index))->type)) == SSBaseOffset)
+		 && (((((simStackAt(index))->registerr)) == ReceiverResultReg)
+		 && ((((simStackAt(index))->offset)) == (slotOffsetOfInstVarIndex(slotIndex))))) {
 			ssFlushTo(index);
-			return;
+			goto l1;
 		}
 	}
+l1:	/* end ssFlushUpThrough: */;
 }
 
 
@@ -28055,15 +28059,16 @@
     CogSimStackEntry *desc;
     sqInt index;
 
-	for (index = (simStackPtr - 1); index >= simSpillBase; index += -1) {
-		desc = simStackAt(index);
-		if ((((desc->type)) == SSBaseOffset)
-		 && ((((desc->registerr)) == FPReg)
-		 && (((desc->offset)) == (frameOffsetOfTemporary(tempIndex))))) {
+	/* begin ssFlushUpThrough: */
+	for (index = (simStackPtr - 1); index >= (((simSpillBase < 0) ? 0 : simSpillBase)); index += -1) {
+		if (((((simStackAt(index))->type)) == SSBaseOffset)
+		 && (((((simStackAt(index))->registerr)) == FPReg)
+		 && ((((simStackAt(index))->offset)) == (frameOffsetOfTemporary(tempIndex))))) {
 			ssFlushTo(index);
-			return;
+			goto l1;
 		}
 	}
+l1:	/* end ssFlushUpThrough: */;
 }
 
 	/* StackToRegisterMappingCogit>>#ssPop: */
@@ -28083,9 +28088,7 @@
     CogSimStackEntry * cascade0;
 
 	ssPush(1);
-	if (simSpillBase > simStackPtr) {
-		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
-	}
+	updateSimSpillBase();
 	cascade0 = ssTop();
 	(cascade0->type = SSConstant);
 	(cascade0->annotateUse = 1);
@@ -28102,9 +28105,7 @@
     CogSimStackEntry * cascade0;
 
 	ssPush(1);
-	if (simSpillBase > simStackPtr) {
-		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
-	}
+	updateSimSpillBase();
 	cascade0 = ssTop();
 	(cascade0->type = SSBaseOffset);
 	(cascade0->spilled = 0);
@@ -28122,9 +28123,7 @@
     CogSimStackEntry * cascade0;
 
 	ssPush(1);
-	if (simSpillBase > simStackPtr) {
-		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
-	}
+	updateSimSpillBase();
 	cascade0 = ssTop();
 	(cascade0->type = SSConstant);
 	(cascade0->spilled = 0);
@@ -28145,9 +28144,7 @@
 	(simStackEntry.annotateUse = 0);
 	(simStackEntry.bcptr = bytecodePC);
 	simStack[(simStackPtr += 1)] = simStackEntry;
-	if (simSpillBase > simStackPtr) {
-		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
-	}
+	updateSimSpillBase();
 	return 0;
 }
 
@@ -28158,9 +28155,7 @@
     CogSimStackEntry * cascade0;
 
 	ssPush(1);
-	if (simSpillBase > simStackPtr) {
-		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
-	}
+	updateSimSpillBase();
 	cascade0 = ssTop();
 	(cascade0->type = SSRegister);
 	(cascade0->spilled = 0);
@@ -28303,6 +28298,15 @@
 	return 1;
 }
 
+	/* StackToRegisterMappingCogit>>#updateSimSpillBase */
+static void
+updateSimSpillBase(void)
+{
+	if (simSpillBase > simStackPtr) {
+		simSpillBase = ((simStackPtr < 0) ? 0 : simStackPtr);
+	}
+}
+
 	/* StackToRegisterMappingCogit>>#v3or4PushNilSize:numInitialNils: */
 static sqInt
 v3or4PushNilSizenumInitialNils(sqInt aMethodObj, sqInt numInitialNils)

Modified: branches/Cog/nsspursrc/vm/cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.c	2015-06-28 19:15:19 UTC (rev 3392)
+++ branches/Cog/nsspursrc/vm/cointerp.c	2015-06-29 23:59:01 UTC (rev 3393)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1388 uuid: 5946eb20-1cae-4cba-98b5-467aa146ffab
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1401 uuid: 036f0933-639a-49dd-8a1d-a03bcdcb0a0a
    from
-	CoInterpreter VMMaker.oscog-eem.1388 uuid: 5946eb20-1cae-4cba-98b5-467aa146ffab
+	CoInterpreter VMMaker.oscog-eem.1401 uuid: 036f0933-639a-49dd-8a1d-a03bcdcb0a0a
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1388 uuid: 5946eb20-1cae-4cba-98b5-467aa146ffab " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1401 uuid: 036f0933-639a-49dd-8a1d-a03bcdcb0a0a " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -1032,7 +1032,7 @@
 extern usqLong fullGC(void) NeverInline;
 static float getHeapGrowthToSizeGCRatio(void);
 static sqInt goodContextSize(sqInt oop) NoDbgRegParms;
-static usqInt growOldSpaceByAtLeast(sqInt minAmmount) NoDbgRegParms;
+static sqInt growOldSpaceByAtLeast(sqInt minAmmount) NoDbgRegParms;
 extern usqLong headerForSlotsformatclassIndex(sqInt numSlots, sqInt formatField, sqInt classIndex);
 static sqInt hiddenRootSlots(void);
 extern sqInt identityHashHalfWordMask(void);
@@ -1597,8 +1597,8 @@
 _iss sqInt weaklingStack;
 _iss usqInt newSpaceStart;
 _iss sqInt lkupClassTag;
+_iss SpurSegmentInfo * segments;
 _iss sqInt trueObj;
-_iss SpurSegmentInfo * segments;
 _iss sqInt falseObj;
 _iss sqInt hiddenRootsObj;
 _iss usqInt scavengeThreshold;
@@ -1791,6 +1791,7 @@
 sqInt extraVMMemory;
 sqInt checkForLeaks;
 sqInt desiredCogCodeSize;
+unsigned long maxOldSpaceSize;
 char * breakSelector;
 usqInt heapBase;
 void * showSurfaceFn;
@@ -2409,7 +2410,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.1388";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1401";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -2456,6 +2457,7 @@
 #define rememberedSetSize() GIV(rememberedSetSize)
 #define endOfMemory() GIV(endOfMemory)
 #define freeStart() GIV(freeStart)
+#define maxOldSpaceSize() maxOldSpaceSize
 #define memory() GIV(memory)
 #define newSpaceLimit() GIV(newSpaceLimit)
 #define oldSpaceStart() GIV(oldSpaceStart)
@@ -18289,7 +18291,7 @@
 static sqInt
 checkForAndFollowForwardedPrimitiveState(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    sqInt accessorDepth;
+    signed char accessorDepth;
     sqInt firstBytecode;
     sqInt found;
     sqInt found1;
@@ -36329,7 +36331,7 @@
 primitiveGrowMemoryByAtLeast(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt ammount;
-    usqInt segSize;
+    sqInt segSize;
     char *sp;
 
 	ammount = longAt(GIV(stackPointer));
@@ -51911,13 +51913,17 @@
 	Answer the size of the new segment, or nil if the attempt failed. */
 
 	/* SpurMemoryManager>>#growOldSpaceByAtLeast: */
-static usqInt
+static sqInt
 growOldSpaceByAtLeast(sqInt minAmmount)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt address;
-    sqInt ammount;
+    unsigned long ammount;
     sqInt bytes;
+    unsigned long headroom;
+    sqInt i;
     SpurSegmentInfo *segInfo;
+    usqInt total;
+    usqInt total1;
 
 
 	/* statGrowMemory counts attempts, not successes. */
@@ -51934,26 +51940,47 @@
 	/* and grow by at least growHeadroom. */
 
 	ammount = 1 << (highBit(ammount - 1));
+
+	/* Now apply the maxOldSpaceSize limit, if one is in effect. */
+
 	ammount = ((ammount < GIV(growHeadroom)) ? GIV(growHeadroom) : ammount);
-	return ((segInfo = addSegmentOfSize(ammount)),
-	(!(segInfo == null)
-			? (/* begin assimilateNewSegment: */
-				((((segInfo->segSize)) + ((segInfo->segStart))) >= GIV(endOfMemory)
-						? (GIV(freeOldSpaceStart) = (GIV(endOfMemory) = (((segInfo->segSize)) + ((segInfo->segStart))) - (2 * BaseHeaderSize)))
-						: 0),
-				sqMakeMemoryNotExecutableFromTo((segInfo->segStart), ((segInfo->segSize)) + ((segInfo->segStart))),
-				/* begin addFreeChunkWithBytes:at: */
-				(bytes = ((segInfo->segSize)) - (2 * BaseHeaderSize)),
-				(address = (segInfo->segStart)),
-				freeChunkWithBytesat(bytes, address),
-				(GIV(totalFreeOldSpace) += bytes),
-				assert((addressAfter(objectStartingAt((segInfo->segStart)))) == ((segLimit(segInfo)) - (bridgeSize()))),
-				/* begin checkFreeSpace */
-				assert(bitsSetInFreeSpaceMaskForAllFreeLists()),
-				assert(GIV(totalFreeOldSpace) == (totalFreeListBytes())),
-				checkSegments(),
-				(segInfo->segSize))
-			: 0));
+	if (maxOldSpaceSize > 0) {
+		/* begin totalBytesInSegments */
+		total1 = 0;
+		for (i = 0; i < GIV(numSegments); i += 1) {
+			total1 += ((GIV(segments)[i]).segSize);
+		}
+		total = total1;
+		if (total >= maxOldSpaceSize) {
+			return null;
+		}
+		headroom = maxOldSpaceSize - total;
+		if (headroom < ammount) {
+			if (headroom < (minAmmount + ((BaseHeaderSize * 2) + (2 * BaseHeaderSize)))) {
+				return null;
+			}
+			ammount = headroom;
+		}
+	}
+	return (addSegmentOfSize(ammount)
+		? totalBytesInSegments(maxOldSpaceSize(			/* begin assimilateNewSegment: */
+			if ((((segInfo->segSize)) + ((segInfo->segStart))) >= GIV(endOfMemory)) {
+				GIV(freeOldSpaceStart) = (GIV(endOfMemory) = (((segInfo->segSize)) + ((segInfo->segStart))) - (2 * BaseHeaderSize));
+			}
+			sqMakeMemoryNotExecutableFromTo((segInfo->segStart), ((segInfo->segSize)) + ((segInfo->segStart)));
+			/* begin addFreeChunkWithBytes:at: */
+			bytes = ((segInfo->segSize)) - (2 * BaseHeaderSize);
+			address = (segInfo->segStart);
+			freeChunkWithBytesat(bytes, address);
+			GIV(totalFreeOldSpace) += bytes;
+			assert((addressAfter(objectStartingAt((segInfo->segStart)))) == ((segLimit(segInfo)) - (bridgeSize())));
+			/* begin checkFreeSpace */
+			assert(bitsSetInFreeSpaceMaskForAllFreeLists());
+			assert(GIV(totalFreeOldSpace) == (totalFreeListBytes()));
+			checkSegments();
+			(segInfo->segSize);
+))
+		: 0);
 }
 
 
@@ -60576,7 +60603,7 @@
     usqInt prevFree;
     usqInt prevFreeChunk;
     usqInt prevPrevFree;
-    sqInt prevPrevFreeChunk;
+    usqInt prevPrevFreeChunk;
     sqInt slotBytes;
     sqInt slotBytes1;
     usqInt there;
@@ -65109,7 +65136,7 @@
 bridgeFromto(SpurSegmentInfo *aSegment, SpurSegmentInfo *nextSegmentOrNil)
 {
     usqInt bridgeSpan;
-    usqInt clifton;
+    sqInt clifton;
     usqInt segEnd;
 
 	segEnd = ((aSegment->segSize)) + ((aSegment->segStart));
@@ -65350,7 +65377,7 @@
     sqInt largeChild;
     sqInt newEndOfMemory;
     sqInt next;
-    sqInt node;
+    usqInt node;
     SpurSegmentInfo *seg;
     sqInt smallChild;
     sqInt treeNode;
@@ -82627,7 +82654,7 @@
 	38	milliseconds taken by current IGC (read-only)
 	39	Number of finalization signals for Weak Objects pending when current
 	IGC/FGC completed (read-only)
-	40	BytesPerWord for this image
+	40	BytesPerOop for this image
 	41	imageFormatVersion for the VM
 	42	number of stack pages in use
 	43	desired number of stack pages (stored in image file header, max 65535)
@@ -82657,7 +82684,9 @@
 	64	the number of methods that currently have jitted machine-code
 	65	whether the VM supports MULTIPLE_BYTECODE_SETS or not.
 	66	the byte size of a stack page
-	67 - 69 reserved for more Cog-related info
+	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
 	70	the vmProxyMajorVersion (the interpreterProxy VM_MAJOR_VERSION)
 	71	the vmProxyMinorVersion (the interpreterProxy VM_MINOR_VERSION)
 	Note: Thanks to Ian Piumarta for this primitive. */
@@ -82703,6 +82732,7 @@
     sqInt valuePointer29;
     sqInt valuePointer3;
     sqInt valuePointer30;
+    sqInt valuePointer31;
     sqInt valuePointer4;
     sqInt valuePointer5;
     sqInt valuePointer6;
@@ -82715,45 +82745,45 @@
 	if (GIV(argumentCount) == 0) {
 		result = instantiateClassindexableSize(longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (ClassArray << (shiftForWord()))), paramsArraySize);
 		/* begin storePointer:ofObject:withValue: */
-		valuePointer3 = positive64BitIntegerFor(totalBytesInSegments());
+		valuePointer4 = positive64BitIntegerFor(totalBytesInSegments());
 		assert(!(isForwarded(result)));
 		if (isOldObject(result)) {
 
 			/* most stores into young objects */
 
-			if (((valuePointer3 & 3) == 0)
-			 && (oopisLessThan(valuePointer3, GIV(newSpaceLimit)))) {
+			if (((valuePointer4 & 3) == 0)
+			 && (oopisLessThan(valuePointer4, GIV(newSpaceLimit)))) {
 				/* begin possibleRootStoreInto: */
 				if (!(((((usqInt) (longAt(result))) >> 29) & 1) != 0)) {
 					remember(result);
 				}
 			}
 		}
-		longAtput((result + BaseHeaderSize) + (0 << (shiftForWord())), valuePointer3);
+		longAtput((result + BaseHeaderSize) + (0 << (shiftForWord())), valuePointer4);
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer4 = ((((GIV(freeStart) - (((eden()).start))) + (GIV(pastSpaceStart) - (((pastSpace()).start)))) << 1) | 1);
+		valuePointer5 = ((((GIV(freeStart) - (((eden()).start))) + (GIV(pastSpaceStart) - (((pastSpace()).start)))) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (1 << (shiftForWord())), valuePointer4);
+		longAtput((result + BaseHeaderSize) + (1 << (shiftForWord())), valuePointer5);
 		/* begin storePointer:ofObject:withValue: */
-		valuePointer5 = positive64BitIntegerFor((newSpaceCapacity()) + (totalBytesInSegments()));
+		valuePointer6 = positive64BitIntegerFor((newSpaceCapacity()) + (totalBytesInSegments()));
 		assert(!(isForwarded(result)));
 		if (isOldObject(result)) {
 
 			/* most stores into young objects */
 
-			if (((valuePointer5 & 3) == 0)
-			 && (oopisLessThan(valuePointer5, GIV(newSpaceLimit)))) {
+			if (((valuePointer6 & 3) == 0)
+			 && (oopisLessThan(valuePointer6, GIV(newSpaceLimit)))) {
 				/* begin possibleRootStoreInto: */
 				if (!(((((usqInt) (longAt(result))) >> 29) & 1) != 0)) {
 					remember(result);
 				}
 			}
 		}
-		longAtput((result + BaseHeaderSize) + (2 << (shiftForWord())), valuePointer5);
+		longAtput((result + BaseHeaderSize) + (2 << (shiftForWord())), valuePointer6);
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer6 = (((((sqInt)(((scavengerTenuringThreshold()) * (((GIV(pastSpace).limit)) - ((GIV(pastSpace).start)))) / (8 * BytesPerOop)))) << 1) | 1);
+		valuePointer7 = (((((sqInt)(((scavengerTenuringThreshold()) * (((GIV(pastSpace).limit)) - ((GIV(pastSpace).start)))) / (8 * BytesPerOop)))) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (5 << (shiftForWord())), valuePointer6);
+		longAtput((result + BaseHeaderSize) + (5 << (shiftForWord())), valuePointer7);
 		/* begin storePointerUnchecked:ofObject:withValue: */
 		assert(!(isForwarded(result)));
 		longAtput((result + BaseHeaderSize) + (6 << (shiftForWord())), ((GIV(statFullGCs) << 1) | 1));
@@ -82761,13 +82791,13 @@
 		assert(!(isForwarded(result)));
 		longAtput((result + BaseHeaderSize) + (7 << (shiftForWord())), ((((GIV(statFullGCUsecs) + 500) / 1000) << 1) | 1));
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer7 = (((GIV(statScavenges)) << 1) | 1);
+		valuePointer8 = (((GIV(statScavenges)) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (8 << (shiftForWord())), valuePointer7);
+		longAtput((result + BaseHeaderSize) + (8 << (shiftForWord())), valuePointer8);
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer8 = (((((GIV(statScavengeGCUsecs)) + 500) / 1000) << 1) | 1);
+		valuePointer9 = (((((GIV(statScavengeGCUsecs)) + 500) / 1000) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (9 << (shiftForWord())), valuePointer8);
+		longAtput((result + BaseHeaderSize) + (9 << (shiftForWord())), valuePointer9);
 		/* begin storePointerUnchecked:ofObject:withValue: */
 		assert(!(isForwarded(result)));
 		longAtput((result + BaseHeaderSize) + (10 << (shiftForWord())), ((GIV(statTenures) << 1) | 1));
@@ -82777,9 +82807,9 @@
 			longAtput((result + BaseHeaderSize) + (i << (shiftForWord())), ConstZero);
 		}
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer9 = (((rootTableCount()) << 1) | 1);
+		valuePointer10 = (((rootTableCount()) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (20 << (shiftForWord())), valuePointer9);
+		longAtput((result + BaseHeaderSize) + (20 << (shiftForWord())), valuePointer10);
 		/* begin storePointerUnchecked:ofObject:withValue: */
 		assert(!(isForwarded(result)));
 		longAtput((result + BaseHeaderSize) + (21 << (shiftForWord())), ((GIV(statRootTableOverflows) << 1) | 1));
@@ -82793,9 +82823,9 @@
 		assert(!(isForwarded(result)));
 		longAtput((result + BaseHeaderSize) + (24 << (shiftForWord())), ((GIV(growHeadroom) << 1) | 1));
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer10 = (((ioHeartbeatMilliseconds()) << 1) | 1);
+		valuePointer11 = (((ioHeartbeatMilliseconds()) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (25 << (shiftForWord())), valuePointer10);
+		longAtput((result + BaseHeaderSize) + (25 << (shiftForWord())), valuePointer11);
 		/* begin storePointerUnchecked:ofObject:withValue: */
 		assert(!(isForwarded(result)));
 		longAtput((result + BaseHeaderSize) + (26 << (shiftForWord())), ((GIV(statMarkCount) << 1) | 1));
@@ -82836,9 +82866,9 @@
 		assert(!(isForwarded(result)));
 		longAtput((result + BaseHeaderSize) + (39 << (shiftForWord())), ((BytesPerWord << 1) | 1));
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer11 = (((imageFormatVersion()) << 1) | 1);
+		valuePointer12 = (((imageFormatVersion()) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (40 << (shiftForWord())), valuePointer11);
+		longAtput((result + BaseHeaderSize) + (40 << (shiftForWord())), valuePointer12);
 		/* begin storePointerUnchecked:ofObject:withValue: */
 		assert(!(isForwarded(result)));
 		longAtput((result + BaseHeaderSize) + (41 << (shiftForWord())), ((GIV(numStackPages) << 1) | 1));
@@ -82846,22 +82876,22 @@
 		assert(!(isForwarded(result)));
 		longAtput((result + BaseHeaderSize) + (42 << (shiftForWord())), ((desiredNumStackPages << 1) | 1));
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer12 = (((((GIV(eden).limit)) - ((GIV(eden).start))) << 1) | 1);
+		valuePointer13 = (((((GIV(eden).limit)) - ((GIV(eden).start))) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (43 << (shiftForWord())), valuePointer12);
+		longAtput((result + BaseHeaderSize) + (43 << (shiftForWord())), valuePointer13);
 		/* begin storePointerUnchecked:ofObject:withValue: */
 		assert(!(isForwarded(result)));
 		longAtput((result + BaseHeaderSize) + (44 << (shiftForWord())), ((desiredEdenBytes << 1) | 1));
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer13 = getCogCodeSize();
+		valuePointer14 = getCogCodeSize();
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (45 << (shiftForWord())), valuePointer13);
+		longAtput((result + BaseHeaderSize) + (45 << (shiftForWord())), valuePointer14);
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer14 = getDesiredCogCodeSize();
+		valuePointer15 = getDesiredCogCodeSize();
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (46 << (shiftForWord())), valuePointer14);
+		longAtput((result + BaseHeaderSize) + (46 << (shiftForWord())), valuePointer15);
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer15 = (((((((GIV(processHasThreadId)
+		valuePointer16 = (((((((GIV(processHasThreadId)
 	? 1
 	: 0)) + ((GIV(flagInterpretedMethods)
 	? 2
@@ -82871,15 +82901,15 @@
 	? 8
 	: 0))) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (47 << (shiftForWord())), valuePointer15);
+		longAtput((result + BaseHeaderSize) + (47 << (shiftForWord())), valuePointer16);
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer16 = (((ioGetMaxExtSemTableSize()) << 1) | 1);
+		valuePointer17 = (((ioGetMaxExtSemTableSize()) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (48 << (shiftForWord())), valuePointer16);
+		longAtput((result + BaseHeaderSize) + (48 << (shiftForWord())), valuePointer17);
 		/* begin storePointerUnchecked:ofObject:withValue: */
-		valuePointer17 = (((rootTableCapacity()) << 1) | 1);
+		valuePointer18 = (((rootTableCapacity()) << 1) | 1);
 		assert(!(isForwarded(result)));
-		longAtput((result + BaseHeaderSize) + (51 << (shiftForWord())), valuePointer17);
+		longAtput((result + BaseHeaderSize) + (51 << (shiftForWord())), valuePointer18);
 		/* begin storePointerUnchecked:ofObject:withValue: */
 		valuePointer = (((numSegments()) << 1) | 1);
 		assert(!(isForwarded(result)));
@@ -82906,129 +82936,134 @@
 		longAtput((result + BaseHeaderSize) + (54 << (shiftForWord())), valuePointer2);
 
 		/* begin storePointer:ofObject:withValue: */
-		valuePointer18 = positive64BitIntegerFor(GIV(statProcessSwitch));
+		valuePointer19 = positive64BitIntegerFor(GIV(statProcessSwitch));
 		assert(!(isForwarded(result)));
 		if (isOldObject(result)) {
 
 			/* most stores into young objects */
 
-			if (((valuePointer18 & 3) == 0)
-			 && (oopisLessThan(valuePointer18, GIV(newSpaceLimit)))) {
+			if (((valuePointer19 & 3) == 0)
+			 && (oopisLessThan(valuePointer19, GIV(newSpaceLimit)))) {
 				/* begin possibleRootStoreInto: */
 				if (!(((((usqInt) (longAt(result))) >> 29) & 1) != 0)) {
 					remember(result);
 				}
 			}
 		}
-		longAtput((result + BaseHeaderSize) + (55 << (shiftForWord())), valuePointer18);
+		longAtput((result + BaseHeaderSize) + (55 << (shiftForWord())), valuePointer19);
 		/* begin storePointer:ofObject:withValue: */
-		valuePointer19 = positive64BitIntegerFor(GIV(statIOProcessEvents));
+		valuePointer20 = positive64BitIntegerFor(GIV(statIOProcessEvents));
 		assert(!(isForwarded(result)));
 		if (isOldObject(result)) {
 
 			/* most stores into young objects */
 
-			if (((valuePointer19 & 3) == 0)
-			 && (oopisLessThan(valuePointer19, GIV(newSpaceLimit)))) {
+			if (((valuePointer20 & 3) == 0)
+			 && (oopisLessThan(valuePointer20, GIV(newSpaceLimit)))) {
 				/* begin possibleRootStoreInto: */
 				if (!(((((usqInt) (longAt(result))) >> 29) & 1) != 0)) {
 					remember(result);
 				}
 			}
 		}
-		longAtput((result + BaseHeaderSize) + (56 << (shiftForWord())), valuePointer19);
+		longAtput((result + BaseHeaderSize) + (56 << (shiftForWord())), valuePointer20);
 		/* begin storePointer:ofObject:withValue: */
-		valuePointer20 = positive64BitIntegerFor(GIV(statForceInterruptCheck));
+		valuePointer21 = positive64BitIntegerFor(GIV(statForceInterruptCheck));
 		assert(!(isForwarded(result)));
 		if (isOldObject(result)) {
 
 			/* most stores into young objects */
 
-			if (((valuePointer20 & 3) == 0)
-			 && (oopisLessThan(valuePointer20, GIV(newSpaceLimit)))) {
+			if (((valuePointer21 & 3) == 0)
+			 && (oopisLessThan(valuePointer21, GIV(newSpaceLimit)))) {
 				/* begin possibleRootStoreInto: */
 				if (!(((((usqInt) (longAt(result))) >> 29) & 1) != 0)) {
 					remember(result);
 				}
 			}
 		}
-		longAtput((result + BaseHeaderSize) + (57 << (shiftForWord())), valuePointer20);
+		longAtput((result + BaseHeaderSize) + (57 << (shiftForWord())), valuePointer21);
 		/* begin storePointer:ofObject:withValue: */
-		valuePointer21 = positive64BitIntegerFor(GIV(statCheckForEvents));
+		valuePointer22 = positive64BitIntegerFor(GIV(statCheckForEvents));
 		assert(!(isForwarded(result)));
 		if (isOldObject(result)) {
 
 			/* most stores into young objects */
 
-			if (((valuePointer21 & 3) == 0)
-			 && (oopisLessThan(valuePointer21, GIV(newSpaceLimit)))) {
+			if (((valuePointer22 & 3) == 0)
+			 && (oopisLessThan(valuePointer22, GIV(newSpaceLimit)))) {
 				/* begin possibleRootStoreInto: */
 				if (!(((((usqInt) (longAt(result))) >> 29) & 1) != 0)) {
 					remember(result);
 				}
 			}
 		}
-		longAtput((result + BaseHeaderSize) + (58 << (shiftForWord())), valuePointer21);
+		longAtput((result + BaseHeaderSize) + (58 << (shiftForWord())), valuePointer22);
 		/* begin storePointer:ofObject:withValue: */
-		valuePointer22 = positive64BitIntegerFor(GIV(statStackOverflow));
+		valuePointer23 = positive64BitIntegerFor(GIV(statStackOverflow));
 		assert(!(isForwarded(result)));
 		if (isOldObject(result)) {
 
 			/* most stores into young objects */
 
-			if (((valuePointer22 & 3) == 0)
-			 && (oopisLessThan(valuePointer22, GIV(newSpaceLimit)))) {
+			if (((valuePointer23 & 3) == 0)
+			 && (oopisLessThan(valuePointer23, GIV(newSpaceLimit)))) {
 				/* begin possibleRootStoreInto: */
 				if (!(((((usqInt) (longAt(result))) >> 29) & 1) != 0)) {
 					remember(result);
 				}
 			}
 		}
-		longAtput((result + BaseHeaderSize) + (59 << (shiftForWord())), valuePointer22);

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list