[Vm-dev] [commit][3253] CogVM source as per VMMaker.oscog-eem.1055

commits at squeakvm.org commits at squeakvm.org
Wed Feb 11 22:20:27 UTC 2015


Revision: 3253
Author:   eliot
Date:     2015-02-11 14:20:23 -0800 (Wed, 11 Feb 2015)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.1055

Broaden primitiveBitXor, primitiveBitAnd and primitiveBitOr for Spur 64-bits.
Make the bytecodes handle the common SmallInteger op SmallInteger case.
Now there are no uses of popPos32BitInteger in Cog :-)

Fix C code for Spur64BitMemoryManager>>fetchLong32:ofFloatObject:

Modified Paths:
--------------
    branches/Cog/nscogsrc/vm/cointerp.c
    branches/Cog/nscogsrc/vm/cointerp.h
    branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.h
    branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
    branches/Cog/nsspurstacksrc/vm/interp.c
    branches/Cog/sistasrc/vm/cointerp.c
    branches/Cog/sistasrc/vm/cointerp.h
    branches/Cog/sistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.h
    branches/Cog/spursistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/cointerp.c
    branches/Cog/spursrc/vm/cointerp.h
    branches/Cog/spursrc/vm/gcc3x-cointerp.c
    branches/Cog/spurstack64src/vm/gcc3x-interp.c
    branches/Cog/spurstack64src/vm/interp.c
    branches/Cog/spurstacksrc/vm/gcc3x-interp.c
    branches/Cog/spurstacksrc/vm/interp.c
    branches/Cog/src/vm/cointerp.c
    branches/Cog/src/vm/cointerp.h
    branches/Cog/src/vm/cointerpmt.c
    branches/Cog/src/vm/cointerpmt.h
    branches/Cog/src/vm/gcc3x-cointerp.c
    branches/Cog/src/vm/gcc3x-cointerpmt.c
    branches/Cog/stacksrc/vm/gcc3x-interp.c
    branches/Cog/stacksrc/vm/interp.c

Property Changed:
----------------
    branches/Cog/platforms/Cross/vm/sqSCCSVersion.h

Modified: branches/Cog/nscogsrc/vm/cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.c	2015-02-11 19:21:48 UTC (rev 3252)
+++ branches/Cog/nscogsrc/vm/cointerp.c	2015-02-11 22:20:23 UTC (rev 3253)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1050 uuid: ad3a825c-97ba-4d01-a0e7-637af8cbf52b
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8
    from
-	CoInterpreter VMMaker.oscog-eem.1050 uuid: ad3a825c-97ba-4d01-a0e7-637af8cbf52b
+	CoInterpreter VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1050 uuid: ad3a825c-97ba-4d01-a0e7-637af8cbf52b " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2097,7 +2097,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1050";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1055";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -8081,16 +8081,21 @@
 		case 190:
 			/* bytecodePrimBitAnd */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitAnd);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg & rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l110;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -8098,29 +8103,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitAnd */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver & integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitAnd();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -8142,16 +8125,21 @@
 		case 191:
 			/* bytecodePrimBitOr */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitOr);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg | rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l111;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -8159,29 +8147,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitOr */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver | integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitOr();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -11035,16 +11001,21 @@
 		case 350: /*94*/
 			/* bytecodePrimBitAnd */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitAnd1);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg & rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l245;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -11052,29 +11023,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitAnd */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver & integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitAnd();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -11096,16 +11045,21 @@
 		case 351: /*95*/
 			/* bytecodePrimBitOr */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitOr1);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg | rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l246;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -11113,29 +11067,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitOr */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver | integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitOr();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -24136,35 +24068,30 @@
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     usqInt integerArgument;
     usqInt integerReceiver;
-    sqInt object;
+    sqInt oop;
+    sqInt oop1;
     char *sp;
