[Vm-dev] [commit][3544] CogVM source as per VMMaker.oscog-eem.1608

commits at squeakvm.org commits at squeakvm.org
Thu Dec 17 17:50:58 UTC 2015


Revision: 3544
Author:   eliot
Date:     2015-12-17 09:50:55 -0800 (Thu, 17 Dec 2015)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.1608

Cogit:
Implement identifyingPredefinedMacros and therefore start generating C for MIPSEL alongside IA32 and ARMv5 (!!)

Nuke incorrect uses of signedIntToLong on the results of callTargetFromReturnAddress:

Refactor genLookupForPerformNumArgs: along the same lines as compileOpenPIC:numArgs:
to use a base reg to access the method dict when outside the MoveMw:r:R: offset range.

generateCaptureCStackPointers: must establish the VarBaseReg before accessing any of
the stack pointer variables.

x86 Cogit:
Fix order of cmp in ArithCwR.
Extend var base range to 1Mb
Fix stupidities in concretize[Call|Jump]Full (move absolute value, not value
referenced by absolute address).
Fix REX byte slip in concretizeMoveCwR.

Subversion: add more svn:ignore properties

Modified Paths:
--------------
    branches/Cog/nsspursrc/vm/cogit.c
    branches/Cog/nsspursrc/vm/cogit.h
    branches/Cog/nsspursrc/vm/cogitARMv5.c
    branches/Cog/nsspursrc/vm/cogitIA32.c
    branches/Cog/spur64src/vm/cogit.h
    branches/Cog/spur64src/vm/cogitX64.c
    branches/Cog/spursistasrc/vm/cogit.c
    branches/Cog/spursistasrc/vm/cogit.h
    branches/Cog/spursistasrc/vm/cogitARMv5.c
    branches/Cog/spursistasrc/vm/cogitIA32.c
    branches/Cog/spursrc/vm/cogit.c
    branches/Cog/spursrc/vm/cogit.h
    branches/Cog/spursrc/vm/cogitARMv5.c
    branches/Cog/spursrc/vm/cogitIA32.c
    branches/Cog/src/vm/cogit.c
    branches/Cog/src/vm/cogit.h
    branches/Cog/src/vm/cogitARMv5.c
    branches/Cog/src/vm/cogitIA32.c

Added Paths:
-----------
    branches/Cog/nsspursrc/vm/cogitMIPSEL.c
    branches/Cog/spursistasrc/vm/cogitMIPSEL.c
    branches/Cog/spursrc/vm/cogitMIPSEL.c
    branches/Cog/src/vm/cogitMIPSEL.c

Property Changed:
----------------
    branches/Cog/build.macos64x64/gdbarm32/
    branches/Cog/build.macos64x64/squeak.cog.spur/SqueakCogSpur32x86.xcodeproj/
    branches/Cog/image/
    branches/Cog/platforms/Cross/vm/sqSCCSVersion.h


Property changes on: branches/Cog/build.macos64x64/gdbarm32
___________________________________________________________________
Added: svn:ignore
   + bfd
libiberty
opcodes
sim
zlib



Property changes on: branches/Cog/build.macos64x64/squeak.cog.spur/SqueakCogSpur32x86.xcodeproj
___________________________________________________________________
Added: svn:ignore
   + *.pbxuser
*.mode1v3



Property changes on: branches/Cog/image
___________________________________________________________________
Modified: svn:ignore
   - CogVMMaker*
*-14.23.2987.*
coglinux*
cogwin
Cog.app
cogspurlinux*
cogspurwin
CogSpur.app
Squeak-4.5-All-in-One.*
SqueakDebug.log
SqueakV41.sources
__MACOSX
crash.dmp
package-cache
prefs
special-dirs

   + *.image
*.changes
*.tgz
coglinux*
cogwin
Cog.app
cogspurlinux*
cogspurwin
CogSpur.app
Squeak-*-All-in-One.*
SqueakDebug.log
SqueakV41.sources
__MACOSX
crash.dmp
package-cache
prefs
special-dirs


Modified: branches/Cog/nsspursrc/vm/cogit.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.c	2015-12-17 00:52:47 UTC (rev 3543)
+++ branches/Cog/nsspursrc/vm/cogit.c	2015-12-17 17:50:55 UTC (rev 3544)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	Cogit VMMaker.oscog-eem.1580 uuid: 2b856f5e-e0b4-44bb-b23d-07561132f8c8
+	Cogit VMMaker.oscog-eem.1608 uuid: bf1e1bd4-7dd4-47e2-bb33-3a988cc4c276
  */
 
 #if defined(__ARM_ARCH__) || defined(__arm__) || defined(__arm32__) || defined(ARM32) || defined(_M_ARM)
@@ -10,6 +10,10 @@
 
 #	include "cogitIA32.c"
 
+#elif defined(__MIPSEL__)
+
+#	include "cogitMIPSEL.c"
+
 #else
 #	error As yet no Cogit implementation appears to exist for your platform.
 #	error Consider implementing it, starting by adding a subclass of CogAbstractInstruction.

Modified: branches/Cog/nsspursrc/vm/cogit.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.h	2015-12-17 00:52:47 UTC (rev 3543)
+++ branches/Cog/nsspursrc/vm/cogit.h	2015-12-17 17:50:55 UTC (rev 3544)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1602 uuid: 16ff1141-4cce-41a9-a9f5-742da38970ef
+	CCodeGenerator VMMaker.oscog-eem.1608 uuid: bf1e1bd4-7dd4-47e2-bb33-3a988cc4c276
  */
 
 

Modified: branches/Cog/nsspursrc/vm/cogitARMv5.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogitARMv5.c	2015-12-17 00:52:47 UTC (rev 3543)
+++ branches/Cog/nsspursrc/vm/cogitARMv5.c	2015-12-17 17:50:55 UTC (rev 3544)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1602 uuid: 16ff1141-4cce-41a9-a9f5-742da38970ef
+	CCodeGenerator VMMaker.oscog-eem.1608 uuid: bf1e1bd4-7dd4-47e2-bb33-3a988cc4c276
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1602 uuid: 16ff1141-4cce-41a9-a9f5-742da38970ef
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1608 uuid: bf1e1bd4-7dd4-47e2-bb33-3a988cc4c276
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1602 uuid: 16ff1141-4cce-41a9-a9f5-742da38970ef " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1608 uuid: bf1e1bd4-7dd4-47e2-bb33-3a988cc4c276 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -897,7 +897,7 @@
 static sqInt NoDbgRegParms genGetClassIndexOfNonImminto(sqInt sourceReg, sqInt destReg);
 static sqInt NoDbgRegParms genGetClassObjectOfClassIndexintoscratchReg(sqInt instReg, sqInt destReg, sqInt scratchReg);
 static sqInt NoDbgRegParms genGetClassObjectOfintoscratchReginstRegIsReceiver(sqInt instReg, sqInt destReg, sqInt scratchReg, sqInt instRegIsReceiver);
-static AbstractInstruction * NoDbgRegParms genGetClassTagOfintoscratchReg(sqInt instReg, sqInt destReg, sqInt scratchReg);
+static sqInt NoDbgRegParms genGetClassTagOfintoscratchReg(sqInt instReg, sqInt destReg, sqInt scratchReg);
 static sqInt NoDbgRegParms genGetCompactClassIndexNonImmOfinto(sqInt instReg, sqInt destReg);
 static sqInt NoDbgRegParms genGetDoubleValueOfinto(sqInt srcReg, sqInt destFPReg);
 static sqInt NoDbgRegParms genGetFormatOfinto(sqInt srcReg, sqInt destReg);
@@ -975,6 +975,7 @@
 static sqInt NoDbgRegParms compileInterpreterPrimitive(void (*primitiveRoutine)(void));
 static AbstractInstruction * NoDbgRegParms compileOpenPICMethodCacheProbeForwithShiftbaseRegOrNone(sqInt selector, sqInt shift, sqInt baseRegOrNone);
 static void NoDbgRegParms compileOpenPICnumArgs(sqInt selector, sqInt numArgs);
+static AbstractInstruction * NoDbgRegParms compilePerformMethodCacheProbeForwithShiftbaseRegOrNone(sqInt selectorReg, sqInt shift, sqInt baseRegOrNone);
 static sqInt extendedPushBytecode(void);
 static sqInt extendedStoreAndPopBytecode(void);
 static sqInt extendedStoreBytecode(void);
