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

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

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

commits-3
 
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. @@