-    sqInt top;
-    sqInt top1;
-    sqInt top2;
-    sqInt top3;
+    char *sp1;
 
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top2 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top = top2;
-	integerArgument = positive32BitValueOf(top);
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top3 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top1 = top3;
-	integerReceiver = positive32BitValueOf(top1);
+	integerArgument = longAt(GIV(stackPointer));
+
+	/* Comment out the short-cut.  Either the inline interpreter bytecode or the JIT primitive will handle this case.
+	   ((objectMemory isIntegerObject: integerArgument)
+	   and: [objectMemory isIntegerObject: integerReceiver])
+	   ifTrue: [self pop: 2 thenPush: (integerArgument bitAnd: integerReceiver)]
+	   ifFalse:
+	   [ */
+
+	integerReceiver = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	integerArgument = positive32BitValueOf(integerArgument);
+	integerReceiver = positive32BitValueOf(integerReceiver);
 	if (!GIV(primFailCode)) {
-		/* begin push: */
-		object = positive32BitIntegerFor(integerReceiver & integerArgument);
-		longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-		GIV(stackPointer) = sp;
+		/* begin pop:thenPush: */
+		oop1 = positive32BitIntegerFor(integerArgument & integerReceiver);
+		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), oop1);
+		GIV(stackPointer) = sp1;
 	}
-	else {
-		/* begin unPop: */
-		GIV(stackPointer) -= 2 * BytesPerWord;
-	}
+
 }
 
 
@@ -24196,35 +24123,30 @@
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     usqInt integerArgument;
     usqInt integerReceiver;
-    sqInt object;
+    sqInt oop;
+    sqInt oop1;
     char *sp;
-    sqInt top;
-    sqInt top1;
-    sqInt top2;
-    sqInt top3;
+    char *sp1;
 
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top2 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top = top2;
-	integerArgument = positive32BitValueOf(top);
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top3 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top1 = top3;
-	integerReceiver = positive32BitValueOf(top1);
+	integerArgument = longAt(GIV(stackPointer));
+
+	/* Comment out the short-cut.  Either the inline interpreter bytecode or the JIT primitive will handle this case.
+	   ((objectMemory isIntegerObject: integerArgument)
+	   and: [objectMemory isIntegerObject: integerReceiver])
+	   ifTrue: [self pop: 2 thenPush: (integerArgument bitOr: integerReceiver)]
+	   ifFalse:
+	   [ */
+
+	integerReceiver = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	integerArgument = positive32BitValueOf(integerArgument);
+	integerReceiver = positive32BitValueOf(integerReceiver);
 	if (!GIV(primFailCode)) {
-		/* begin push: */
-		object = positive32BitIntegerFor(integerReceiver | integerArgument);
-		longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-		GIV(stackPointer) = sp;
+		/* begin pop:thenPush: */
+		oop1 = positive32BitIntegerFor(integerArgument | integerReceiver);
+		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), oop1);
+		GIV(stackPointer) = sp1;
 	}
-	else {
-		/* begin unPop: */
-		GIV(stackPointer) -= 2 * BytesPerWord;
-	}
+
 }
 
 
@@ -24392,34 +24314,33 @@
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     usqInt integerArgument;
     usqInt integerReceiver;
-    sqInt object;
+    sqInt oop;
+    sqInt oop1;
     char *sp;
-    sqInt top;
-    sqInt top1;
-    sqInt top2;
-    sqInt top3;
+    char *sp1;
+    char *sp2;
 
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top2 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top = top2;
-	integerArgument = positive32BitValueOf(top);
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top3 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top1 = top3;
-	integerReceiver = positive32BitValueOf(top1);
-	if (!GIV(primFailCode)) {
-		/* begin push: */
-		object = positive32BitIntegerFor(integerReceiver ^ integerArgument);
-		longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
+	integerArgument = longAt(GIV(stackPointer));
+	integerReceiver = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	if (((integerArgument & 1))
+	 && ((integerReceiver & 1))) {
+
+		/* xoring will leave the tag bits zero, whether the tag is 1 or zero, so add it back in. */
+
+		/* begin pop:thenPush: */
+		longAtput((sp = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), (integerArgument ^ integerReceiver) + 1);
 		GIV(stackPointer) = sp;
 	}
 	else {
-		/* begin unPop: */
-		GIV(stackPointer) -= 2 * BytesPerWord;
+		integerArgument = positive32BitValueOf(integerArgument);
+		integerReceiver = positive32BitValueOf(integerReceiver);
+		if (!GIV(primFailCode)) {
+			/* begin pop:thenPush: */
+			oop1 = positive32BitIntegerFor(integerArgument ^ integerReceiver);
+			longAtput((sp2 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), oop1);
+			GIV(stackPointer) = sp2;
+		}
+
 	}
 }
 

