[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