[Vm-dev] [commit][2660] CogVM source as per VMMaker.oscog-eem.250.

commits at squeakvm.org commits at squeakvm.org
Mon Jan 7 21:54:39 UTC 2013


Revision: 2660
Author:   eliot
Date:     2013-01-07 13:54:37 -0800 (Mon, 07 Jan 2013)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.250.

Fix (old) bug in ssAllocateRequiredRegMask:upThrough:
that would flush entire stack if allocating any register.

Implement absent receiver sends in the Cogit.
Refactor pushImplicitReceiver into genGetImplicitReceiverFor: and
clients and use genGetImplicitReceiverFor: for absent receiver sends.
Use Arg1Reg in place of Arg0Reg in ceImplicitReceiverTrampoline.
Fix CurrentImageCoInterpreterFacade for Newspeak methods.

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-01-05 15:10:09 UTC (rev 2659)
+++ branches/Cog/nscogsrc/vm/cogit.c	2013-01-07 21:54:37 UTC (rev 2660)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.248 uuid: 325b96ad-3c25-438e-af36-04a93839f195
+	CCodeGenerator VMMaker.oscog-eem.250 uuid: e0de5572-7682-4c5e-b5a0-ca2f32cf0c81
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.248 uuid: 325b96ad-3c25-438e-af36-04a93839f195
+	StackToRegisterMappingCogit VMMaker.oscog-eem.250 uuid: e0de5572-7682-4c5e-b5a0-ca2f32cf0c81
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.248 uuid: 325b96ad-3c25-438e-af36-04a93839f195 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.250 uuid: e0de5572-7682-4c5e-b5a0-ca2f32cf0c81 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -628,6 +628,7 @@
 static sqInt genGetDoubleValueOfinto(sqInt srcReg, sqInt destFPReg);
 static sqInt genGetFixedFieldsOfPointerNonIntintoscratchReg(sqInt instReg, sqInt destReg, sqInt scratchReg);
 static sqInt genGetHashFieldNonIntOfasSmallIntegerInto(sqInt instReg, sqInt destReg);
+static sqInt genGetImplicitReceiverFor(sqInt selector);
 static sqInt genGetLeafCallStackPointer(void);
 static void genGetLeafCallStackPointerFunction(AbstractInstruction * self_in_genGetLeafCallStackPointerFunction);
 static sqInt genInnerPICAbortTrampoline(char *name);
@@ -752,6 +753,7 @@
 static sqInt genSaveStackPointers(void);
 static sqInt genSecondExtendedSendBytecode(void);
 static sqInt genSendAbsentImplicit0ArgsBytecode(void);
+static sqInt genSendAbsentImplicitnumArgs(sqInt selector, sqInt numArgs);
 static sqInt genSendLiteralSelector0ArgsBytecode(void);
 static sqInt genSendLiteralSelector1ArgBytecode(void);
 static sqInt genSendLiteralSelector2ArgsBytecode(void);
@@ -888,6 +890,7 @@
 void markMethodAndReferents(CogBlockMethod *aCogMethod);
 static sqInt markNSYoungObjectspcmethod(sqInt annotation, char *mcpc, sqInt cogMethod);
 static sqInt markYoungObjectspcmethod(sqInt annotation, char *mcpc, sqInt cogMethod);
+static void marshallImplicitReceiverSendArguments(sqInt numArgs);
 static void marshallSendArguments(sqInt numArgs);
 usqInt maxCogMethodAddress(void);
 static sqInt maybeFreeCogMethodDoesntLookKosher(CogMethod *cogMethod);
@@ -909,6 +912,7 @@
 static sqInt noCogMethodsMaximallyMarked(void);
 static void nopsFromto(AbstractInstruction * self_in_nopsFromto, sqInt startAddr, sqInt endAddr);
 static sqInt noTargetsFreeInClosedPIC(CogMethod *cPIC);
+static sqInt numberOfSpillsInTopNItems(sqInt n);
 static sqInt numCheckFeaturesOpcodes(AbstractInstruction * self_in_numCheckFeaturesOpcodes);
 static sqInt numICacheFlushOpcodes(AbstractInstruction * self_in_numICacheFlushOpcodes);
 static sqInt numLowLevelLockOpcodes(AbstractInstruction * self_in_numLowLevelLockOpcodes);