@@ -1013,7 +1014,7 @@
 static sqInt genLongUnconditionalBackwardJump(void);
 static sqInt genLongUnconditionalForwardJump(void);
 static sqInt NoDbgRegParms genLookupForPerformNumArgs(sqInt numArgs);
-static AbstractInstruction * NoDbgRegParms genMoveFalseR(sqInt reg);
+static AbstractInstruction * NoDbgRegParms genMoveConstantR(sqInt constant, sqInt reg);
 static AbstractInstruction * NoDbgRegParms genMoveTrueR(sqInt reg);
 static sqInt NoDbgRegParms genMustBeBooleanTrampolineForcalled(sqInt boolean, char *trampolineName);
 static sqInt genPrimitiveEqual(void);
@@ -3335,8 +3336,8 @@
     sqInt index1;
     sqInt index2;
     sqInt index3;
-    sqInt instrOffset;
-    usqInt instrOffset1;
+    usqInt instrOffset;
+    sqInt instrOffset1;
     sqInt instrOffset10;
     sqInt instrOffset11;
     sqInt instrOffset12;
@@ -3346,22 +3347,22 @@
     sqInt instrOffset16;
     sqInt instrOffset17;
     sqInt instrOffset18;
-    sqInt instrOffset19;
+    usqInt instrOffset19;
     sqInt instrOffset2;
     sqInt instrOffset20;
-    usqInt instrOffset21;
-    sqInt instrOffset22;
+    sqInt instrOffset21;
+    usqInt instrOffset22;
     usqInt instrOffset23;
     sqInt instrOffset24;
-    usqInt instrOffset25;
+    sqInt instrOffset25;
     sqInt instrOffset26;
     sqInt instrOffset27;
     sqInt instrOffset28;
-    sqInt instrOffset3;
-    usqInt instrOffset4;
+    usqInt instrOffset3;
+    sqInt instrOffset4;
     sqInt instrOffset5;
     sqInt instrOffset6;
-    usqInt instrOffset7;
+    sqInt instrOffset7;
     sqInt instrOffset8;
     sqInt instrOffset9;
     sqInt invert;
@@ -3694,7 +3695,7 @@
 			? 1
 			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
 		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord43;
-		instrOffset7 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+		instrOffset7 = ((usqInt) (((self_in_dispatchConcretize->machineCodeSize) = 4)));
 		/* begin machineCodeAt:put: */
 		((self_in_dispatchConcretize->machineCode))[instrOffset7 / 4] = ((AL << 28) | ((19922704 | ((0 & 1) << 5)) | ConcreteIPReg));
 		((self_in_dispatchConcretize->machineCodeSize) = instrOffset7 + 4);
@@ -5106,7 +5107,7 @@
 			? 1
 			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
 		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord35;
-		instrOffset = ((usqInt) (((self_in_dispatchConcretize->machineCodeSize) = 4)));
+		instrOffset = ((self_in_dispatchConcretize->machineCodeSize) = 4);
 		/* begin machineCodeAt:put: */
 		aWord17 = addrnrm(self_in_dispatchConcretize, destReg, srcReg1, ConcreteIPReg);
 		((self_in_dispatchConcretize->machineCode))[16 / 4] = aWord17;
@@ -5295,7 +5296,7 @@
 			? 1
 			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
 		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord210;
-		instrOffset19 = ((usqInt) (((self_in_dispatchConcretize->machineCodeSize) = 4)));
+		instrOffset19 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
 		/* begin machineCodeAt:put: */
 		aWord119 = ldrrnplusImm(self_in_dispatchConcretize, destReg10, ConcreteIPReg, 0);
 		((self_in_dispatchConcretize->machineCode))[instrOffset19 / 4] = aWord119;
@@ -5351,7 +5352,7 @@
 			? 1
 			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
 		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord212;
-		instrOffset21 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+		instrOffset21 = ((usqInt) (((self_in_dispatchConcretize->machineCodeSize) = 4)));
 		/* begin machineCodeAt:put: */
 		aWord121 = ldrbrnplusimm(self_in_dispatchConcretize, destReg11, ConcreteIPReg, 1, 0);
 		((self_in_dispatchConcretize->machineCode))[instrOffset21 / 4] = aWord121;
@@ -5379,7 +5380,7 @@
 			? 1
 			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
 		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord213;
-		instrOffset22 = ((usqInt) (((self_in_dispatchConcretize->machineCodeSize) = 4)));
+		instrOffset22 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
 		/* begin machineCodeAt:put: */
 		aWord122 = strbrnplusimm(self_in_dispatchConcretize, srcReg16, ConcreteIPReg, 1, 0);
 		((self_in_dispatchConcretize->machineCode))[instrOffset22 / 4] = aWord122;
@@ -5542,7 +5543,7 @@
 				? 1
 				: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
 			((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord37;
-			instrOffset1 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+			instrOffset1 = ((usqInt) (((self_in_dispatchConcretize->machineCodeSize) = 4)));
 			/* begin machineCodeAt:put: */
 			aWord110 = ldrhrnrm(self_in_dispatchConcretize, destReg2, srcReg3, ConcreteIPReg);
 			((self_in_dispatchConcretize->machineCode))[instrOffset1 / 4] = aWord110;
@@ -5711,7 +5712,7 @@
 				? 1
 				: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
 			((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord39;
-			instrOffset3 = ((usqInt) (((self_in_dispatchConcretize->machineCodeSize) = 4)));
+			instrOffset3 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
 			/* begin machineCodeAt:put: */
 			aWord112 = strrnrm(self_in_dispatchConcretize, srcReg6, baseReg, ConcreteIPReg);
 			((self_in_dispatchConcretize->machineCode))[instrOffset3 / 4] = aWord112;
@@ -5801,7 +5802,7 @@
 			? 1
 			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
 		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord40;
-		instrOffset4 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+		instrOffset4 = ((usqInt) (((self_in_dispatchConcretize->machineCodeSize) = 4)));
 
 	l12:	/* end rotateable8bitBitwiseImmediate:ifTrue:ifFalse: */;
 		/* begin machineCodeAt:put: */
@@ -5884,7 +5885,7 @@
 			? 1
 			: 0), abs(((((self_in_dispatchConcretize->dependent))->address)) - (((self_in_dispatchConcretize->address)) + 8)));
 		((self_in_dispatchConcretize->machineCode))[0 / 4] = aWord125;
-		instrOffset25 = ((self_in_dispatchConcretize->machineCodeSize) = 4);
+		instrOffset25 = ((usqInt) (((self_in_dispatchConcretize->machineCodeSize) = 4)));
 		/* begin machineCodeAt:put: */
 		((self_in_dispatchConcretize->machineCode))[instrOffset25 / 4] = (4115722240UL | ((ConcreteIPReg << 16) | ((1 << 23) | 0)));
 		((self_in_dispatchConcretize->machineCodeSize) = instrOffset25 + 4);
@@ -7163,7 +7164,7 @@
 	assert((instructionIsB(self_in_rewriteTransferAttarget, instr))
 	 || (instructionIsBL(self_in_rewriteTransferAttarget, instr)));
 	longAtput(callSiteReturnAddress - 4, (instr & 0xFF000000UL) | ((callDistance / 4) & 0xFFFFFF));
-	assert((((usqInt) (callTargetFromReturnAddress(self_in_rewriteTransferAttarget, callSiteReturnAddress)))) == callTargetAddress);
+	assert((callTargetFromReturnAddress(self_in_rewriteTransferAttarget, callSiteReturnAddress)) == callTargetAddress);
 	return 4;
 }
 
@@ -10527,6 +10528,7 @@
 	zeroOpcodeIndex();
 	labelCounter = 0;
 	startAddress = methodZoneBase;
+	maybeEstablishVarBase(backEnd);
 	if (captureFramePointer) {
 		/* begin MoveR:Aw: */
 		address = cFramePointerAddress();
@@ -10765,14 +10767,14 @@
 generateMapAtstart(sqInt addressOrNull, sqInt startAddress)
 {
     unsigned char annotation;
-    usqInt delta;
+    sqInt delta;
     sqInt i;
     AbstractInstruction *instruction;
     sqInt length;
-    usqInt location;
-    usqInt mapEntry;
+    sqInt location;
+    sqInt mapEntry;
     sqInt maxDelta;
-    usqInt mcpc;
+    sqInt mcpc;
 
 	length = 0;
 	location = startAddress;
@@ -16374,7 +16376,7 @@
     AbstractInstruction * jumpIsCompiledMethod;
     AbstractInstruction *jumpIsContext;
     AbstractInstruction *jumpNegative;
-    sqInt jumpNonSmallIntegerValue;
+    AbstractInstruction * jumpNonSmallIntegerValue;
     AbstractInstruction *jumpNotIndexableBits;
     AbstractInstruction *jumpNotIndexablePointers;
     AbstractInstruction * jumpNotPointers;
@@ -19338,7 +19340,7 @@
 }
 
 	/* CogObjectRepresentationForSpur>>#genGetClassTagOf:into:scratchReg: */
-static AbstractInstruction * NoDbgRegParms
+static sqInt NoDbgRegParms
 genGetClassTagOfintoscratchReg(sqInt instReg, sqInt destReg, sqInt scratchReg)
 {
 	return genGetInlineCacheClassTagFromintoforEntry(instReg, destReg, 1);
@@ -19552,7 +19554,7 @@
 	}
 	/* begin RetN: */
 	genoperand(RetN, retNoffset);
-	jmpTarget(jumpCmp, genMoveFalseR(ReceiverResultReg));
+	jmpTarget(jumpCmp, genMoveConstantR(falseObject(), ReceiverResultReg));
 	/* begin RetN: */
 	genoperand(RetN, retNoffset);
 	return 0;
@@ -21961,8 +21963,8 @@
 }
 
 
-/*	Compile one method cache probe in an OpenPIC's lookup of selector. Answer
-	the jump taken if the selector probe fails. */
+/*	Compile one method cache probe in an OpenPIC's lookup of selector.
+	Answer the jump taken if the selector probe fails. */
 
 	/* SimpleStackBasedCogit>>#compileOpenPICMethodCacheProbeFor:withShift:baseRegOrNone: */
 static AbstractInstruction * NoDbgRegParms
@@ -22097,6 +22099,79 @@
 	compileCallFornumArgsargargargargresultRegsaveRegs(ceSendFromInLineCacheMiss, 1, SendNumArgsReg, null, null, null, NoReg, 0);
 }
 