Modified: branches/Cog/nscogsrc/vm/cointerp.h
===================================================================
--- branches/Cog/nscogsrc/vm/cointerp.h	2015-02-11 19:21:48 UTC (rev 3252)
+++ branches/Cog/nscogsrc/vm/cointerp.h	2015-02-11 22:20:23 UTC (rev 3253)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1050 uuid: ad3a825c-97ba-4d01-a0e7-637af8cbf52b
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8
  */
 
 

Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2015-02-11 19:21:48 UTC (rev 3252)
+++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c	2015-02-11 22:20:23 UTC (rev 3253)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1050 uuid: ad3a825c-97ba-4d01-a0e7-637af8cbf52b
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8
    from
-	CoInterpreter VMMaker.oscog-eem.1050 uuid: ad3a825c-97ba-4d01-a0e7-637af8cbf52b
+	CoInterpreter VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1050 uuid: ad3a825c-97ba-4d01-a0e7-637af8cbf52b " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2100,7 +2100,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1050";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1055";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -8090,16 +8090,21 @@
 		CASE(190)
 			/* bytecodePrimBitAnd */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitAnd);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg & rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l110;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -8107,29 +8112,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitAnd */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver & integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitAnd();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -8151,16 +8134,21 @@
 		CASE(191)
 			/* bytecodePrimBitOr */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitOr);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg | rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l111;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -8168,29 +8156,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitOr */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver | integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitOr();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -11044,16 +11010,21 @@
 		CASE(350) /*94*/
 			/* bytecodePrimBitAnd */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitAnd1);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg & rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l245;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -11061,29 +11032,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitAnd */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver & integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitAnd();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -11105,16 +11054,21 @@
 		CASE(351) /*95*/
 			/* bytecodePrimBitOr */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitOr1);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg | rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l246;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -11122,29 +11076,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitOr */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver | integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitOr();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -24145,35 +24077,30 @@
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     usqInt integerArgument;
     usqInt integerReceiver;
-    sqInt object;
+    sqInt oop;
+    sqInt oop1;
     char *sp;
-    sqInt top;
-    sqInt top1;
-    sqInt top2;
-    sqInt top3;
+    char *sp1;
 
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top2 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top = top2;
-	integerArgument = positive32BitValueOf(top);
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top3 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top1 = top3;
-	integerReceiver = positive32BitValueOf(top1);
+	integerArgument = longAt(GIV(stackPointer));
+
+	/* Comment out the short-cut.  Either the inline interpreter bytecode or the JIT primitive will handle this case.
+	   ((objectMemory isIntegerObject: integerArgument)
+	   and: [objectMemory isIntegerObject: integerReceiver])
+	   ifTrue: [self pop: 2 thenPush: (integerArgument bitAnd: integerReceiver)]
+	   ifFalse:
+	   [ */
+
+	integerReceiver = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	integerArgument = positive32BitValueOf(integerArgument);
+	integerReceiver = positive32BitValueOf(integerReceiver);
 	if (!GIV(primFailCode)) {
-		/* begin push: */
-		object = positive32BitIntegerFor(integerReceiver & integerArgument);
-		longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-		GIV(stackPointer) = sp;
+		/* begin pop:thenPush: */
+		oop1 = positive32BitIntegerFor(integerArgument & integerReceiver);
+		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), oop1);
+		GIV(stackPointer) = sp1;
 	}
-	else {
-		/* begin unPop: */
-		GIV(stackPointer) -= 2 * BytesPerWord;
-	}
+
 }
 
 