@@ -8992,8 +8996,14 @@
 static sqInt
 genExtSendAbsentImplicitBytecode(void)
 {
-	error("shouldBeImplemented");
-	return EncounteredUnknownBytecode;
+    sqInt litIndex;
+    sqInt nArgs;
+
+	litIndex = (((usqInt) byte1) >> 3) + (extA << 5);
+	extA = 0;
+	nArgs = (byte1 & 7) + (extB << 3);
+	extB = 0;
+	return genSendAbsentImplicitnumArgs(literalofMethod(litIndex, methodObj), nArgs);
 }
 
 
@@ -9546,9 +9556,9 @@
 	genoperandoperandoperand(MoveMwrR, 0, SPReg, TempReg);
 	/* begin MoveMw:r:R: */
 	offset = jumpShortByteSize(backEnd);
-	genoperandoperandoperand(MoveMwrR, offset, TempReg, Arg0Reg);
+	genoperandoperandoperand(MoveMwrR, offset, TempReg, Arg1Reg);
 	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, ClassReg, Arg0Reg);
+	genoperandoperand(CmpRR, ClassReg, Arg1Reg);
 	/* begin JumpNonZero: */
 	jumpMiss = genoperand(JumpNonZero, ((sqInt)0));
 	/* begin MoveMw:r:R: */
@@ -9961,6 +9971,53 @@
 }
 
 
+/*	Cached implicit receiver implementation. Caller looks like
+	mov selector, ClassReg
+	call cePushImplicitReceiver
+	br continue
+	Lclass	.word
+	Lmixin:	.word
+	continue:
+	If class matches class of receiver then mixin contains either 0 or the
+	implicit receiver.
+	If 0, answer the actual receiver. This is done in the trampoline.
+	See generateNewspeakRuntime. */
+/*	Cached implicit receiver implementation. Caller looks like
+	mov selector, ClassReg
+	call cePushImplicitReceiver
+	br continue
+	Lclass	.word
+	Lmixin:	.word
+	continue:
+	If class matches class of receiver then mixin contains either 0 or the
+	implicit receiver.
+	If 0, answer the actual receiver. This is done in the trampoline.
+	See generateNewspeakRuntime. */
+
+static sqInt
+genGetImplicitReceiverFor(sqInt selector)
+{
+    AbstractInstruction *skip;
+
+	ssAllocateCallRegandandand(SendNumArgsReg, ReceiverResultReg, ClassReg, Arg1Reg);
+	if (isYoung(selector)) {
+		hasYoungReferent = 1;
+	}
+	assert(needsFrame);
+	/* begin MoveCw:R: */
+	genoperandoperand(MoveCwR, selector, SendNumArgsReg);
+	CallNewspeakSend(ceImplicitReceiverTrampoline);
+	/* begin Jump: */
+	skip = genoperand(Jump, ((sqInt)0));
+	/* begin Fill32: */
+	genoperand(Fill32, 0);
+	/* begin Fill32: */
+	genoperand(Fill32, 0);
+	jmpTarget(skip, gLabel());
+	return 0;
+}
+
+
 /*	Generate a routine that answers the stack pointer immedately
 	after a leaf call, used for checking stack pointer alignment. */
 
@@ -11805,40 +11862,15 @@
 	return ssPushRegister(ReceiverResultReg);
 }
 
