[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