@@ -24205,35 +24132,30 @@
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     usqInt integerArgument;
     usqInt integerReceiver;
-    sqInt object;
+    sqInt oop;
+    sqInt oop1;
     char *sp;
-    sqInt top;
-    sqInt top1;
-    sqInt top2;
-    sqInt top3;
+    char *sp1;
 
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top2 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top = top2;
-	integerArgument = positive32BitValueOf(top);
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top3 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top1 = top3;
-	integerReceiver = positive32BitValueOf(top1);
+	integerArgument = longAt(GIV(stackPointer));
+
+	/* Comment out the short-cut.  Either the inline interpreter bytecode or the JIT primitive will handle this case.
+	   ((objectMemory isIntegerObject: integerArgument)
+	   and: [objectMemory isIntegerObject: integerReceiver])
+	   ifTrue: [self pop: 2 thenPush: (integerArgument bitOr: integerReceiver)]
+	   ifFalse:
+	   [ */
+
+	integerReceiver = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	integerArgument = positive32BitValueOf(integerArgument);
+	integerReceiver = positive32BitValueOf(integerReceiver);
 	if (!GIV(primFailCode)) {
-		/* begin push: */
-		object = positive32BitIntegerFor(integerReceiver | integerArgument);
-		longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-		GIV(stackPointer) = sp;
+		/* begin pop:thenPush: */
+		oop1 = positive32BitIntegerFor(integerArgument | integerReceiver);
+		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), oop1);
+		GIV(stackPointer) = sp1;
 	}
-	else {
-		/* begin unPop: */
-		GIV(stackPointer) -= 2 * BytesPerWord;
-	}
+
 }
 
 
@@ -24401,34 +24323,33 @@
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     usqInt integerArgument;
     usqInt integerReceiver;
-    sqInt object;
+    sqInt oop;
+    sqInt oop1;
     char *sp;
-    sqInt top;
-    sqInt top1;
-    sqInt top2;
-    sqInt top3;
+    char *sp1;
+    char *sp2;
 
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top2 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top = top2;
-	integerArgument = positive32BitValueOf(top);
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top3 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top1 = top3;
-	integerReceiver = positive32BitValueOf(top1);
-	if (!GIV(primFailCode)) {
-		/* begin push: */
-		object = positive32BitIntegerFor(integerReceiver ^ integerArgument);
-		longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
+	integerArgument = longAt(GIV(stackPointer));
+	integerReceiver = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	if (((integerArgument & 1))
+	 && ((integerReceiver & 1))) {
+
+		/* xoring will leave the tag bits zero, whether the tag is 1 or zero, so add it back in. */
+
+		/* begin pop:thenPush: */
+		longAtput((sp = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), (integerArgument ^ integerReceiver) + 1);
 		GIV(stackPointer) = sp;
 	}
 	else {
-		/* begin unPop: */
-		GIV(stackPointer) -= 2 * BytesPerWord;
+		integerArgument = positive32BitValueOf(integerArgument);
+		integerReceiver = positive32BitValueOf(integerReceiver);
+		if (!GIV(primFailCode)) {
+			/* begin pop:thenPush: */
+			oop1 = positive32BitIntegerFor(integerArgument ^ integerReceiver);
+			longAtput((sp2 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), oop1);
+			GIV(stackPointer) = sp2;
+		}
+
 	}
 }
 

Modified: branches/Cog/nsspursrc/vm/cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.c	2015-02-11 19:21:48 UTC (rev 3252)
+++ branches/Cog/nsspursrc/vm/cointerp.c	2015-02-11 22:20:23 UTC (rev 3253)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1053 uuid: 86f23972-c4fa-430d-93b9-865bb86a098d
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8
    from