+
+/*	Compile one method cache probe in a perform: primitive's lookup of
+	selector. Answer the jump taken if the selector probe fails. */
+
+	/* SimpleStackBasedCogit>>#compilePerformMethodCacheProbeFor:withShift:baseRegOrNone: */
+static AbstractInstruction * NoDbgRegParms
+compilePerformMethodCacheProbeForwithShiftbaseRegOrNone(sqInt selectorReg, sqInt shift, sqInt baseRegOrNone)
+{
+    AbstractInstruction *anInstruction;
+    AbstractInstruction *anInstruction1;
+    AbstractInstruction *anInstruction2;
+    AbstractInstruction *anInstruction3;
+    AbstractInstruction *anInstruction4;
+    AbstractInstruction *jumpSelectorMiss;
+    sqInt offset;
+    sqInt offset1;
+
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, SendNumArgsReg, ClassReg);
+	/* begin XorR:R: */
+	genoperandoperand(XorRR, selectorReg, ClassReg);
+	if ((shiftForWord()) > shift) {
+		/* begin LogicalShiftLeftCq:R: */
+		genoperandoperand(LogicalShiftLeftCqR, (shiftForWord()) - shift, ClassReg);
+	}
+	/* begin AndCq:R: */
+	anInstruction = genoperandoperand(AndCqR, MethodCacheMask << (shiftForWord()), ClassReg);
+	if (usesOutOfLineLiteral(anInstruction)) {
+		(anInstruction->dependent = locateLiteral(MethodCacheMask << (shiftForWord())));
+	}
+	if (baseRegOrNone == NoReg) {
+		/* begin MoveMw:r:R: */
+		offset = (((usqInt)(methodCacheAddress()))) + (MethodCacheSelector << (shiftForWord()));
+		/* begin gen:quickConstant:operand:operand: */
+		anInstruction1 = genoperandoperandoperand(MoveMwrR, offset, ClassReg, TempReg);
+		if (usesOutOfLineLiteral(anInstruction1)) {
+			(anInstruction1->dependent = locateLiteral(offset));
+		}
+	}
+	else {
+		/* begin AddR:R: */
+		genoperandoperand(AddRR, baseRegOrNone, ClassReg);
+		/* begin MoveMw:r:R: */
+		anInstruction2 = genoperandoperandoperand(MoveMwrR, MethodCacheSelector << (shiftForWord()), ClassReg, TempReg);
+		if (usesOutOfLineLiteral(anInstruction2)) {
+			(anInstruction2->dependent = locateLiteral(MethodCacheSelector << (shiftForWord())));
+		}
+	}
+	/* begin CmpR:R: */
+	genoperandoperand(CmpRR, selectorReg, TempReg);
+	/* begin JumpNonZero: */
+	jumpSelectorMiss = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
+	if (baseRegOrNone == NoReg) {
+		/* begin MoveMw:r:R: */
+		offset1 = (((usqInt)(methodCacheAddress()))) + (MethodCacheClass << (shiftForWord()));
+		/* begin gen:quickConstant:operand:operand: */
+		anInstruction3 = genoperandoperandoperand(MoveMwrR, offset1, ClassReg, TempReg);
+		if (usesOutOfLineLiteral(anInstruction3)) {
+			(anInstruction3->dependent = locateLiteral(offset1));
+		}
+	}
+	else {
+		/* begin MoveMw:r:R: */
+		anInstruction4 = genoperandoperandoperand(MoveMwrR, MethodCacheClass << (shiftForWord()), ClassReg, TempReg);
+		if (usesOutOfLineLiteral(anInstruction4)) {
+			(anInstruction4->dependent = locateLiteral(MethodCacheClass << (shiftForWord())));
+		}
+	}
+	/* begin CmpR:R: */
+	genoperandoperand(CmpRR, SendNumArgsReg, TempReg);
+	return jumpSelectorMiss;
+}
+
 	/* SimpleStackBasedCogit>>#extendedPushBytecode */
 static sqInt
 extendedPushBytecode(void)
@@ -22779,165 +22854,65 @@
 {
     AbstractInstruction *anInstruction;
     AbstractInstruction *anInstruction1;
-    AbstractInstruction *anInstruction10;
     AbstractInstruction *anInstruction2;
-    AbstractInstruction *anInstruction3;
-    AbstractInstruction *anInstruction4;
-    AbstractInstruction *anInstruction5;
-    AbstractInstruction *anInstruction6;
-    AbstractInstruction *anInstruction7;
-    AbstractInstruction *anInstruction8;
-    AbstractInstruction *anInstruction9;
+    sqInt cacheBaseReg;
     AbstractInstruction *itsAHit;
     AbstractInstruction *jumpClassMiss;
     AbstractInstruction *jumpInterpret;
     AbstractInstruction *jumpSelectorMiss;
     sqInt offset;
-    sqInt offset1;
-    sqInt offset2;
-    sqInt offset3;
-    sqInt offset4;
-    sqInt offset5;
-    sqInt offset6;
+    sqInt quickConstant;
+    sqInt reg;
 
 
 	/* N.B.  Can't assume TempReg already contains the tag because a method can
 	   of course be invoked via the unchecked entry-point, e.g. as does perform:. */
-	genGetInlineCacheClassTagFromintoforEntry(ReceiverResultReg, ClassReg, 0);
+	genGetInlineCacheClassTagFromintoforEntry(ReceiverResultReg, SendNumArgsReg, 0);
 	flag("lookupInMethodCacheSel:classTag:");
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, ClassReg, SendNumArgsReg);
-	/* begin XorR:R: */
-	genoperandoperand(XorRR, Arg0Reg, ClassReg);
-	/* begin LogicalShiftLeftCq:R: */
-	genoperandoperand(LogicalShiftLeftCqR, shiftForWord(), ClassReg);
-	/* begin AndCq:R: */
-	anInstruction = genoperandoperand(AndCqR, MethodCacheMask << (shiftForWord()), ClassReg);
-	if (usesOutOfLineLiteral(anInstruction)) {
-		(anInstruction->dependent = locateLiteral(MethodCacheMask << (shiftForWord())));
-	}
-	/* begin MoveMw:r:R: */
-	offset = (((usqInt)(methodCacheAddress()))) + (MethodCacheSelector << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction4 = genoperandoperandoperand(MoveMwrR, offset, ClassReg, TempReg);
-	if (usesOutOfLineLiteral(anInstruction4)) {
-		(anInstruction4->dependent = locateLiteral(offset));
-	}
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, Arg0Reg, TempReg);
+	cacheBaseReg = NoReg;
+	jumpSelectorMiss = compilePerformMethodCacheProbeForwithShiftbaseRegOrNone(Arg0Reg, 0, cacheBaseReg);
 	/* begin JumpNonZero: */