-
-/*	Cached push implicit receiver implementation. Caller looks like
-	mov selector, ClassReg
-	call cePushImplicitReceiver
-	br continue
-	Lclass	.word
-	Lmixin:	.word
-	continue:
-	If class matches class of receiver then mixin contains either 0 or the
-	implicit receiver.
-	If 0, push the actual receiver. */
-
 static sqInt
 genPushImplicitReceiverBytecode(void)
 {
-    sqInt selector;
-    AbstractInstruction *skip;
+    sqInt result;
 
-	ssAllocateCallRegandandand(SendNumArgsReg, ReceiverResultReg, ClassReg, Arg0Reg);
-	selector = literalofMethod(byte1, methodObj);
-	if (isYoung(selector)) {
-		hasYoungReferent = 1;
+	result = genGetImplicitReceiverFor(literalofMethod(byte1, methodObj));
+	if (result != 0) {
+		return result;
 	}
-	assert(needsFrame);
-	/* begin MoveCw:R: */
-	genoperandoperand(MoveCwR, selector, SendNumArgsReg);
-	CallNewspeakSend(ceImplicitReceiverTrampoline);
-	/* begin Jump: */
-	skip = genoperand(Jump, ((sqInt)0));
-	/* begin Fill32: */
-	genoperand(Fill32, 0);
-	/* begin Fill32: */
-	genoperand(Fill32, 0);
-	jmpTarget(skip, gLabel());
 	return ssPushRegister(ReceiverResultReg);
 }
 
@@ -12395,17 +12427,33 @@
 
 
 /*	160-175	1010 i i i i		Send To Absent Implicit Receiver Literal Selector
-	#iiii With 0 Arguments
+	#iiii With 0 Arguments.
  */
 
 static sqInt
 genSendAbsentImplicit0ArgsBytecode(void)
 {
-	error("shouldBeImplemented");
-	return EncounteredUnknownBytecode;
+	return genSendAbsentImplicitnumArgs(literalofMethod(byte0 & 15, methodObj), 0);
 }
 
+
+/*	Get the implicit receiver and marshall arguments, shuffling the
+	stack to push the implicit receiver if necessary. Then send. */
+
 static sqInt
+genSendAbsentImplicitnumArgs(sqInt selector, sqInt numArgs)
+{
+    sqInt result;
+
+	result = genGetImplicitReceiverFor(selector);
+	if (result != 0) {
+		return result;
+	}
+	marshallImplicitReceiverSendArguments(numArgs);
+	return genMarshalledSendnumArgs(selector, numArgs);
+}
+
+static sqInt
 genSendLiteralSelector0ArgsBytecode(void)
 {
 	return genSendnumArgs(literalofMethod(byte0 & 15, methodObj), 0);
@@ -15408,6 +15456,70 @@
 
 
 /*	Spill everything on the simulated stack that needs spilling (that below
+	arguments). Marshall arguments to stack and/or registers depending on arg
+	count. If the args don't fit in registers push receiver and args (spill
+	everything). Assume
+	receiver already in ResultReceiverReg so shuffle args and push it if
+	necessary.  */
+
+static void
+marshallImplicitReceiverSendArguments(sqInt numArgs)
+{
+    sqInt index;
+    sqInt numSpilled;
+
+	if (numArgs > (numRegArgs())) {
+
+		/* The arguments must be pushed to the stack, and hence the receiver
+		   must be inserted beneath the args.  Reduce or eliminate the argument
+		   shuffle by only moving already spilled items. */
+
+		numSpilled = numberOfSpillsInTopNItems(numArgs);
+		if (numSpilled > 0) {
+			/* begin MoveMw:r:R: */
+			genoperandoperandoperand(MoveMwrR, 0, SPReg, TempReg);
+			/* begin PushR: */
+			genoperand(PushR, TempReg);
+			for (index = 2; index <= numSpilled; index += 1) {
+				/* begin MoveMw:r:R: */
+				genoperandoperandoperand(MoveMwrR, index * BytesPerWord, SPReg, TempReg);
+				/* begin MoveR:Mw:r: */
+				genoperandoperandoperand(MoveRMwr, TempReg, (index - 1) * BytesPerWord, SPReg);
+			}
+			/* begin MoveR:Mw:r: */
+			genoperandoperandoperand(MoveRMwr, ReceiverResultReg, numSpilled * BytesPerWord, SPReg);
+		}
+		else {
+			/* begin PushR: */
+			genoperand(PushR, ReceiverResultReg);
+		}
+		ssFlushTo(simStackPtr);
+	}
+	else {
+		ssFlushTo((simStackPtr - numArgs) - 1);
+		if (numArgs > 0) {
+			if (((numRegArgs()) > 1)
+			 && (numArgs > 1)) {
+				ssAllocateRequiredRegupThrough(Arg0Reg, simStackPtr - 2);
+				ssAllocateRequiredRegupThrough(Arg1Reg, simStackPtr - 1);
+			}
+			else {
+				ssAllocateRequiredRegupThrough(Arg0Reg, simStackPtr - 1);
+			}
+		}
+		if (((numRegArgs()) > 1)
+		 && (numArgs > 1)) {
+			popToReg(simStackAt(simStackPtr), Arg1Reg);
+		}
+		if (numArgs > 0) {
+			popToReg(simStackAt((simStackPtr - numArgs) + 1), Arg0Reg);
+		}
+	}
+	ssPop(numArgs);
+}
+
+
+/*	Spill everything on the simulated stack that needs spilling (that below
 	receiver and arguments).
 	Marshall receiver and arguments to stack and/or registers depending on arg
 	count. If the args don't fit in registers push receiver and args (spill
@@ -15717,7 +15829,20 @@
 	return 1;
 }
 
+static sqInt
+numberOfSpillsInTopNItems(sqInt n)
+{
+    sqInt i;
 
+	for (i = simStackPtr; i >= ((simStackPtr - n) + 1); i += -1) {
+		if (((simStackAt(i)->type)) == SSSpill) {
+			return n - (simStackPtr - i);
+		}
+	}
+	return 0;
+}
+
+
 /*	Answer the number of opcodes required to compile the CPUID call to extract
 	the extended features information.
  */
@@ -17361,7 +17486,7 @@
 	liveRegs = registerMaskForand(FPReg, SPReg);
 	for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) {
 		liveRegs = liveRegs | (registerMask(simStackAt(i)));
-		if ((liveRegs & requiredRegsMask) != 0) {
+		if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) {
 			lastRequired = i;
 		}
 	}

Modified: branches/Cog/nscogsrc/vm/cogit.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogit.h	2013-01-05 15:10:09 UTC (rev 2659)
+++ branches/Cog/nscogsrc/vm/cogit.h	2013-01-07 21:54:37 UTC (rev 2660)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.248 uuid: 325b96ad-3c25-438e-af36-04a93839f195
+	CCodeGenerator VMMaker.oscog-eem.250 uuid: e0de5572-7682-4c5e-b5a0-ca2f32cf0c81
  */
 
 

Modified: branches/Cog/nscogsrc/vm/cogmethod.h
===================================================================
--- branches/Cog/nscogsrc/vm/cogmethod.h	2013-01-05 15:10:09 UTC (rev 2659)
+++ branches/Cog/nscogsrc/vm/cogmethod.h	2013-01-07 21:54:37 UTC (rev 2660)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.248 uuid: 325b96ad-3c25-438e-af36-04a93839f195
+	CCodeGenerator VMMaker.oscog-eem.250 uuid: e0de5572-7682-4c5e-b5a0-ca2f32cf0c81
  */
 
 typedef struct {


Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
___________________________________________________________________
Modified: checkindate
   - Fri Jan  4 12:43:14 PST 2013
   + Mon Jan  7 13:52:47 PST 2013

Modified: branches/Cog/src/vm/cogit.c
===================================================================
--- branches/Cog/src/vm/cogit.c	2013-01-05 15:10:09 UTC (rev 2659)
+++ branches/Cog/src/vm/cogit.c	2013-01-07 21:54:37 UTC (rev 2660)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.248 uuid: 325b96ad-3c25-438e-af36-04a93839f195
+	CCodeGenerator VMMaker.oscog-eem.250 uuid: e0de5572-7682-4c5e-b5a0-ca2f32cf0c81
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.248 uuid: 325b96ad-3c25-438e-af36-04a93839f195
+	StackToRegisterMappingCogit VMMaker.oscog-eem.250 uuid: e0de5572-7682-4c5e-b5a0-ca2f32cf0c81
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.248 uuid: 325b96ad-3c25-438e-af36-04a93839f195 " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.250 uuid: e0de5572-7682-4c5e-b5a0-ca2f32cf0c81 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -16045,7 +16045,7 @@
 	liveRegs = registerMaskForand(FPReg, SPReg);
 	for (i = (((simSpillBase < 0) ? 0 : simSpillBase)); i <= stackPtr; i += 1) {
 		liveRegs = liveRegs | (registerMask(simStackAt(i)));
-		if ((liveRegs & requiredRegsMask) != 0) {
+		if (((registerMask(simStackAt(i))) & requiredRegsMask) != 0) {
 			lastRequired = i;
 		}
 	}

Modified: branches/Cog/src/vm/cogit.h
===================================================================
--- branches/Cog/src/vm/cogit.h	2013-01-05 15:10:09 UTC (rev 2659)
+++ branches/Cog/src/vm/cogit.h	2013-01-07 21:54:37 UTC (rev 2660)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.248 uuid: 325b96ad-3c25-438e-af36-04a93839f195
+	CCodeGenerator VMMaker.oscog-eem.250 uuid: e0de5572-7682-4c5e-b5a0-ca2f32cf0c81
  */
 
 

Modified: branches/Cog/src/vm/cogmethod.h
===================================================================
--- branches/Cog/src/vm/cogmethod.h	2013-01-05 15:10:09 UTC (rev 2659)
+++ branches/Cog/src/vm/cogmethod.h	2013-01-07 21:54:37 UTC (rev 2660)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.248 uuid: 325b96ad-3c25-438e-af36-04a93839f195
+	CCodeGenerator VMMaker.oscog-eem.250 uuid: e0de5572-7682-4c5e-b5a0-ca2f32cf0c81
  */
 
 typedef struct {



More information about the Vm-dev mailing list