-	CoInterpreter VMMaker.oscog-eem.1053 uuid: 86f23972-c4fa-430d-93b9-865bb86a098d
+	CoInterpreter VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1053 uuid: 86f23972-c4fa-430d-93b9-865bb86a098d " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2325,7 +2325,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] = {
-/*0*/	-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0,-1,-1, 0,-1,-1,-1, 0, 0,-1,
+/*0*/	-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0,-1,-1, 0, 0, 0, 0, 0, 0,-1,
 /*20*/	0, 0, 0,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0,-1,-1,-1, 0, 0, 0,
 /*40*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
 /*60*/	0, 0, 1,-1,-1,-1,-1,-1, 0, 0,-1,-1, 0, 1, 1, 0, 0, 0, 0, 0,
@@ -2356,7 +2356,7 @@
 /*560*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1
 	};
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1053";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1055";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -8952,16 +8952,21 @@
 		case 190:
 			/* bytecodePrimBitAnd */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitAnd);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg & rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l77;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -8969,29 +8974,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitAnd */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver & integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitAnd();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -9013,16 +8996,21 @@
 		case 191:
 			/* bytecodePrimBitOr */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitOr);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg | rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l78;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -9030,29 +9018,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitOr */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver | integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitOr();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -11701,16 +11667,21 @@
 		case 350: /*94*/
 			/* bytecodePrimBitAnd */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitAnd1);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg & rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l171;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -11718,29 +11689,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitAnd */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver & integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitAnd();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -11762,16 +11711,21 @@
 		case 351: /*95*/
 			/* bytecodePrimBitOr */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitOr1);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg | rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l172;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -11779,29 +11733,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitOr */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver | integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitOr();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -28360,37 +28292,32 @@
 static void
 primitiveBitAnd(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    usqInt integerArgument;
-    usqInt integerReceiver;
-    sqInt object;
+    usqLong integerArgument;
+    usqLong integerReceiver;
+    sqInt oop;
+    sqInt oop1;
     char *sp;
-    sqInt top;
-    sqInt top1;
-    sqInt top2;
-    sqInt top3;
+    char *sp1;
 
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top2 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top = top2;
-	integerArgument = positive32BitValueOf(top);
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top3 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top1 = top3;
-	integerReceiver = positive32BitValueOf(top1);
+	integerArgument = longAt(GIV(stackPointer));
+
+	/* Comment out the short-cut.  Either the inline interpreter bytecode or the JIT primitive will handle this case.
+	   ((objectMemory isIntegerObject: integerArgument)
+	   and: [objectMemory isIntegerObject: integerReceiver])
+	   ifTrue: [self pop: 2 thenPush: (integerArgument bitAnd: integerReceiver)]
+	   ifFalse:
+	   [ */
+
+	integerReceiver = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	integerArgument = positive32BitValueOf(integerArgument);
+	integerReceiver = positive32BitValueOf(integerReceiver);
 	if (!GIV(primFailCode)) {
-		/* begin push: */
-		object = positive32BitIntegerFor(integerReceiver & integerArgument);
-		longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-		GIV(stackPointer) = sp;
+		/* begin pop:thenPush: */
+		oop1 = positive32BitIntegerFor(integerArgument & integerReceiver);
+		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), oop1);
+		GIV(stackPointer) = sp1;
 	}
-	else {
-		/* begin unPop: */
-		GIV(stackPointer) -= 2 * BytesPerWord;
-	}
+
 }
 
 