-	jumpSelectorMiss = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
-	/* begin MoveMw:r:R: */
-	offset1 = (((usqInt)(methodCacheAddress()))) + (MethodCacheClass << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction5 = genoperandoperandoperand(MoveMwrR, offset1, ClassReg, TempReg);
-	if (usesOutOfLineLiteral(anInstruction5)) {
-		(anInstruction5->dependent = locateLiteral(offset1));
-	}
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, SendNumArgsReg, TempReg);
-	/* begin JumpNonZero: */
 	jumpClassMiss = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
-	/* begin Label */
-	itsAHit = genoperandoperand(Label, (labelCounter += 1), bytecodePC);
 	/* begin MoveMw:r:R: */
-	offset2 = (((usqInt)(methodCacheAddress()))) + (MethodCacheMethod << (shiftForWord()));
+	offset = (cacheBaseReg == NoReg
+		? (((usqInt)(methodCacheAddress()))) + (MethodCacheMethod << (shiftForWord()))
+		: MethodCacheMethod << (shiftForWord()));
 	/* begin gen:quickConstant:operand:operand: */
-	anInstruction6 = genoperandoperandoperand(MoveMwrR, offset2, ClassReg, SendNumArgsReg);
-	if (usesOutOfLineLiteral(anInstruction6)) {
-		(anInstruction6->dependent = locateLiteral(offset2));
+	anInstruction2 = genoperandoperandoperand(MoveMwrR, offset, ClassReg, SendNumArgsReg);
+	if (usesOutOfLineLiteral(anInstruction2)) {
+		(anInstruction2->dependent = locateLiteral(offset));
 	}
+	itsAHit = anInstruction2;
 	genLoadSlotsourceRegdestReg(HeaderIndex, SendNumArgsReg, ClassReg);
 
 	/* Adjust arguments and jump to the method's unchecked entry-point. */
 	jumpInterpret = genJumpImmediate(ClassReg);
 	/* begin AddCq:R: */
-	anInstruction1 = genoperandoperand(AddCqR, cmNoCheckEntryOffset, ClassReg);
-	if (usesOutOfLineLiteral(anInstruction1)) {
-		(anInstruction1->dependent = locateLiteral(cmNoCheckEntryOffset));
+	anInstruction = genoperandoperand(AddCqR, cmNoCheckEntryOffset, ClassReg);
+	if (usesOutOfLineLiteral(anInstruction)) {
+		(anInstruction->dependent = locateLiteral(cmNoCheckEntryOffset));
 	}
 	adjustArgumentsForPerform(numArgs);
 	/* begin JumpR: */
 	genoperand(JumpR, ClassReg);
 	jmpTarget(jumpSelectorMiss, jmpTarget(jumpClassMiss, gLabel()));
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, SendNumArgsReg, ClassReg);
-	/* begin XorR:R: */
-	genoperandoperand(XorRR, Arg0Reg, ClassReg);
-	/* begin LogicalShiftLeftCq:R: */
-	genoperandoperand(LogicalShiftLeftCqR, (shiftForWord()) - 1, ClassReg);
-	/* begin AndCq:R: */
-	anInstruction2 = genoperandoperand(AndCqR, MethodCacheMask << (shiftForWord()), ClassReg);
-	if (usesOutOfLineLiteral(anInstruction2)) {
-		(anInstruction2->dependent = locateLiteral(MethodCacheMask << (shiftForWord())));
-	}
-	/* begin MoveMw:r:R: */
-	offset3 = (((usqInt)(methodCacheAddress()))) + (MethodCacheSelector << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction7 = genoperandoperandoperand(MoveMwrR, offset3, ClassReg, TempReg);
-	if (usesOutOfLineLiteral(anInstruction7)) {
-		(anInstruction7->dependent = locateLiteral(offset3));
-	}
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, Arg0Reg, TempReg);
-	/* begin JumpNonZero: */
-	jumpSelectorMiss = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
-	/* begin MoveMw:r:R: */
-	offset4 = (((usqInt)(methodCacheAddress()))) + (MethodCacheClass << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction8 = genoperandoperandoperand(MoveMwrR, offset4, ClassReg, TempReg);
-	if (usesOutOfLineLiteral(anInstruction8)) {
-		(anInstruction8->dependent = locateLiteral(offset4));
-	}
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, SendNumArgsReg, TempReg);
+	jumpSelectorMiss = compilePerformMethodCacheProbeForwithShiftbaseRegOrNone(Arg0Reg, 1, cacheBaseReg);
 	/* begin JumpZero: */
 	genConditionalBranchoperand(JumpZero, ((sqInt)itsAHit));
 	jmpTarget(jumpSelectorMiss, gLabel());
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, SendNumArgsReg, ClassReg);
-	/* begin XorR:R: */
-	genoperandoperand(XorRR, Arg0Reg, ClassReg);
-	/* begin AndCq:R: */
-	anInstruction3 = genoperandoperand(AndCqR, MethodCacheMask << (shiftForWord()), ClassReg);
-	if (usesOutOfLineLiteral(anInstruction3)) {
-		(anInstruction3->dependent = locateLiteral(MethodCacheMask << (shiftForWord())));
-	}
-	/* begin MoveMw:r:R: */
-	offset5 = (((usqInt)(methodCacheAddress()))) + (MethodCacheSelector << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction9 = genoperandoperandoperand(MoveMwrR, offset5, ClassReg, TempReg);
-	if (usesOutOfLineLiteral(anInstruction9)) {
-		(anInstruction9->dependent = locateLiteral(offset5));
-	}
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, Arg0Reg, TempReg);
-	/* begin JumpNonZero: */
-	jumpSelectorMiss = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
-	/* begin MoveMw:r:R: */
-	offset6 = (((usqInt)(methodCacheAddress()))) + (MethodCacheClass << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction10 = genoperandoperandoperand(MoveMwrR, offset6, ClassReg, TempReg);
-	if (usesOutOfLineLiteral(anInstruction10)) {
-		(anInstruction10->dependent = locateLiteral(offset6));
-	}
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, SendNumArgsReg, TempReg);
+	jumpSelectorMiss = compilePerformMethodCacheProbeForwithShiftbaseRegOrNone(Arg0Reg, 1, cacheBaseReg);
 	/* begin JumpZero: */
 	genConditionalBranchoperand(JumpZero, ((sqInt)itsAHit));
 	jmpTarget(jumpSelectorMiss, jmpTarget(jumpInterpret, gLabel()));
 	return 0;
 }
 
-	/* SimpleStackBasedCogit>>#genMoveFalseR: */
+	/* SimpleStackBasedCogit>>#genMoveConstant:R: */
 static AbstractInstruction * NoDbgRegParms
