[Vm-dev] [commit][2775] CogVM source as per VMMaker.oscog-eem.329
commits at squeakvm.org
commits at squeakvm.org
Wed Aug 21 01:28:24 UTC 2013
Revision: 2775
Author: eliot
Date: 2013-08-20 18:28:22 -0700 (Tue, 20 Aug 2013)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.329
Set the inBlock variable in scanBlock and scanMethod. Change the argument to
the needsFrameFunction to be the stack delta. Change genSpecialSelectorClass's
needsFrameFunction to needsFrameIfStackGreaterThanOne: which better handles e.g.
TextColor>>dominates: other ^self class == other class
than needsFrameIfFollowsSend:.
Modified Paths:
--------------
branches/Cog/nscogsrc/vm/cogit.c
branches/Cog/nscogsrc/vm/cogit.h
branches/Cog/nscogsrc/vm/cogmethod.h
branches/Cog/src/vm/cogit.c
branches/Cog/src/vm/cogit.h
branches/Cog/src/vm/cogmethod.h
Property Changed:
----------------
branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
Modified: branches/Cog/nscogsrc/vm/cogit.c
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.c 2013-08-20 01:18:13 UTC (rev 2774)
+++ branches/Cog/nscogsrc/vm/cogit.c 2013-08-21 01:28:22 UTC (rev 2775)
@@ -1,9 +1,9 @@
/* Automatically generated by
- CCodeGenerator VMMaker.oscog-eem.328 uuid: d9a4d11d-3a72-437e-b617-92de227ffdde
+ CCodeGenerator VMMaker.oscog-eem.329 uuid: 5bf1ecce-8cdb-48fd-bc66-b41b4cff2efe
from
- StackToRegisterMappingCogit VMMaker.oscog-eem.328 uuid: d9a4d11d-3a72-437e-b617-92de227ffdde
+ StackToRegisterMappingCogit VMMaker.oscog-eem.329 uuid: 5bf1ecce-8cdb-48fd-bc66-b41b4cff2efe
*/
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.328 uuid: d9a4d11d-3a72-437e-b617-92de227ffdde " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.329 uuid: 5bf1ecce-8cdb-48fd-bc66-b41b4cff2efe " __DATE__ ;
char *__cogitBuildInfo = __buildInfo;
@@ -918,10 +918,10 @@
sqInt mnuOffset(void);
static sqInt modRMRO(AbstractInstruction * self_in_modRMRO, sqInt mod, sqInt regMode, sqInt regOpcode);
static AbstractInstruction * gNegateR(sqInt reg);
-static sqInt needsFrameIfFollowsSend(sqInt isInBlock);
-static sqInt needsFrameIfInBlock(sqInt isInBlock);
-static sqInt needsFrameIfMod16GENumArgs(sqInt isInBlock);
-static sqInt needsFrameNever(sqInt isInBlock);
+static sqInt needsFrameIfInBlock(sqInt stackDelta);
+static sqInt needsFrameIfMod16GENumArgs(sqInt stackDelta);
+static sqInt needsFrameIfStackGreaterThanOne(sqInt stackDelta);
+static sqInt needsFrameNever(sqInt stackDelta);
static sqInt noAssertMethodClassAssociationOf(sqInt methodPointer);
static sqInt noCogMethodsMaximallyMarked(void);
static void nopsFromto(AbstractInstruction * self_in_nopsFromto, sqInt startAddr, sqInt endAddr);
@@ -1355,8 +1355,8 @@
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
- { genSpecialSelectorEqualsEquals, 0, needsFrameIfFollowsSend, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
- { genSpecialSelectorClass, 0, needsFrameIfFollowsSend, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
+ { genSpecialSelectorEqualsEquals, 0, needsFrameNever, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
+ { genSpecialSelectorClass, 0, needsFrameIfStackGreaterThanOne, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
@@ -1515,8 +1515,8 @@
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
- { genSpecialSelectorEqualsEquals, 0, needsFrameIfFollowsSend, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
- { genSpecialSelectorClass, 0, needsFrameIfFollowsSend, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
+ { genSpecialSelectorEqualsEquals, 0, needsFrameNever, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
+ { genSpecialSelectorClass, 0, needsFrameIfStackGreaterThanOne, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
@@ -16106,42 +16106,38 @@
return genoperand(NegateR, reg);
}
-
-/* As of August 2013, the code generator can't deal with spills in frameless
- methods (the
- issue is to do with the stack offset to get at an argument, which is
- changed when there's a spill).
- The only context in a spill is needed in a frameless method that I can
- think of is sends
- following sends as in e.g. TextColor>>#dominates: other ^other class ==
- self class.
- Only need to check for the frameless sends since all other sends will
- force a frame.
- */
-
static sqInt
-needsFrameIfFollowsSend(sqInt isInBlock)
+needsFrameIfInBlock(sqInt stackDelta)
{
- assert((prevBCDescriptor != null)
- && (((prevBCDescriptor->needsFrameFunction)) != null));
- return (((prevBCDescriptor->generator)) == genSpecialSelectorEqualsEquals)
- || (((prevBCDescriptor->generator)) == genSpecialSelectorClass);
+ return inBlock;
}
static sqInt
-needsFrameIfInBlock(sqInt isInBlock)
+needsFrameIfMod16GENumArgs(sqInt stackDelta)
{
- return inBlock;
+ return (byte0 % 16) >= methodOrBlockNumArgs;
}
+
+/* As of August 2013, the code generator can't deal with spills in frameless
+ methods (the
+ issue is to do with the stack offset to get at an argument, which is
+ changed when there's a spill).
+ In e.g. TextColor>>#dominates: other ^other class == self class the second
+ send of class
+ needs also rto allocate a register that the first one used, but the first
+ one's register can't be
+ spilled. So avoid this by only allowing class to be sent if the stack
+ contains a single element. */
+
static sqInt
-needsFrameIfMod16GENumArgs(sqInt isInBlock)
+needsFrameIfStackGreaterThanOne(sqInt stackDelta)
{
- return (byte0 % 16) >= methodOrBlockNumArgs;
+ return stackDelta > 1;
}
static sqInt
-needsFrameNever(sqInt isInBlock)
+needsFrameNever(sqInt stackDelta)
{
return 0;
}
@@ -17478,30 +17474,30 @@
{
BytecodeDescriptor *descriptor;
sqInt end;
+ sqInt framelessStackDelta;
sqInt (* const isPushNilFunction)(struct _BytecodeDescriptor *,sqInt,sqInt,sqInt) = v3or4IsPushNil;
sqInt nExts;
sqInt pc;
sqInt pushingNils;
- sqInt stackDelta;
needsFrame = 0;
prevBCDescriptor = null;
methodOrBlockNumArgs = (blockStart->numArgs);
- nExts = 0;
+ inBlock = 1;
pc = (blockStart->startpc);
end = ((blockStart->startpc)) + ((blockStart->span));
- stackDelta = 0;
+ framelessStackDelta = (nExts = 0);
pushingNils = 1;
while (pc < end) {
byte0 = (fetchByteofObject(pc, methodObj)) + bytecodeSetOffset;
descriptor = generatorAt(byte0);
if (!needsFrame) {
if ((((descriptor->needsFrameFunction)) == null)
- || (((descriptor->needsFrameFunction))(1))) {
+ || (((descriptor->needsFrameFunction))(framelessStackDelta))) {
needsFrame = 1;
}
else {
- stackDelta += (descriptor->stackDelta);
+ framelessStackDelta += (descriptor->stackDelta);
}
}
if (pushingNils
@@ -17528,9 +17524,9 @@
prevBCDescriptor = descriptor;
}
if (!needsFrame) {
- assert((stackDelta >= 0)
- && (((blockStart->numInitialNils)) >= stackDelta));
- (blockStart->numInitialNils = ((blockStart->numInitialNils)) - stackDelta);
+ assert((framelessStackDelta >= 0)
+ && (((blockStart->numInitialNils)) >= framelessStackDelta));
+ (blockStart->numInitialNils = ((blockStart->numInitialNils)) - framelessStackDelta);
}
}
@@ -17560,7 +17556,7 @@
}
-/* Scan the method to determine
+/* Scan the method (and all embedded blocks) to determine
- what the last bytecode is; extra bytes at the end of a method are used
to encode things like source pointers or temp names
- if the method needs a frame or not
@@ -17573,6 +17569,7 @@
{
BytecodeDescriptor *descriptor;
sqInt distance;
+ sqInt framelessStackDelta;
sqInt latestContinuation;
sqInt nExts;
sqInt numBlocks;
@@ -17580,14 +17577,14 @@
sqInt targetPC;
needsFrame = 0;
+ inBlock = 0;
prevBCDescriptor = null;
if ((primitiveIndex > 0)
&& (isQuickPrimitiveIndex(primitiveIndex))) {
return 0;
}
- numBlocks = 0;
pc = (latestContinuation = initialPC);
- nExts = 0;
+ numBlocks = (framelessStackDelta = (nExts = 0));
while (pc <= endPC) {
byte0 = (fetchByteofObject(pc, methodObj)) + bytecodeSetOffset;
descriptor = generatorAt(byte0);
@@ -17595,10 +17592,14 @@
&& (pc >= latestContinuation)) {
endPC = pc;
}
- if ((!needsFrame)
- && ((((descriptor->needsFrameFunction)) == null)
- || (((descriptor->needsFrameFunction))(0)))) {
- needsFrame = 1;
+ if (!needsFrame) {
+ if ((((descriptor->needsFrameFunction)) == null)
+ || (((descriptor->needsFrameFunction))(framelessStackDelta))) {
+ needsFrame = 1;
+ }
+ else {
+ framelessStackDelta += (descriptor->stackDelta);
+ }
}
if (isBranch(descriptor)) {
distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj);
Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h 2013-08-20 01:18:13 UTC (rev 2774)
+++ branches/Cog/nscogsrc/vm/cogit.h 2013-08-21 01:28:22 UTC (rev 2775)
@@ -1,5 +1,5 @@
/* Automatically generated by
- CCodeGenerator VMMaker.oscog-eem.328 uuid: d9a4d11d-3a72-437e-b617-92de227ffdde
+ CCodeGenerator VMMaker.oscog-eem.329 uuid: 5bf1ecce-8cdb-48fd-bc66-b41b4cff2efe
*/
Modified: branches/Cog/nscogsrc/vm/cogmethod.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogmethod.h 2013-08-20 01:18:13 UTC (rev 2774)
+++ branches/Cog/nscogsrc/vm/cogmethod.h 2013-08-21 01:28:22 UTC (rev 2775)
@@ -1,5 +1,5 @@
/* Automatically generated by
- CCodeGenerator VMMaker.oscog-eem.328 uuid: d9a4d11d-3a72-437e-b617-92de227ffdde
+ CCodeGenerator VMMaker.oscog-eem.329 uuid: 5bf1ecce-8cdb-48fd-bc66-b41b4cff2efe
*/
typedef struct {
Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
___________________________________________________________________
Modified: checkindate
- Sat Aug 17 14:48:34 PDT 2013
+ Tue Aug 20 18:27:27 PDT 2013
Modified: branches/Cog/src/vm/cogit.c
===================================================================
--- branches/Cog/src/vm/cogit.c 2013-08-20 01:18:13 UTC (rev 2774)
+++ branches/Cog/src/vm/cogit.c 2013-08-21 01:28:22 UTC (rev 2775)
@@ -1,9 +1,9 @@
/* Automatically generated by
- CCodeGenerator VMMaker.oscog-eem.328 uuid: d9a4d11d-3a72-437e-b617-92de227ffdde
+ CCodeGenerator VMMaker.oscog-eem.329 uuid: 5bf1ecce-8cdb-48fd-bc66-b41b4cff2efe
from
- StackToRegisterMappingCogit VMMaker.oscog-eem.328 uuid: d9a4d11d-3a72-437e-b617-92de227ffdde
+ StackToRegisterMappingCogit VMMaker.oscog-eem.329 uuid: 5bf1ecce-8cdb-48fd-bc66-b41b4cff2efe
*/
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.328 uuid: d9a4d11d-3a72-437e-b617-92de227ffdde " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.329 uuid: 5bf1ecce-8cdb-48fd-bc66-b41b4cff2efe " __DATE__ ;
char *__cogitBuildInfo = __buildInfo;
@@ -873,10 +873,10 @@
sqInt mnuOffset(void);
static sqInt modRMRO(AbstractInstruction * self_in_modRMRO, sqInt mod, sqInt regMode, sqInt regOpcode);
static AbstractInstruction * gNegateR(sqInt reg);
-static sqInt needsFrameIfFollowsSend(sqInt isInBlock);
-static sqInt needsFrameIfInBlock(sqInt isInBlock);
-static sqInt needsFrameIfMod16GENumArgs(sqInt isInBlock);
-static sqInt needsFrameNever(sqInt isInBlock);
+static sqInt needsFrameIfInBlock(sqInt stackDelta);
+static sqInt needsFrameIfMod16GENumArgs(sqInt stackDelta);
+static sqInt needsFrameIfStackGreaterThanOne(sqInt stackDelta);
+static sqInt needsFrameNever(sqInt stackDelta);
static sqInt noAssertMethodClassAssociationOf(sqInt methodPointer);
static sqInt noCogMethodsMaximallyMarked(void);
static void nopsFromto(AbstractInstruction * self_in_nopsFromto, sqInt startAddr, sqInt endAddr);
@@ -1298,8 +1298,8 @@
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
- { genSpecialSelectorEqualsEquals, 0, needsFrameIfFollowsSend, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
- { genSpecialSelectorClass, 0, needsFrameIfFollowsSend, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
+ { genSpecialSelectorEqualsEquals, 0, needsFrameNever, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
+ { genSpecialSelectorClass, 0, needsFrameIfStackGreaterThanOne, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
{ genSpecialSelectorSend, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 },
@@ -14756,42 +14756,38 @@
return genoperand(NegateR, reg);
}
-
-/* As of August 2013, the code generator can't deal with spills in frameless
- methods (the
- issue is to do with the stack offset to get at an argument, which is
- changed when there's a spill).
- The only context in a spill is needed in a frameless method that I can
- think of is sends
- following sends as in e.g. TextColor>>#dominates: other ^other class ==
- self class.
- Only need to check for the frameless sends since all other sends will
- force a frame.
- */
-
static sqInt
-needsFrameIfFollowsSend(sqInt isInBlock)
+needsFrameIfInBlock(sqInt stackDelta)
{
- assert((prevBCDescriptor != null)
- && (((prevBCDescriptor->needsFrameFunction)) != null));
- return (((prevBCDescriptor->generator)) == genSpecialSelectorEqualsEquals)
- || (((prevBCDescriptor->generator)) == genSpecialSelectorClass);
+ return inBlock;
}
static sqInt
-needsFrameIfInBlock(sqInt isInBlock)
+needsFrameIfMod16GENumArgs(sqInt stackDelta)
{
- return inBlock;
+ return (byte0 % 16) >= methodOrBlockNumArgs;
}
+
+/* As of August 2013, the code generator can't deal with spills in frameless
+ methods (the
+ issue is to do with the stack offset to get at an argument, which is
+ changed when there's a spill).
+ In e.g. TextColor>>#dominates: other ^other class == self class the second
+ send of class
+ needs also rto allocate a register that the first one used, but the first
+ one's register can't be
+ spilled. So avoid this by only allowing class to be sent if the stack
+ contains a single element. */
+
static sqInt
-needsFrameIfMod16GENumArgs(sqInt isInBlock)
+needsFrameIfStackGreaterThanOne(sqInt stackDelta)
{
- return (byte0 % 16) >= methodOrBlockNumArgs;
+ return stackDelta > 1;
}
static sqInt
-needsFrameNever(sqInt isInBlock)
+needsFrameNever(sqInt stackDelta)
{
return 0;
}
@@ -16018,30 +16014,30 @@
{
BytecodeDescriptor *descriptor;
sqInt end;
+ sqInt framelessStackDelta;
sqInt (* const isPushNilFunction)(struct _BytecodeDescriptor *,sqInt,sqInt,sqInt) = v3IsPushNil;
sqInt nExts;
sqInt pc;
sqInt pushingNils;
- sqInt stackDelta;
needsFrame = 0;
prevBCDescriptor = null;
methodOrBlockNumArgs = (blockStart->numArgs);
- nExts = 0;
+ inBlock = 1;
pc = (blockStart->startpc);
end = ((blockStart->startpc)) + ((blockStart->span));
- stackDelta = 0;
+ framelessStackDelta = (nExts = 0);
pushingNils = 1;
while (pc < end) {
byte0 = (fetchByteofObject(pc, methodObj)) + bytecodeSetOffset;
descriptor = generatorAt(byte0);
if (!needsFrame) {
if ((((descriptor->needsFrameFunction)) == null)
- || (((descriptor->needsFrameFunction))(1))) {
+ || (((descriptor->needsFrameFunction))(framelessStackDelta))) {
needsFrame = 1;
}
else {
- stackDelta += (descriptor->stackDelta);
+ framelessStackDelta += (descriptor->stackDelta);
}
}
if (pushingNils
@@ -16068,9 +16064,9 @@
prevBCDescriptor = descriptor;
}
if (!needsFrame) {
- assert((stackDelta >= 0)
- && (((blockStart->numInitialNils)) >= stackDelta));
- (blockStart->numInitialNils = ((blockStart->numInitialNils)) - stackDelta);
+ assert((framelessStackDelta >= 0)
+ && (((blockStart->numInitialNils)) >= framelessStackDelta));
+ (blockStart->numInitialNils = ((blockStart->numInitialNils)) - framelessStackDelta);
}
}
@@ -16100,7 +16096,7 @@
}
-/* Scan the method to determine
+/* Scan the method (and all embedded blocks) to determine
- what the last bytecode is; extra bytes at the end of a method are used
to encode things like source pointers or temp names
- if the method needs a frame or not
@@ -16113,6 +16109,7 @@
{
BytecodeDescriptor *descriptor;
sqInt distance;
+ sqInt framelessStackDelta;
sqInt latestContinuation;
sqInt nExts;
sqInt numBlocks;
@@ -16120,14 +16117,14 @@
sqInt targetPC;
needsFrame = 0;
+ inBlock = 0;
prevBCDescriptor = null;
if ((primitiveIndex > 0)
&& (isQuickPrimitiveIndex(primitiveIndex))) {
return 0;
}
- numBlocks = 0;
pc = (latestContinuation = initialPC);
- nExts = 0;
+ numBlocks = (framelessStackDelta = (nExts = 0));
while (pc <= endPC) {
byte0 = (fetchByteofObject(pc, methodObj)) + bytecodeSetOffset;
descriptor = generatorAt(byte0);
@@ -16135,10 +16132,14 @@
&& (pc >= latestContinuation)) {
endPC = pc;
}
- if ((!needsFrame)
- && ((((descriptor->needsFrameFunction)) == null)
- || (((descriptor->needsFrameFunction))(0)))) {
- needsFrame = 1;
+ if (!needsFrame) {
+ if ((((descriptor->needsFrameFunction)) == null)
+ || (((descriptor->needsFrameFunction))(framelessStackDelta))) {
+ needsFrame = 1;
+ }
+ else {
+ framelessStackDelta += (descriptor->stackDelta);
+ }
}
if (isBranch(descriptor)) {
distance = ((descriptor->spanFunction))(descriptor, pc, nExts, methodObj);
Modified: branches/Cog/src/vm/cogit.h
===================================================================
--- branches/Cog/src/vm/cogit.h 2013-08-20 01:18:13 UTC (rev 2774)
+++ branches/Cog/src/vm/cogit.h 2013-08-21 01:28:22 UTC (rev 2775)
@@ -1,5 +1,5 @@
/* Automatically generated by
- CCodeGenerator VMMaker.oscog-eem.328 uuid: d9a4d11d-3a72-437e-b617-92de227ffdde
+ CCodeGenerator VMMaker.oscog-eem.329 uuid: 5bf1ecce-8cdb-48fd-bc66-b41b4cff2efe
*/
Modified: branches/Cog/src/vm/cogmethod.h
===================================================================
--- branches/Cog/src/vm/cogmethod.h 2013-08-20 01:18:13 UTC (rev 2774)
+++ branches/Cog/src/vm/cogmethod.h 2013-08-21 01:28:22 UTC (rev 2775)
@@ -1,5 +1,5 @@
/* Automatically generated by
- CCodeGenerator VMMaker.oscog-eem.328 uuid: d9a4d11d-3a72-437e-b617-92de227ffdde
+ CCodeGenerator VMMaker.oscog-eem.329 uuid: 5bf1ecce-8cdb-48fd-bc66-b41b4cff2efe
*/
typedef struct {
More information about the Vm-dev
mailing list