@@ -28420,37 +28347,32 @@
 static void
 primitiveBitOr(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    usqInt integerArgument;
-    usqInt integerReceiver;
-    sqInt object;
+    usqLong integerArgument;
+    usqLong integerReceiver;
+    sqInt oop;
+    sqInt oop1;
     char *sp;
-    sqInt top;
-    sqInt top1;
-    sqInt top2;
-    sqInt top3;
+    char *sp1;
 
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top2 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top = top2;
-	integerArgument = positive32BitValueOf(top);
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top3 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top1 = top3;
-	integerReceiver = positive32BitValueOf(top1);
+	integerArgument = longAt(GIV(stackPointer));
+
+	/* Comment out the short-cut.  Either the inline interpreter bytecode or the JIT primitive will handle this case.
+	   ((objectMemory isIntegerObject: integerArgument)
+	   and: [objectMemory isIntegerObject: integerReceiver])
+	   ifTrue: [self pop: 2 thenPush: (integerArgument bitOr: integerReceiver)]
+	   ifFalse:
+	   [ */
+
+	integerReceiver = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	integerArgument = positive32BitValueOf(integerArgument);
+	integerReceiver = positive32BitValueOf(integerReceiver);
 	if (!GIV(primFailCode)) {
-		/* begin push: */
-		object = positive32BitIntegerFor(integerReceiver | integerArgument);
-		longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-		GIV(stackPointer) = sp;
+		/* begin pop:thenPush: */
+		oop1 = positive32BitIntegerFor(integerArgument | integerReceiver);
+		longAtput((sp1 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), oop1);
+		GIV(stackPointer) = sp1;
 	}
-	else {
-		/* begin unPop: */
-		GIV(stackPointer) -= 2 * BytesPerWord;
-	}
+
 }
 
 
@@ -28616,36 +28538,35 @@
 static void
 primitiveBitXor(void)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
-    usqInt integerArgument;
-    usqInt integerReceiver;
-    sqInt object;
+    usqLong integerArgument;
+    usqLong integerReceiver;
+    sqInt oop;
+    sqInt oop1;
     char *sp;
-    sqInt top;
-    sqInt top1;
-    sqInt top2;
-    sqInt top3;
+    char *sp1;
+    char *sp2;
 
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top2 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top = top2;
-	integerArgument = positive32BitValueOf(top);
-	/* begin popPos32BitInteger */
-	/* begin popStack */
-	top3 = longAt(GIV(stackPointer));
-	GIV(stackPointer) += BytesPerWord;
-	top1 = top3;
-	integerReceiver = positive32BitValueOf(top1);
-	if (!GIV(primFailCode)) {
-		/* begin push: */
-		object = positive32BitIntegerFor(integerReceiver ^ integerArgument);
-		longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
+	integerArgument = longAt(GIV(stackPointer));
+	integerReceiver = longAt(GIV(stackPointer) + (1 * BytesPerWord));
+	if (((integerArgument & 1))
+	 && ((integerReceiver & 1))) {
+
+		/* xoring will leave the tag bits zero, whether the tag is 1 or zero, so add it back in. */
+
+		/* begin pop:thenPush: */
+		longAtput((sp = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), (integerArgument ^ integerReceiver) + 1);
 		GIV(stackPointer) = sp;
 	}
 	else {
-		/* begin unPop: */
-		GIV(stackPointer) -= 2 * BytesPerWord;
+		integerArgument = positive32BitValueOf(integerArgument);
+		integerReceiver = positive32BitValueOf(integerReceiver);
+		if (!GIV(primFailCode)) {
+			/* begin pop:thenPush: */
+			oop1 = positive32BitIntegerFor(integerArgument ^ integerReceiver);
+			longAtput((sp2 = GIV(stackPointer) + ((2 - 1) * BytesPerWord)), oop1);
+			GIV(stackPointer) = sp2;
+		}
+
 	}
 }
 

Modified: branches/Cog/nsspursrc/vm/cointerp.h
===================================================================
--- branches/Cog/nsspursrc/vm/cointerp.h	2015-02-11 19:21:48 UTC (rev 3252)
+++ branches/Cog/nsspursrc/vm/cointerp.h	2015-02-11 22:20:23 UTC (rev 3253)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1053 uuid: 86f23972-c4fa-430d-93b9-865bb86a098d
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8
  */
 
 

Modified: branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
===================================================================
--- branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2015-02-11 19:21:48 UTC (rev 3252)
+++ branches/Cog/nsspursrc/vm/gcc3x-cointerp.c	2015-02-11 22:20:23 UTC (rev 3253)
@@ -2,11 +2,11 @@
 
 
 /* Automatically generated by
-	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1053 uuid: 86f23972-c4fa-430d-93b9-865bb86a098d
+	CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8
    from
-	CoInterpreter VMMaker.oscog-eem.1053 uuid: 86f23972-c4fa-430d-93b9-865bb86a098d
+	CoInterpreter VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8
  */