-genMoveFalseR(sqInt reg)
+genMoveConstantR(sqInt constant, sqInt reg)
 {
     AbstractInstruction *anInstruction;
-    sqInt constant;
 
-	/* begin genMoveConstant:R: */
-	constant = falseObject();
 	return (shouldAnnotateObjectReference(constant)
 		? annotateobjRef(gMoveCwR(constant, reg), constant)
 		: (/* begin MoveCq:R: */
@@ -26230,6 +26205,7 @@
 	jumpNotSI = genJumpNotSmallInteger(Arg0Reg);
 	genShiftAwaySmallIntegerTagsInScratchReg(ClassReg);
 	genRemoveSmallIntegerTagsInScratchReg(Arg1Reg);
+	/* begin MulR:R: */
 	genMulRR(backEnd, Arg1Reg, ClassReg);
 	/* begin JumpOverflow: */
 	jumpOvfl = genConditionalBranchoperand(JumpOverflow, ((sqInt)0));

Modified: branches/Cog/nsspursrc/vm/cogitIA32.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogitIA32.c	2015-12-17 00:52:47 UTC (rev 3543)
+++ branches/Cog/nsspursrc/vm/cogitIA32.c	2015-12-17 17:50:55 UTC (rev 3544)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1602 uuid: 16ff1141-4cce-41a9-a9f5-742da38970ef
+	CCodeGenerator VMMaker.oscog-eem.1608 uuid: bf1e1bd4-7dd4-47e2-bb33-3a988cc4c276
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1602 uuid: 16ff1141-4cce-41a9-a9f5-742da38970ef
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1608 uuid: bf1e1bd4-7dd4-47e2-bb33-3a988cc4c276
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1602 uuid: 16ff1141-4cce-41a9-a9f5-742da38970ef " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1608 uuid: bf1e1bd4-7dd4-47e2-bb33-3a988cc4c276 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -889,6 +889,7 @@
 static sqInt NoDbgRegParms compileInterpreterPrimitive(void (*primitiveRoutine)(void));
 static AbstractInstruction * NoDbgRegParms compileOpenPICMethodCacheProbeForwithShiftbaseRegOrNone(sqInt selector, sqInt shift, sqInt baseRegOrNone);
 static void NoDbgRegParms compileOpenPICnumArgs(sqInt selector, sqInt numArgs);
+static AbstractInstruction * NoDbgRegParms compilePerformMethodCacheProbeForwithShiftbaseRegOrNone(sqInt selectorReg, sqInt shift, sqInt baseRegOrNone);
 static sqInt extendedPushBytecode(void);
 static sqInt extendedStoreAndPopBytecode(void);
 static sqInt extendedStoreBytecode(void);
@@ -927,8 +928,8 @@
 static sqInt genLongUnconditionalBackwardJump(void);
 static sqInt genLongUnconditionalForwardJump(void);
 static sqInt NoDbgRegParms genLookupForPerformNumArgs(sqInt numArgs);
-static AbstractInstruction * NoDbgRegParms genMoveFalseR(sqInt reg);
-static sqInt NoDbgRegParms genMoveTrueR(sqInt reg);
+static AbstractInstruction * NoDbgRegParms genMoveConstantR(sqInt constant, sqInt reg);
+static AbstractInstruction * NoDbgRegParms genMoveTrueR(sqInt reg);
 static sqInt NoDbgRegParms genMustBeBooleanTrampolineForcalled(sqInt boolean, char *trampolineName);
 static sqInt genPrimitiveEqual(void);
 static sqInt genPrimitiveFloatAdd(void);
@@ -6230,7 +6231,7 @@
 	byteAtput(callSiteReturnAddress - 7, (((usqInt) cacheTag) >> 16) & 0xFF);
 	byteAtput(callSiteReturnAddress - 8, (((usqInt) cacheTag) >> 8) & 0xFF);
 	byteAtput(callSiteReturnAddress - 9, cacheTag & 0xFF);
-	assert((((usqInt) (callTargetFromReturnAddress(self_in_rewriteInlineCacheAttagtarget, callSiteReturnAddress)))) == callTargetAddress);
+	assert((callTargetFromReturnAddress(self_in_rewriteInlineCacheAttagtarget, callSiteReturnAddress)) == callTargetAddress);
 	return 10;
 }
 
@@ -9592,6 +9593,7 @@
 	zeroOpcodeIndex();
 	labelCounter = 0;
 	startAddress = methodZoneBase;
+	maybeEstablishVarBase(backEnd);
 	if (captureFramePointer) {
 		/* begin MoveR:Aw: */
 		address = cFramePointerAddress();
@@ -11165,8 +11167,7 @@
 		literal = literalBeforeFollowingAddress(backEnd, mcpc);
 		mappedLiteral = remapObject(literal);
 		if (mappedLiteral != literal) {
-			/* begin storeLiteral:atAnnotatedAddress:using: */
-			storeLiteralbeforeFollowingAddress(((AbstractInstruction *) backEnd), mappedLiteral, mcpc);
+			storeLiteralbeforeFollowingAddress(backEnd, mappedLiteral, mcpc);
 			codeModified = 1;
 		}
 	}
@@ -13152,8 +13153,7 @@
 		if (couldBeObject(literal)) {
 			mappedLiteral = remapObject(literal);
 			if (literal != mappedLiteral) {
-				/* begin storeLiteral:atAnnotatedAddress:using: */
-				storeLiteralbeforeFollowingAddress(((AbstractInstruction *) backEnd), mappedLiteral, ((usqInt)mcpc));
+				storeLiteralbeforeFollowingAddress(backEnd, mappedLiteral, ((usqInt)mcpc));
 				codeModified = 1;
 			}
 			if ((hasYoungPtr != 0)
@@ -15362,7 +15362,7 @@
     AbstractInstruction * jumpIsCompiledMethod;
     AbstractInstruction *jumpIsContext;
     AbstractInstruction *jumpNegative;
-    AbstractInstruction * jumpNonSmallIntegerValue;
+    sqInt jumpNonSmallIntegerValue;
     AbstractInstruction *jumpNotIndexableBits;
     AbstractInstruction *jumpNotIndexablePointers;
     AbstractInstruction * jumpNotPointers;
@@ -17869,7 +17869,7 @@
 		/* begin JumpNonZero: */
 		jumpCmp = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
 	}
-	/* begin genMoveConstant:R: */
+	/* begin genMoveTrueR: */
 	constant = trueObject();
 	if (shouldAnnotateObjectReference(constant)) {
 		annotateobjRef(gMoveCwR(constant, ReceiverResultReg), constant);
@@ -17880,7 +17880,7 @@
 	}
 	/* begin RetN: */
 	genoperand(RetN, retNoffset);
-	jmpTarget(jumpCmp, genMoveFalseR(ReceiverResultReg));
+	jmpTarget(jumpCmp, genMoveConstantR(falseObject(), ReceiverResultReg));
 	/* begin RetN: */
 	genoperand(RetN, retNoffset);
 	return 0;
@@ -19350,8 +19350,8 @@
 }
 
 
-/*	Compile one method cache probe in an OpenPIC's lookup of selector. Answer
-	the jump taken if the selector probe fails. */
+/*	Compile one method cache probe in an OpenPIC's lookup of selector.
+	Answer the jump taken if the selector probe fails. */
 
 	/* SimpleStackBasedCogit>>#compileOpenPICMethodCacheProbeFor:withShift:baseRegOrNone: */
 static AbstractInstruction * NoDbgRegParms
@@ -19465,6 +19465,64 @@
 	compileCallFornumArgsargargargargresultRegsaveRegs(ceSendFromInLineCacheMiss, 1, SendNumArgsReg, null, null, null, NoReg, 0);
 }
 
+
+/*	Compile one method cache probe in a perform: primitive's lookup of
+	selector. Answer the jump taken if the selector probe fails. */
+
+	/* SimpleStackBasedCogit>>#compilePerformMethodCacheProbeFor:withShift:baseRegOrNone: */
+static AbstractInstruction * NoDbgRegParms
+compilePerformMethodCacheProbeForwithShiftbaseRegOrNone(sqInt selectorReg, sqInt shift, sqInt baseRegOrNone)
+{
+    AbstractInstruction *anInstruction;
+    AbstractInstruction *anInstruction1;
+    AbstractInstruction *anInstruction2;
+    AbstractInstruction *anInstruction3;
+    AbstractInstruction *anInstruction4;
+    AbstractInstruction *jumpSelectorMiss;
+    sqInt offset;
+    sqInt offset1;
+
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, SendNumArgsReg, ClassReg);
+	/* begin XorR:R: */
+	genoperandoperand(XorRR, selectorReg, ClassReg);
+	if ((shiftForWord()) > shift) {
+		/* begin LogicalShiftLeftCq:R: */
+		genoperandoperand(LogicalShiftLeftCqR, (shiftForWord()) - shift, ClassReg);
+	}
+	/* begin AndCq:R: */
+	anInstruction = genoperandoperand(AndCqR, MethodCacheMask << (shiftForWord()), ClassReg);
+	if (baseRegOrNone == NoReg) {
+		/* begin MoveMw:r:R: */
+		offset = (((usqInt)(methodCacheAddress()))) + (MethodCacheSelector << (shiftForWord()));
+		/* begin gen:quickConstant:operand:operand: */
+		anInstruction1 = genoperandoperandoperand(MoveMwrR, offset, ClassReg, TempReg);
+	}
+	else {
+		/* begin AddR:R: */
+		genoperandoperand(AddRR, baseRegOrNone, ClassReg);
+		/* begin MoveMw:r:R: */
+		anInstruction2 = genoperandoperandoperand(MoveMwrR, MethodCacheSelector << (shiftForWord()), ClassReg, TempReg);
+	}
+	/* begin CmpR:R: */
+	genoperandoperand(CmpRR, selectorReg, TempReg);
+	/* begin JumpNonZero: */
+	jumpSelectorMiss = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
+	if (baseRegOrNone == NoReg) {
+		/* begin MoveMw:r:R: */
+		offset1 = (((usqInt)(methodCacheAddress()))) + (MethodCacheClass << (shiftForWord()));
+		/* begin gen:quickConstant:operand:operand: */
+		anInstruction3 = genoperandoperandoperand(MoveMwrR, offset1, ClassReg, TempReg);
+	}
+	else {
+		/* begin MoveMw:r:R: */
+		anInstruction4 = genoperandoperandoperand(MoveMwrR, MethodCacheClass << (shiftForWord()), ClassReg, TempReg);
+	}
+	/* begin CmpR:R: */
+	genoperandoperand(CmpRR, SendNumArgsReg, TempReg);
+	return jumpSelectorMiss;
+}
+
 	/* SimpleStackBasedCogit>>#extendedPushBytecode */
 static sqInt
 extendedPushBytecode(void)
@@ -20138,132 +20196,59 @@
 {
     AbstractInstruction *anInstruction;
     AbstractInstruction *anInstruction1;
-    AbstractInstruction *anInstruction10;
     AbstractInstruction *anInstruction2;
-    AbstractInstruction *anInstruction3;
-    AbstractInstruction *anInstruction4;
-    AbstractInstruction *anInstruction5;
-    AbstractInstruction *anInstruction6;
-    AbstractInstruction *anInstruction7;
-    AbstractInstruction *anInstruction8;
-    AbstractInstruction *anInstruction9;
+    sqInt cacheBaseReg;
     AbstractInstruction *itsAHit;
     AbstractInstruction *jumpClassMiss;
     AbstractInstruction *jumpInterpret;
     AbstractInstruction *jumpSelectorMiss;
     sqInt offset;
-    sqInt offset1;
-    sqInt offset2;
-    sqInt offset3;
-    sqInt offset4;
-    sqInt offset5;
-    sqInt offset6;
+    sqInt quickConstant;
+    sqInt reg;
 
 
 	/* N.B.  Can't assume TempReg already contains the tag because a method can
 	   of course be invoked via the unchecked entry-point, e.g. as does perform:. */
-	genGetInlineCacheClassTagFromintoforEntry(ReceiverResultReg, ClassReg, 0);
+	genGetInlineCacheClassTagFromintoforEntry(ReceiverResultReg, SendNumArgsReg, 0);
 	flag("lookupInMethodCacheSel:classTag:");
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, ClassReg, SendNumArgsReg);
-	/* begin XorR:R: */
-	genoperandoperand(XorRR, Arg0Reg, ClassReg);
-	/* begin LogicalShiftLeftCq:R: */
-	genoperandoperand(LogicalShiftLeftCqR, shiftForWord(), ClassReg);
-	/* begin AndCq:R: */
-	anInstruction = genoperandoperand(AndCqR, MethodCacheMask << (shiftForWord()), ClassReg);
-	/* begin MoveMw:r:R: */
-	offset = (((usqInt)(methodCacheAddress()))) + (MethodCacheSelector << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction4 = genoperandoperandoperand(MoveMwrR, offset, ClassReg, TempReg);
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, Arg0Reg, TempReg);
+	cacheBaseReg = NoReg;
+	jumpSelectorMiss = compilePerformMethodCacheProbeForwithShiftbaseRegOrNone(Arg0Reg, 0, cacheBaseReg);
 	/* begin JumpNonZero: */
-	jumpSelectorMiss = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
-	/* begin MoveMw:r:R: */
-	offset1 = (((usqInt)(methodCacheAddress()))) + (MethodCacheClass << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction5 = genoperandoperandoperand(MoveMwrR, offset1, ClassReg, TempReg);
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, SendNumArgsReg, TempReg);
-	/* begin JumpNonZero: */
 	jumpClassMiss = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
-	/* begin Label */
-	itsAHit = genoperandoperand(Label, (labelCounter += 1), bytecodePC);
 	/* begin MoveMw:r:R: */
-	offset2 = (((usqInt)(methodCacheAddress()))) + (MethodCacheMethod << (shiftForWord()));
+	offset = (cacheBaseReg == NoReg
+		? (((usqInt)(methodCacheAddress()))) + (MethodCacheMethod << (shiftForWord()))
+		: MethodCacheMethod << (shiftForWord()));
 	/* begin gen:quickConstant:operand:operand: */
-	anInstruction6 = genoperandoperandoperand(MoveMwrR, offset2, ClassReg, SendNumArgsReg);
+	anInstruction2 = genoperandoperandoperand(MoveMwrR, offset, ClassReg, SendNumArgsReg);
+	itsAHit = anInstruction2;
 	genLoadSlotsourceRegdestReg(HeaderIndex, SendNumArgsReg, ClassReg);
 
 	/* Adjust arguments and jump to the method's unchecked entry-point. */
 	jumpInterpret = genJumpImmediate(ClassReg);
 	/* begin AddCq:R: */
-	anInstruction1 = genoperandoperand(AddCqR, cmNoCheckEntryOffset, ClassReg);
+	anInstruction = genoperandoperand(AddCqR, cmNoCheckEntryOffset, ClassReg);
 	adjustArgumentsForPerform(numArgs);
 	/* begin JumpR: */
 	genoperand(JumpR, ClassReg);
 	jmpTarget(jumpSelectorMiss, jmpTarget(jumpClassMiss, gLabel()));
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, SendNumArgsReg, ClassReg);
-	/* begin XorR:R: */
-	genoperandoperand(XorRR, Arg0Reg, ClassReg);
-	/* begin LogicalShiftLeftCq:R: */
-	genoperandoperand(LogicalShiftLeftCqR, (shiftForWord()) - 1, ClassReg);
-	/* begin AndCq:R: */
-	anInstruction2 = genoperandoperand(AndCqR, MethodCacheMask << (shiftForWord()), ClassReg);
-	/* begin MoveMw:r:R: */
-	offset3 = (((usqInt)(methodCacheAddress()))) + (MethodCacheSelector << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction7 = genoperandoperandoperand(MoveMwrR, offset3, ClassReg, TempReg);
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, Arg0Reg, TempReg);
-	/* begin JumpNonZero: */
-	jumpSelectorMiss = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
-	/* begin MoveMw:r:R: */
-	offset4 = (((usqInt)(methodCacheAddress()))) + (MethodCacheClass << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction8 = genoperandoperandoperand(MoveMwrR, offset4, ClassReg, TempReg);
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, SendNumArgsReg, TempReg);
+	jumpSelectorMiss = compilePerformMethodCacheProbeForwithShiftbaseRegOrNone(Arg0Reg, 1, cacheBaseReg);
 	/* begin JumpZero: */
 	genConditionalBranchoperand(JumpZero, ((sqInt)itsAHit));
 	jmpTarget(jumpSelectorMiss, gLabel());
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, SendNumArgsReg, ClassReg);
-	/* begin XorR:R: */
-	genoperandoperand(XorRR, Arg0Reg, ClassReg);
-	/* begin AndCq:R: */
-	anInstruction3 = genoperandoperand(AndCqR, MethodCacheMask << (shiftForWord()), ClassReg);
-	/* begin MoveMw:r:R: */
-	offset5 = (((usqInt)(methodCacheAddress()))) + (MethodCacheSelector << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction9 = genoperandoperandoperand(MoveMwrR, offset5, ClassReg, TempReg);
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, Arg0Reg, TempReg);
-	/* begin JumpNonZero: */
-	jumpSelectorMiss = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
-	/* begin MoveMw:r:R: */
-	offset6 = (((usqInt)(methodCacheAddress()))) + (MethodCacheClass << (shiftForWord()));
-	/* begin gen:quickConstant:operand:operand: */
-	anInstruction10 = genoperandoperandoperand(MoveMwrR, offset6, ClassReg, TempReg);
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, SendNumArgsReg, TempReg);
+	jumpSelectorMiss = compilePerformMethodCacheProbeForwithShiftbaseRegOrNone(Arg0Reg, 1, cacheBaseReg);
 	/* begin JumpZero: */
 	genConditionalBranchoperand(JumpZero, ((sqInt)itsAHit));
 	jmpTarget(jumpSelectorMiss, jmpTarget(jumpInterpret, gLabel()));
 	return 0;
 }
 