-static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1053 uuid: 86f23972-c4fa-430d-93b9-865bb86a098d " __DATE__ ;
+static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1055 uuid: dd8f0ae4-8ad8-470c-a35b-29cf787f83c8 " __DATE__ ;
 char *__interpBuildInfo = __buildInfo;
 
 
@@ -2328,7 +2328,7 @@
 	/* 575 */ (void (*)(void))0,
  0 };
 static signed char primitiveAccessorDepthTable[MaxPrimitiveIndex + 2 /* 577 */] = {
-/*0*/	-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0,-1,-1, 0,-1,-1,-1, 0, 0,-1,
+/*0*/	-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0,-1,-1, 0, 0, 0, 0, 0, 0,-1,
 /*20*/	0, 0, 0,-1,-1,-1,-1,-1,-1, 0, 0, 0, 0, 0,-1,-1,-1, 0, 0, 0,
 /*40*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
 /*60*/	0, 0, 1,-1,-1,-1,-1,-1, 0, 0,-1,-1, 0, 1, 1, 0, 0, 0, 0, 0,
@@ -2359,7 +2359,7 @@
 /*560*/	-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1
 	};
 char expensiveAsserts = 0;
-const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1053";
+const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1055";
 sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */;
 volatile int sendTrace;
 
@@ -8961,16 +8961,21 @@
 		CASE(190)
 			/* bytecodePrimBitAnd */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitAnd);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg & rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l77;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -8978,29 +8983,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitAnd */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver & integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitAnd();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -9022,16 +9005,21 @@
 		CASE(191)
 			/* bytecodePrimBitOr */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitOr);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg | rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l78;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -9039,29 +9027,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitOr */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver | integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);
-					GIV(stackPointer) = sp;
-				}
-				else {
-					/* begin unPop: */
-					GIV(stackPointer) -= 2 * BytesPerWord;
-				}
+				primitiveBitOr();
 				/* begin internalizeIPandSP */
 				assert(GIV(instructionPointer) != (ceReturnToInterpreterPC()));
 				localIP = pointerForOop(GIV(instructionPointer));
@@ -11710,16 +11676,21 @@
 		CASE(350) /*94*/
 			/* bytecodePrimBitAnd */
 			{
-				usqInt integerArgument;
-				usqInt integerReceiver;
-				sqInt object;
-				char *sp;
-				sqInt top;
-				sqInt top1;
-				sqInt top2;
-				sqInt top3;
+				sqInt arg;
+				sqInt rcvr;
 
 				VM_LABEL(bytecodePrimBitAnd1);
+				arg = longAtPointer(localSP);
+				rcvr = longAtPointer(localSP + (1 * BytesPerOop));
+				if (((arg & 1))
+				 && ((rcvr & 1))) {
+					/* begin internalPop:thenPush: */
+					longAtPointerput((localSP += (2 - 1) * BytesPerOop), arg & rcvr);
+					/* begin fetchNextBytecode */
+					currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
+
+					goto l171;
+				}
 				/* begin initPrimCall */
 				GIV(primFailCode) = 0;
 				/* begin externalizeIPandSP */
@@ -11727,29 +11698,7 @@
 				GIV(instructionPointer) = oopForPointer(localIP);
 				GIV(stackPointer) = localSP;
 				GIV(framePointer) = localFP;
-				/* begin primitiveBitAnd */
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top2 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top = top2;
-				integerArgument = positive32BitValueOf(top);
-				/* begin popPos32BitInteger */
-				/* begin popStack */
-				top3 = longAt(GIV(stackPointer));
-				GIV(stackPointer) += BytesPerWord;
-				top1 = top3;
-				integerReceiver = positive32BitValueOf(top1);
-				if (!GIV(primFailCode)) {
-					/* begin push: */
-					object = positive32BitIntegerFor(integerReceiver & integerArgument);
-					longAtput((sp = GIV(stackPointer) - BytesPerWord), object);

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list