-	/* SimpleStackBasedCogit>>#genMoveFalseR: */
+	/* SimpleStackBasedCogit>>#genMoveConstant:R: */
 static AbstractInstruction * NoDbgRegParms
-genMoveFalseR(sqInt reg)
+genMoveConstantR(sqInt constant, sqInt reg)
 {
     AbstractInstruction *anInstruction;
-    sqInt constant;
 
-	/* begin genMoveConstant:R: */
-	constant = falseObject();
 	return (shouldAnnotateObjectReference(constant)
 		? annotateobjRef(gMoveCwR(constant, reg), constant)
 		: (/* begin MoveCq:R: */
@@ -20272,7 +20257,7 @@
 }
 
 	/* SimpleStackBasedCogit>>#genMoveTrueR: */
-static sqInt NoDbgRegParms
+static AbstractInstruction * NoDbgRegParms
 genMoveTrueR(sqInt reg)
 {
     AbstractInstruction *anInstruction;

Added: branches/Cog/nsspursrc/vm/cogitMIPSEL.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogitMIPSEL.c	                        (rev 0)
+++ branches/Cog/nsspursrc/vm/cogitMIPSEL.c	2015-12-17 17:50:55 UTC (rev 3544)
@@ -0,0 +1,26768 @@
+/* Automatically generated by
+	CCodeGenerator VMMaker.oscog-eem.1608 uuid: bf1e1bd4-7dd4-47e2-bb33-3a988cc4c276
+   from
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1608 uuid: bf1e1bd4-7dd4-47e2-bb33-3a988cc4c276
+ */
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1608 uuid: bf1e1bd4-7dd4-47e2-bb33-3a988cc4c276 " __DATE__ ;
+char *__cogitBuildInfo = __buildInfo;
+
+
+
+#include <stddef.h>
+#include "sq.h"
+#include "sqCogStackAlignment.h"
+#include "dispdbg.h"
+#include "cogmethod.h"
+#include "nssendcache.h"
+#if COGMTVM
+#include "cointerpmt.h"
+#else
+#include "cointerp.h"
+#endif
+#include "cogit.h"
+
+typedef struct _AbstractInstruction {
+	unsigned char	opcode;
+	unsigned char	machineCodeSize;
+	unsigned char	maxSize;
+	unsigned char	annotation;
+	unsigned long		operands [3];
+	unsigned long	address;
+	struct _AbstractInstruction *dependent;
+	unsigned long		machineCode [7];
+ } AbstractInstruction;
+
+#define CogMIPSELCompiler AbstractInstruction
+#define CogAbstractInstruction AbstractInstruction
+
+
+typedef struct {
+	AbstractInstruction *fakeHeader;
+	AbstractInstruction *fillInstruction;
+	sqInt	numArgs;
+	sqInt	numCopied;
+	sqInt	numInitialNils;
+	sqInt	startpc;
+	AbstractInstruction *entryLabel;
+	AbstractInstruction *stackCheckLabel;
+	sqInt	span;
+	sqInt	hasInstVarRef;
+ } BlockStart;
+
+#define CogBlockStart BlockStart
+
+
+typedef struct _BytecodeDescriptor {
+	sqInt (*generator )(void);
+	sqInt (*spanFunction )(struct _BytecodeDescriptor *,sqInt,sqInt,sqInt);
+	sqInt (*needsFrameFunction )(sqInt);
+	signed char	stackDelta;
+	unsigned char	opcode;
+	unsigned char	numBytes;
+	unsigned		isBranchTrue : 1;
+	unsigned		isBranchFalse : 1;
+	unsigned		isReturn : 1;
+	unsigned		isBlockCreation : 1;
+	unsigned		isMapped : 1;
+	unsigned		isMappedInBlock : 1;
+	unsigned		isExtension : 1;
+	unsigned		isInstVarRef : 1;
+	unsigned		hasIRC : 1;
+ } BytecodeDescriptor;
+
+#define CogBytecodeDescriptor BytecodeDescriptor
+
+
+typedef struct {
+	sqInt (*primitiveGenerator )(void);
+	sqInt	primNumArgs;
+	sqInt (*enabled )(sqInt);
+ } PrimitiveDescriptor;
+
+#define CogPrimitiveDescriptor PrimitiveDescriptor
+
+
+typedef struct {
+	AbstractInstruction *targetInstruction;
+	sqInt	instructionIndex;
+	sqInt	simStackPtr;
+ } BytecodeFixup;
+
+#define CogSSBytecodeFixup BytecodeFixup
+#define CogBytecodeFixup BytecodeFixup
+
+
+typedef struct {
+	char	type;
+	char	spilled;
+	char	annotateUse;
+	sqInt	registerr;
+	sqInt	offset;
+	sqInt	constant;
+	sqInt	bcptr;
+ } CogSimStackEntry;
+
+
+typedef struct {
+	sqInt	isReceiverResultRegLive;
+	CogSimStackEntry *ssEntry;
+ } CogSSOptStatus;
+
+
+
+/*** Constants ***/
+#define A0 4
+#define A1 5
+#define A2 6
+#define A3 7
+#define ADDIU 9
+#define ADDU 33
+#define AddCheckOverflowCqR 120
+#define AddCheckOverflowRR 121
+#define AddCqR 95
+#define AddCwR 103
+#define AddRdRd 110
+#define AddRR 89
+#define AlignmentNops 3
+#define AltBlockCreationBytecodeSize 3
+#define AltFirstSpecialSelector 80
+#define AltNumSpecialSelectors 32
+#define AND 36
+#define ANDI 12
+#define AndCqR 97
+#define AndCqRR 108
+#define AndCwR 105
+#define AndRR 91
+#define AnnotationShift 5
+#define Arg0Reg -7
+#define Arg1Reg -8
+#define ArithmeticShiftRightCqR 80
+#define ArithmeticShiftRightRR 81
+#define AT 1
+#define BadRegisterSet 1
+#define BEQ 4
+#define BGEZ 1
+#define BGTZ 7
+#define BLEZ 6
+#define BLTZ 0
+#define BlockCreationBytecodeSize 4
+#define BNE 5
+#define BREAK 13
+#define BranchTemp 11
+#define BrEqualRR 125
+#define BrLongEqualRR 135
+#define BrLongNotEqualRR 136
+#define BrNotEqualRR 126
+#define BrSignedGreaterEqualRR 134
+#define BrSignedGreaterRR 133
+#define BrSignedLessEqualRR 132
+#define BrSignedLessRR 131
+#define BrUnsignedGreaterEqualRR 130
+#define BrUnsignedGreaterRR 129
+#define BrUnsignedLessEqualRR 128
+#define BrUnsignedLessRR 127
+#define BytecodeSetHasDirectedSuperSend 0
+#define Call 6
+#define CallFull 7
+#define ClassArrayCompactIndex 51
+#define ClassBlockClosureCompactIndex 37
+#define ClassFloatCompactIndex 34
+#define ClassMethodContextCompactIndex 36
+#define ClassReg -5
+#define ClosureFirstCopiedValueIndex 3
+#define ClosureIndex 4
+#define ClosureNumArgsIndex 2
+#define ClosureOuterContextIndex 0
+#define ClosureStartPCIndex 1
+#define CMBlock 3
+#define CMClosedPIC 4
+#define CMFree 1
+#define CMMaxUsageCount 7
+#define CMMethod 2
+#define CMOpenPIC 5
+#define Cmp 8
+#define CmpC32R 102
+#define CmpCqR 94
+#define CmpCwR 101
+#define CmpRdRd 109
+#define CmpRR 88
+#define CompletePrimitive 4
+#define ConcreteVarBaseReg 22
+#define ConstZero 1
+#define ConvertRRd 115
+#define Debug DEBUGVM
+#define DIV 26
+#define DisplacementMask 0x1F
+#define DisplacementX2N 0
+#define DivRdRd 113
+#define DivRR 117
+#define DPFPReg0 -21
+#define DPFPReg1 -22
+#define DPFPReg2 -23
+#define EncounteredUnknownBytecode -6
+#define Fill32 4
+#define FirstAnnotation 64
+#define FirstJump 11
+#define FirstShortJump 15
+#define FirstSpecialSelector 176
+#define FoxCallerSavedIP 4
+#define FoxMethod -4
+#define FoxMFReceiver -12
+#define FoxSavedFP 0
+#define FoxThisContext -8
+#define FP 30
+#define FPReg -1
+#define GCModeBecome 8
+#define GCModeFull 1
+#define GCModeNewSpace 2
+#define HasBytecodePC 4
+#define HeaderIndex 0
+#define HintLoad 0
+#define HintStore 1
+#define InstanceSpecificationIndex 2
+#define InstructionPointerIndex 1
+#define InsufficientCodeSpace -2
+#define IsAbsPCReference 3
+#define IsAnnotationExtension 1
+#define IsDirectedSuperSend 9
+#define IsDisplacementX2N 0
+#define IsNSDynamicSuperSend 11
+#define IsNSSelfSend 10
+#define IsNSSendCall 6
+#define IsObjectReference 2
+#define IsRelativeCall 5
+#define IsSendCall 7
+#define IsSuperSend 8
+#define J 2
+#define JAL 3
+#define JALR 9
+#define JR 8
+#define Jump 15
+#define JumpAbove 30
+#define JumpAboveOrEqual 29
+#define JumpBelow 28
+#define JumpBelowOrEqual 31
+#define JumpCarry 22
+#define JumpFPEqual 32
+#define JumpFPGreater 36
+#define JumpFPGreaterOrEqual 37
+#define JumpFPLess 34
+#define JumpFPLessOrEqual 35
+#define JumpFPNotEqual 33
+#define JumpFPOrdered 38
+#define JumpFPUnordered 39
+#define JumpFull 11
+#define JumpGreater 26
+#define JumpGreaterOrEqual 25
+#define JumpLess 24
+#define JumpLessOrEqual 27
+#define JumpLong 12
+#define JumpLongNonZero 14
+#define JumpLongZero 13
+#define JumpNegative 18
+#define JumpNoCarry 23
+#define JumpNonNegative 19
+#define JumpNonZero 17
+#define JumpNoOverflow 21
+#define JumpOverflow 20
+#define JumpR 9
+#define JumpZero 16
+#define Label 1
+#define LargeContextSlots 62
+#define LastJump 39
+#define LB 32
+#define LBU 36
+#define LH 33
+#define LHU 37
+#define LinkReg -17
+#define Literal 2
+#define LiteralStart 1
+#define LoadEffectiveAddressMwrR 77
+#define LogicalShiftLeftCqR 84
+#define LogicalShiftLeftRR 85
+#define LogicalShiftRightCqR 82
+#define LogicalShiftRightRR 83
+#define LookupRuleDynamicSuper 0x101
+#define LookupRuleImplicit 0x100
+#define LookupRuleSelf 0
+#define LUI 15
+#define LW 35
+#define MapEnd 0
+#define MaxCompiledPrimitiveIndex 222
+#define MaxMethodSize 65535
+#define MaxNegativeErrorCode -8
+#define MaxNumArgs 15
+#define MaxStackAllocSize 1572864
+#define MaxStackCheckOffset 0xFFF
+#define MaxX2NDisplacement 992
+#define MethodCacheClass 2
+#define MethodCacheMask 0x7FC
+#define MethodCacheMethod 3
+#define MethodCacheSelector 1
+#define MethodIndex 3
+#define MethodTooBig -4
+#define MFHI 16
+#define MFLO 18
+#define MFMethodFlagHasContextFlag 1
+#define MFMethodFlagIsBlockFlag 2
+#define MoveAbR 43
+#define MoveAwR 41
+#define MoveC32R 65
+#define MoveCqR 63
+#define MoveCwR 64
+#define MoveHighR 119
+#define MoveLowR 118
+#define MoveM16rR 51
+#define MoveM64rRd 70
+#define MoveMbrR 59
+#define MoveMwrR 45
+#define MoveRAb 44
+#define MoveRAw 42
+#define MoveRdM64r 71
+#define MoveRdRd 69
+#define MoveRMbr 60
+#define MoveRMwr 46
+#define MoveRR 40
+#define MoveRXbrR 62
+#define MoveRXwrR 48
+#define MoveXbrRR 61
+#define MoveXwrRR 47
+#define MULT 24
+#define MULTIPLEBYTECODESETS 1
+#define MulCheckOverflowRR 122
+#define MulRdRd 112
+#define MulRR 116
+#define NegateR 79
+#define NewspeakVM 1
+#define Nop 5
+#define NoReg null
+#define NotFullyInitialized -1
+#define NSCClassTagIndex 0
+#define NSCEnclosingObjectIndex 1
+#define NSCNumArgsIndex 4
+#define NSCTargetIndex 2
+#define NumObjRefsInRuntime 0
+#define NumOopsPerNSC 6
+#define NumSendTrampolines 4
+#define NumSpecialSelectors 32
+#define NumTrampolines 72
+#define OneInstruction 4
+#define OR 37
+#define ORI 13
+#define OrCqR 98
+#define OrCwR 106
+#define OrRR 92
+#define Overflow 8
+#define OverflowTemp1 9
+#define OverflowTemp2 10
+#define PCReg -19
+#define PopR 72
+#define PREF 51
+#define PrefetchAw 76
+#define PrimCallCollectsProfileSamples 8
+#define PrimCallDoNotJIT 32
+#define PrimCallMayCallBack 4
+#define PrimCallNeedsNewMethod 1
+#define PrimCallNeedsPrimitiveFunction 2
+#define PrimErrWritePastObject 17
+#define PushCq 74
+#define PushCw 75
+#define PushR 73
+#define R0 0
+#define R31 31
+#define RA 31
+#define REGIMM 1
+#define ReceiverIndex 5
+#define ReceiverResultReg -3
+#define RetN 8
+#define RISCTempReg -18
+#define S0 16
+#define S1 17
+#define S2 18
+#define S3 19
+#define S4 20
+#define S5 21
+#define S6 22
+#define S7 23
+#define SB 40
+#define Scratch0Reg -9
+#define SelectorCannotInterpret 34
+#define SelectorDoesNotUnderstand 20
+#define SenderIndex 0
+#define SendNumArgsReg -6
+#define SH 41
+#define ShouldNotJIT -8
+#define SistaVM 0
+#define SLL 0
+#define SLLV 4
+#define SLT 42
+#define SLTI 10
+#define SLTIU 11
+#define SLTU 43
+#define SmallContextSlots 22
+#define SP 29
+#define SPECIAL 0
+#define SPReg -2
+#define SqrtRd 114
+#define SRA 3
+#define SRAV 7
+#define SRL 2
+#define SRLV 6
+#define SSBaseOffset 1
+#define SSConstant 2
+#define SSRegister 3
+#define SSSpill 4
+#define StackPointerIndex 2
+#define Stop 10
+#define SUBU 35
+#define SubCheckOverflowCqR 123
+#define SubCheckOverflowRR 124
+#define SubCqR 96
+#define SubCwR 104
+#define SubRdRd 111
+#define SubRR 90
+#define SW 43
+#define T2 10
+#define TargetReg 25
+#define TempReg -4
+#define TstCqR 99
+#define UnfailingPrimitive 3
+#define UnimplementedPrimitive -7
+#define V0 2

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list