[Vm-dev] [commit][3554] CogVM source as per VMMaker.oscog-eem.1636

commits at squeakvm.org commits at squeakvm.org
Fri Jan 15 22:02:26 UTC 2016


Revision: 3554
Author:   eliot
Date:     2016-01-15 14:02:25 -0800 (Fri, 15 Jan 2016)
Log Message:
-----------
CogVM source as per VMMaker.oscog-eem.1636

CoInterpreter:
ceSend: et al need to add looked up methods to the method cache,
otherwise methods only found through machine code sends will not
be jitted.

Spur:
Add 16-bit indexability to Spur.  Generate slimmer code for
positive32BitValueOf: on 64-bit Spur.

Immutability:
Fix a slip in commonAtPut: immutability testing.

x64 Cogit:
Use 32-bit register comparisons in CmpC32R so as to generate a 5
byte sequence for pic dispatch instead of 6, and hence brOng the
pic dispatch jump into the short range when jumping to the abort
for an MNU PIC dispatch.

Fix bugs in X64's MoveRMbr, MoveRXbrR.  Simplify rexw:r:x:b:.

Add missing machine code primitives to 64-bit Spur.  Move "Spur"'s
primitiveStringAt down to "32BitSpur".

64-bit Spur x64 cogit now functional (at least on Mac OS X; albeit
with Cursor management in Cocoa still broken due to arc issues).

Cogits:
Eliminate the bogus min/maxAbstractGeneralPurposeReg thang and use
a register mask as Ryan suggested.

Make the MirrorNewWithArg primitive do the class size check before
accessing the format field.

Fix bug with new PIC scheme.  the offset to the frst jump in the PIC
(the jump to the next case) is at
	firstCPICCaseOffset - backEnd jumpLongByteSize - backEnd loadLiteralByteSize,
/not/ firstCPICCaseOffset - backEnd jumpLongByteSize - backEnd loadPICLiteralByteSize.
(This affects only x64 and in-line literal ARM, hence no one's
noticed yet).

Fix the C type of compileFrameBuild

Modified Paths:
--------------
    branches/Cog/nsspursrc/vm/cogit.h
    branches/Cog/nsspursrc/vm/cogitARMv5.c
    branches/Cog/nsspursrc/vm/cogitIA32.c
    branches/Cog/nsspursrc/vm/cogitMIPSEL.c
    branches/Cog/nsspursrc/vm/cointerp.c
    branches/Cog/nsspursrc/vm/cointerp.h
    branches/Cog/nsspursrc/vm/gcc3x-cointerp.c
    branches/Cog/nsspurstack64src/vm/gcc3x-interp.c
    branches/Cog/nsspurstack64src/vm/interp.c
    branches/Cog/nsspurstacksrc/vm/gcc3x-interp.c
    branches/Cog/nsspurstacksrc/vm/interp.c
    branches/Cog/spur64src/vm/cogit.h
    branches/Cog/spur64src/vm/cogitX64.c
    branches/Cog/spur64src/vm/cointerp.c
    branches/Cog/spur64src/vm/cointerp.h
    branches/Cog/spur64src/vm/gcc3x-cointerp.c
    branches/Cog/spursistasrc/vm/cogit.h
    branches/Cog/spursistasrc/vm/cogitARMv5.c
    branches/Cog/spursistasrc/vm/cogitIA32.c
    branches/Cog/spursistasrc/vm/cogitMIPSEL.c
    branches/Cog/spursistasrc/vm/cointerp.c
    branches/Cog/spursistasrc/vm/cointerp.h
    branches/Cog/spursistasrc/vm/gcc3x-cointerp.c
    branches/Cog/spursrc/vm/cogit.h
    branches/Cog/spursrc/vm/cogitARMv5.c
    branches/Cog/spursrc/vm/cogitIA32.c
    branches/Cog/spursrc/vm/cogitMIPSEL.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/cogit.h
    branches/Cog/src/vm/cogitARMv5.c
    branches/Cog/src/vm/cogitIA32.c
    branches/Cog/src/vm/cogitMIPSEL.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/nsspursrc/vm/cogit.h
===================================================================
--- branches/Cog/nsspursrc/vm/cogit.h	2016-01-10 22:51:42 UTC (rev 3553)
+++ branches/Cog/nsspursrc/vm/cogit.h	2016-01-15 22:02:25 UTC (rev 3554)
@@ -1,5 +1,5 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1630 uuid: 2ed025ea-f400-4440-8e8b-5aa46d06c9ab
+	CCodeGenerator VMMaker.oscog-eem.1636 uuid: b30fe4bc-4de8-4dde-9709-3ad459f46862
  */
 
 

Modified: branches/Cog/nsspursrc/vm/cogitARMv5.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogitARMv5.c	2016-01-10 22:51:42 UTC (rev 3553)
+++ branches/Cog/nsspursrc/vm/cogitARMv5.c	2016-01-15 22:02:25 UTC (rev 3554)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1630 uuid: 2ed025ea-f400-4440-8e8b-5aa46d06c9ab
+	CCodeGenerator VMMaker.oscog-eem.1636 uuid: b30fe4bc-4de8-4dde-9709-3ad459f46862
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1630 uuid: 2ed025ea-f400-4440-8e8b-5aa46d06c9ab
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1636 uuid: b30fe4bc-4de8-4dde-9709-3ad459f46862
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1630 uuid: 2ed025ea-f400-4440-8e8b-5aa46d06c9ab " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1636 uuid: b30fe4bc-4de8-4dde-9709-3ad459f46862 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -295,6 +295,7 @@
 #define MoveRAw 42
 #define MoveRdM64r 71
 #define MoveRdRd 69
+#define MoveRM16r 52
 #define MoveRMbr 60
 #define MoveRMwr 46
 #define MoveRR 40
@@ -520,6 +521,7 @@
 static AbstractInstruction * NoDbgRegParms stopsFromto(AbstractInstruction * self_in_stopsFromto, sqInt startAddr, sqInt endAddr);
 static sqInt NoDbgRegParms strbrnplusimm(AbstractInstruction * self_in_strbrnplusimm, sqInt destReg, sqInt baseReg, sqInt u, sqInt immediate12bitValue);
 static sqInt NoDbgRegParms strbrnrm(AbstractInstruction * self_in_strbrnrm, sqInt srcReg, sqInt baseReg, sqInt offsetReg);
+static sqInt NoDbgRegParms strhrnrm(AbstractInstruction * self_in_strhrnrm, sqInt srcReg, sqInt baseReg, sqInt offsetReg);
 static sqInt NoDbgRegParms strrnplusImm(AbstractInstruction * self_in_strrnplusImm, sqInt srcReg, sqInt baseReg, sqInt immediate12bitValue);
 static sqInt NoDbgRegParms strrnplusimm(AbstractInstruction * self_in_strrnplusimm, sqInt destReg, sqInt baseReg, sqInt u, sqInt immediate12bitValue);
 static sqInt NoDbgRegParms strrnrm(AbstractInstruction * self_in_strrnrm, sqInt srcReg, sqInt baseReg, sqInt offsetReg);
@@ -860,13 +862,13 @@
 static sqInt genPrimitiveMirrorNewWithArg(void);
 static sqInt genPrimitiveNew(void);
 static sqInt genPrimitiveNewWithArg(void);
+static sqInt genPrimitiveStringAt(void);
 static sqInt genPrimitiveStringAtPut(void);
 static sqInt NoDbgRegParms genRemoveSmallIntegerTagsInScratchReg(sqInt scratchReg);
 static sqInt NoDbgRegParms genShiftAwaySmallIntegerTagsInScratchReg(sqInt scratchReg);
 static sqInt NoDbgRegParms inlineCacheTagForInstance(sqInt oop);
 static AbstractInstruction * NoDbgRegParms jumpNotSmallIntegerUnsignedValueInRegister(sqInt reg);
 static sqInt NoDbgRegParms markAndTraceCacheTagLiteralinatpc(sqInt literal, CogMethod *cogMethodOrNil, usqInt address);
-static sqInt numCharacterBits(void);
 static sqInt numSmallIntegerBits(void);
 static sqInt NoDbgRegParms validInlineCacheTag(usqInt classIndexOrTagPattern);
 static sqInt NoDbgRegParms cacheTagIsMarked(sqInt cacheTag);
@@ -889,7 +891,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);
@@ -905,7 +907,6 @@
 static sqInt NoDbgRegParms genPrimitiveIdenticalOrNotIf(sqInt orNot);
 static sqInt genPrimitiveObjectAt(void);
 static sqInt genPrimitiveSize(void);
-static sqInt genPrimitiveStringAt(void);
 static sqInt NoDbgRegParms genSetSmallIntegerTagsIn(sqInt scratchReg);
 static sqInt genStoreCheckContextReceiverTrampoline(void);
 static sqInt NoDbgRegParms genStoreCheckReceiverRegvalueRegscratchReginFrame(sqInt destReg, sqInt valueReg, sqInt scratchReg, sqInt inFrame);
@@ -919,6 +920,7 @@
 static void NoDbgRegParms markAndTraceUpdatedLiteralin(sqInt objOop, CogMethod *cogMethodOrNil);
 static void NoDbgRegParms markIfIRC(usqInt maybeIRCs);
 static sqInt NoDbgRegParms maybeCompileRetryonPrimitiveFail(AbstractInstruction *retryInst, sqInt primIndex);
+static sqInt numCharacterBits(void);
 extern sqInt numRegArgs(void);
 static sqInt NoDbgRegParms remapObject(sqInt objOop);
 static sqInt NoDbgRegParms remapOop(sqInt objOop);
@@ -1072,7 +1074,7 @@
 static void NoDbgRegParms compileBlockFramelessEntry(BlockStart *blockStart);
 static CogMethod * NoDbgRegParms compileCogMethod(sqInt selector);
 static sqInt compileEntireMethod(void);
-static sqInt compileFrameBuild(void);
+static void compileFrameBuild(void);
 static sqInt NoDbgRegParms cPICMissTrampolineFor(sqInt numArgs);
 static sqInt doubleExtendedDoAnythingBytecode(void);
 static sqInt duplicateTopBytecode(void);
@@ -6939,6 +6941,16 @@
 }
 
 
+/*	STRH srcReg, [baseReg, +offsetReg] */
+
+	/* CogARMCompiler>>#strh:rn:rm: */
+static sqInt NoDbgRegParms
+strhrnrm(AbstractInstruction * self_in_strhrnrm, sqInt srcReg, sqInt baseReg, sqInt offsetReg)
+{
+	return memM16xrregbasepuwlrm(self_in_strhrnrm, AL, srcReg, baseReg, 1, 1, 0, 0, offsetReg);
+}
+
+
 /*	STR srcReg, [baseReg, +immediate12bitValue] */
 
 	/* CogARMCompiler>>#str:rn:plusImm: */
@@ -7523,26 +7535,29 @@
     sqInt callerSavedRegsToBeSaved;
     AbstractInstruction *lastInst;
     sqInt reg;
-    sqInt regLimiT;
+    sqInt registersToBePushed;
 
 	callerSavedRegsToBeSaved = callerSavedRegMask & registersToBeSaved;
-	for (reg = ReceiverResultReg, regLimiT = Scratch0Reg; reg >= regLimiT; reg += -1) {
-		if ((reg != TempReg)
-		 && (callerSavedRegsToBeSaved & (registerMaskFor(reg)))) {
+	registersToBePushed = callerSavedRegsToBeSaved;
+	reg = 0;
+	while (registersToBePushed != 0) {
+		if (registersToBePushed & 1) {
 			/* begin PushR: */
 			genoperand(PushR, reg);
 		}
+		reg += 1;
+		registersToBePushed = ((sqInt) registersToBePushed) >> 1;
 	}
 	/* begin CallRT: */
 	abstractInstruction = genoperand(Call, callTarget);
 	(abstractInstruction->annotation = IsRelativeCall);
 	lastInst = abstractInstruction;
-	for (reg = Scratch0Reg, regLimiT = ReceiverResultReg; reg <= regLimiT; reg += 1) {
-		if ((reg != TempReg)
-		 && (callerSavedRegsToBeSaved & (registerMaskFor(reg)))) {
+	while (reg >= 0) {
+		if (callerSavedRegsToBeSaved & (1 << reg)) {
 			/* begin PopR: */
 			lastInst = genoperand(PopR, reg);
 		}
+		reg -= 1;
 	}
 	return lastInst;
 }
@@ -8456,7 +8471,7 @@
 	address = addressOfEndOfCaseinCPIC(((cPIC->cPICNumCases)) + 1, cPIC);
 	rewriteCPICCaseAttagobjReftarget(address, caseNTag, operand, target);
 	/* begin rewriteCPIC:caseJumpTo: */
-	addressFollowingJump = (((((sqInt)cPIC)) + firstCPICCaseOffset) - (jumpLongByteSize(backEnd))) - (loadPICLiteralByteSize(backEnd));
+	addressFollowingJump = (((((sqInt)cPIC)) + firstCPICCaseOffset) - (jumpLongByteSize(backEnd))) - (loadLiteralByteSize(backEnd));
 	rewriteTransferAttarget(((AbstractInstruction *) backEnd), addressFollowingJump, address - cPICCaseSize);
 	flushICacheFromto(processor, ((usqInt)cPIC), (((usqInt)cPIC)) + closedPICSize);
 	(cPIC->cPICNumCases = ((cPIC->cPICNumCases)) + 1);
@@ -9357,7 +9372,7 @@
 	/* begin rewriteCPIC:caseJumpTo: */
 	target = addressOfEndOfCaseinCPIC(2, cPIC);
 	/* begin rewriteCPICJumpAt:target: */
-	addressFollowingJump = (((((sqInt)cPIC)) + firstCPICCaseOffset) - (jumpLongByteSize(backEnd))) - (loadPICLiteralByteSize(backEnd));
+	addressFollowingJump = (((((sqInt)cPIC)) + firstCPICCaseOffset) - (jumpLongByteSize(backEnd))) - (loadLiteralByteSize(backEnd));
 	rewriteTransferAttarget(((AbstractInstruction *) backEnd), addressFollowingJump, target);
 	return 0;
 }
@@ -16473,8 +16488,8 @@
 }
 
 
-/*	Convert the SmallInteger in reg to a Character, assuming
-	the SmallInteger's value is a valid character. */
+/*	Convert the Character in reg to a SmallInteger, assuming
+	the Character's value is a valid character. */
 /*	self assume: objectMemory smallIntegerTag = 1 */
 
 	/* CogObjectRepresentationFor32BitSpur>>#genConvertCharacterToSmallIntegerInReg: */
@@ -16825,7 +16840,9 @@
 }
 
 
-/*	Implement the guts of primitiveAt */
+/*	c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format:
+	fixedFieldsOf:format:length: 
+ */
 
 	/* CogObjectRepresentationFor32BitSpur>>#genPrimitiveAt */
 static sqInt
@@ -16875,8 +16892,6 @@
     sqInt quickConstant8;
     sqInt quickConstant9;
 
-
-	/* c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format: fixedFieldsOf:format:length: */
 	/* begin genLoadArgAtDepth:into: */
 	assert(0 < (numRegArgs()));
 	jumpImmediate = genJumpImmediate(ReceiverResultReg);
@@ -17080,7 +17095,9 @@
 }
 
 
-/*	Implement the guts of primitiveAtPut */
+/*	c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format:
+	fixedFieldsOf:format:length: 
+ */
 
 	/* CogObjectRepresentationFor32BitSpur>>#genPrimitiveAtPut */
 static sqInt
@@ -17093,6 +17110,8 @@
     AbstractInstruction *anInstruction12;
     AbstractInstruction *anInstruction13;
     AbstractInstruction *anInstruction14;
+    AbstractInstruction *anInstruction15;
+    AbstractInstruction *anInstruction16;
     AbstractInstruction *anInstruction2;
     AbstractInstruction *anInstruction3;
     AbstractInstruction *anInstruction4;
@@ -17105,23 +17124,26 @@
     AbstractInstruction *jumpArrayOutOfBounds;
     AbstractInstruction *jumpBadIndex;
     AbstractInstruction *jumpBytesOutOfBounds;
-    AbstractInstruction * jumpBytesOutOfRange;
+    AbstractInstruction *jumpBytesOutOfRange;
     AbstractInstruction * jumpFixedFieldsOutOfBounds;
     AbstractInstruction *jumpHasFixedFields;
     AbstractInstruction *jumpImmediate;
     AbstractInstruction *jumpIsBytes;
     AbstractInstruction * jumpIsCompiledMethod;
     AbstractInstruction *jumpIsContext;
-    AbstractInstruction *jumpNegative;
+    AbstractInstruction *jumpIsShorts;
     AbstractInstruction * jumpNonSmallIntegerValue;
     AbstractInstruction *jumpNotIndexableBits;
     AbstractInstruction *jumpNotIndexablePointers;
     AbstractInstruction * jumpNotPointers;
-    AbstractInstruction *jumpShortsUnsupported;
+    AbstractInstruction *jumpShortsOutOfBounds;
+    AbstractInstruction *jumpShortsOutOfRange;
     AbstractInstruction *jumpWordsOutOfBounds;
+    AbstractInstruction *jumpWordsOutOfRange;
     sqInt operandOne;
     sqInt operandOne1;
     sqInt operandOne2;
+    sqInt operandOne3;
     sqInt quickConstant;
     sqInt quickConstant1;
     sqInt quickConstant2;
@@ -17129,8 +17151,6 @@
     sqInt quickConstant4;
     sqInt quickConstant5;
 
-
-	/* c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format: fixedFieldsOf:format:length: */
 	/* begin genLoadArgAtDepth:into: */
 	assert(1 < (numRegArgs()));
 	/* begin genLoadArgAtDepth:into: */
@@ -17140,9 +17160,9 @@
 	jumpBadIndex = genJumpNotSmallInteger(Arg0Reg);
 	genConvertSmallIntegerToIntegerInReg(Arg0Reg);
 	/* begin SubCq:R: */
-	anInstruction14 = genoperandoperand(SubCqR, 1, Arg0Reg);
-	if (usesOutOfLineLiteral(anInstruction14)) {
-		(anInstruction14->dependent = locateLiteral(1));
+	anInstruction15 = genoperandoperand(SubCqR, 1, Arg0Reg);
+	if (usesOutOfLineLiteral(anInstruction15)) {
+		(anInstruction15->dependent = locateLiteral(1));
 	}
 	genGetFormatOfintoleastSignificantHalfOfBaseHeaderIntoScratch(ReceiverResultReg, (formatReg = SendNumArgsReg), NoReg);
 
@@ -17255,7 +17275,7 @@
 		(anInstruction8->dependent = locateLiteral(quickConstant4));
 	}
 	/* begin JumpAboveOrEqual: */
-	jumpShortsUnsupported = genConditionalBranchoperand(JumpAboveOrEqual, ((sqInt)0));
+	jumpIsShorts = genConditionalBranchoperand(JumpAboveOrEqual, ((sqInt)0));
 	/* begin CmpCq:R: */
 	quickConstant5 = firstLongFormat();
 	/* begin gen:quickConstant:operand: */
@@ -17272,15 +17292,15 @@
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, Arg1Reg, TempReg);
 	genConvertSmallIntegerToIntegerInReg(TempReg);
-	if (!(setsConditionCodesFor(lastOpcode(), JumpNegative))) {
+	if (!(setsConditionCodesFor(lastOpcode(), JumpLess))) {
 		/* begin CmpCq:R: */
-		anInstruction = genoperandoperand(CmpCqR, 0, ClassReg);
+		anInstruction = genoperandoperand(CmpCqR, 0, TempReg);
 		if (usesOutOfLineLiteral(anInstruction)) {
 			(anInstruction->dependent = locateLiteral(0));
 		}
 	}
-	/* begin JumpNegative: */
-	jumpNegative = genConditionalBranchoperand(JumpNegative, ((sqInt)0));
+	/* begin JumpLess: */
+	jumpWordsOutOfRange = genConditionalBranchoperand(JumpLess, ((sqInt)0));
 	/* begin AddCq:R: */
 	operandOne2 = ((usqInt) BaseHeaderSize) >> (shiftForWord());
 	/* begin checkQuickConstant:forInstruction: */
@@ -17328,12 +17348,46 @@
 	assert(methodOrBlockNumArgs <= (numRegArgs()));
 	/* begin RetN: */
 	genoperand(RetN, 0);
-	jmpTarget(jumpIsContext, jmpTarget(jumpNegative, jmpTarget(jumpNotIndexableBits, jmpTarget(jumpBytesOutOfRange, jmpTarget(jumpIsCompiledMethod, jmpTarget(jumpArrayOutOfBounds, jmpTarget(jumpBytesOutOfBounds, jmpTarget(jumpShortsUnsupported, jmpTarget(jumpWordsOutOfBounds, jmpTarget(jumpNotIndexablePointers, jmpTarget(jumpNonSmallIntegerValue, jmpTarget(jumpFixedFieldsOutOfBounds, gLabel()))))))))))));
-	/* begin AddCq:R: */
-	anInstruction13 = genoperandoperand(AddCqR, 1, Arg0Reg);
+	jmpTarget(jumpIsShorts, gCmpCqR(((0xFFFF << 1) | 1), Arg1Reg));
+	/* begin JumpAbove: */
+	jumpShortsOutOfRange = genConditionalBranchoperand(JumpAbove, ((sqInt)0));
+	/* begin LogicalShiftLeftCq:R: */
+	genoperandoperand(LogicalShiftLeftCqR, (shiftForWord()) - 1, ClassReg);
+	/* begin AndCq:R: */
+	operandOne3 = (BytesPerWord / 2) - 1;
+	/* begin checkQuickConstant:forInstruction: */
+	anInstruction13 = genoperandoperand(AndCqR, operandOne3, formatReg);
 	if (usesOutOfLineLiteral(anInstruction13)) {
-		(anInstruction13->dependent = locateLiteral(1));
+		(anInstruction13->dependent = locateLiteral(operandOne3));
 	}
+	/* begin SubR:R: */
+	genoperandoperand(SubRR, formatReg, ClassReg);
+	/* begin CmpR:R: */
+	genoperandoperand(CmpRR, Arg0Reg, ClassReg);
+	/* begin JumpBelowOrEqual: */
+	jumpShortsOutOfBounds = genConditionalBranchoperand(JumpBelowOrEqual, ((sqInt)0));
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, Arg1Reg, TempReg);
+	genConvertSmallIntegerToIntegerInReg(TempReg);
+	/* begin AddR:R: */
+	genoperandoperand(AddRR, Arg0Reg, ReceiverResultReg);
+	/* begin MoveR:M16:r: */
+	anInstruction16 = genoperandoperandoperand(MoveRM16r, TempReg, BaseHeaderSize, ReceiverResultReg);
+	if (usesOutOfLineLiteral(anInstruction16)) {
+		(anInstruction16->dependent = locateLiteral(BaseHeaderSize));
+	}
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, Arg1Reg, ReceiverResultReg);
+	/* begin genPrimReturn */
+	assert(methodOrBlockNumArgs <= (numRegArgs()));
+	/* begin RetN: */
+	genoperand(RetN, 0);
+	jmpTarget(jumpIsContext, jmpTarget(jumpNotIndexableBits, jmpTarget(jumpBytesOutOfRange, jmpTarget(jumpWordsOutOfRange, jmpTarget(jumpShortsOutOfRange, jmpTarget(jumpIsCompiledMethod, jmpTarget(jumpArrayOutOfBounds, jmpTarget(jumpBytesOutOfBounds, jmpTarget(jumpShortsOutOfBounds, jmpTarget(jumpWordsOutOfBounds, jmpTarget(jumpNotIndexablePointers, jmpTarget(jumpNonSmallIntegerValue, jmpTarget(jumpFixedFieldsOutOfBounds, gLabel())))))))))))));
+	/* begin AddCq:R: */
+	anInstruction14 = genoperandoperand(AddCqR, 1, Arg0Reg);
+	if (usesOutOfLineLiteral(anInstruction14)) {
+		(anInstruction14->dependent = locateLiteral(1));
+	}
 	genConvertIntegerToSmallIntegerInReg(Arg0Reg);
 	jmpTarget(jumpBadIndex, jmpTarget(jumpImmediate, gLabel()));
 	return 0;
@@ -17708,24 +17762,24 @@
 	/* begin genJumpNotSmallInteger:scratchReg: */
 	jumpNElementsNonInt = genJumpNotSmallInteger(Arg1Reg);
 	jumpImmediate = genJumpImmediate(Arg0Reg);
+	genGetRawSlotSizeOfNonImminto(Arg0Reg, TempReg);
+	/* begin CmpCq:R: */
+	anInstruction = genoperandoperand(CmpCqR, InstanceSpecificationIndex + 1, TempReg);
+	if (usesOutOfLineLiteral(anInstruction)) {
+		(anInstruction->dependent = locateLiteral(InstanceSpecificationIndex + 1));
+	}
+	/* begin JumpLess: */
+	jumpTooSmall = genConditionalBranchoperand(JumpLess, ((sqInt)0));
 	genGetFormatOfintoleastSignificantHalfOfBaseHeaderIntoScratch(Arg0Reg, TempReg, NoReg);
 	/* begin CmpCq:R: */
 	quickConstant = nonIndexablePointerFormat();
 	/* begin gen:quickConstant:operand: */
-	anInstruction = genoperandoperand(CmpCqR, quickConstant, TempReg);
-	if (usesOutOfLineLiteral(anInstruction)) {
-		(anInstruction->dependent = locateLiteral(quickConstant));
+	anInstruction1 = genoperandoperand(CmpCqR, quickConstant, TempReg);
+	if (usesOutOfLineLiteral(anInstruction1)) {
+		(anInstruction1->dependent = locateLiteral(quickConstant));
 	}
 	/* begin JumpNonZero: */
 	jumpNotFixedPointers = genConditionalBranchoperand(JumpNonZero, ((sqInt)0));
-	genGetRawSlotSizeOfNonImminto(Arg0Reg, TempReg);
-	/* begin CmpCq:R: */
-	anInstruction1 = genoperandoperand(CmpCqR, InstanceSpecificationIndex + 1, TempReg);
-	if (usesOutOfLineLiteral(anInstruction1)) {
-		(anInstruction1->dependent = locateLiteral(InstanceSpecificationIndex + 1));
-	}
-	/* begin JumpLess: */
-	jumpTooSmall = genConditionalBranchoperand(JumpLess, ((sqInt)0));
 	genGetHashFieldNonImmOfinto(Arg0Reg, halfHeaderReg);
 	/* begin JumpZero: */
 	jumpUnhashed = genConditionalBranchoperand(JumpZero, ((sqInt)0));
@@ -18476,14 +18530,173 @@
 }
 
 
-/*	Implement the guts of primitiveStringAtPut */
+/*	c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format:
+	fixedFieldsOf:format:length: 
+ */
 
+	/* CogObjectRepresentationFor32BitSpur>>#genPrimitiveStringAt */
+static sqInt
+genPrimitiveStringAt(void)
+{
+    AbstractInstruction *anInstruction;
+    AbstractInstruction *anInstruction1;
+    AbstractInstruction *anInstruction10;
+    AbstractInstruction *anInstruction2;
+    AbstractInstruction *anInstruction3;
+    AbstractInstruction *anInstruction4;
+    AbstractInstruction *anInstruction5;
+    AbstractInstruction *anInstruction6;
+    AbstractInstruction *anInstruction7;
+    AbstractInstruction *anInstruction8;
+    AbstractInstruction *anInstruction9;
+    AbstractInstruction *done;
+    sqInt formatReg;
+    AbstractInstruction *jumpBadIndex;
+    AbstractInstruction *jumpBytesOutOfBounds;
+    AbstractInstruction *jumpIsBytes;
+    AbstractInstruction *jumpIsShorts;
+    AbstractInstruction *jumpIsWords;
+    AbstractInstruction *jumpNotIndexable;
+    AbstractInstruction *jumpShortsOutOfBounds;
+    AbstractInstruction *jumpWordsOutOfBounds;
+    AbstractInstruction *jumpWordTooBig;
+    sqInt quickConstant;
+    sqInt quickConstant1;
+    sqInt quickConstant2;
+    sqInt quickConstant3;
+    sqInt quickConstant4;
+
+	/* begin genLoadArgAtDepth:into: */
+	assert(0 < (numRegArgs()));
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, Arg0Reg, Arg1Reg);
+	/* begin genJumpNotSmallInteger:scratchReg: */
+	jumpBadIndex = genJumpNotSmallInteger(Arg0Reg);
+	genConvertSmallIntegerToIntegerInReg(Arg1Reg);
+	/* begin SubCq:R: */
+	anInstruction1 = genoperandoperand(SubCqR, 1, Arg1Reg);
+	if (usesOutOfLineLiteral(anInstruction1)) {
+		(anInstruction1->dependent = locateLiteral(1));
+	}
+	genGetFormatOfintoleastSignificantHalfOfBaseHeaderIntoScratch(ReceiverResultReg, (formatReg = SendNumArgsReg), NoReg);
+	genGetNumSlotsOfinto(ReceiverResultReg, ClassReg);
+	/* begin CmpCq:R: */
+	quickConstant = firstByteFormat();
+	/* begin gen:quickConstant:operand: */
+	anInstruction2 = genoperandoperand(CmpCqR, quickConstant, formatReg);
+	if (usesOutOfLineLiteral(anInstruction2)) {
+		(anInstruction2->dependent = locateLiteral(quickConstant));
+	}
+	/* begin JumpGreaterOrEqual: */
+	jumpIsBytes = genConditionalBranchoperand(JumpGreaterOrEqual, ((sqInt)0));
+	/* begin CmpCq:R: */
+	quickConstant1 = firstShortFormat();
+	/* begin gen:quickConstant:operand: */
+	anInstruction3 = genoperandoperand(CmpCqR, quickConstant1, formatReg);
+	if (usesOutOfLineLiteral(anInstruction3)) {
+		(anInstruction3->dependent = locateLiteral(quickConstant1));
+	}
+	/* begin JumpGreaterOrEqual: */
+	jumpIsShorts = genConditionalBranchoperand(JumpGreaterOrEqual, ((sqInt)0));
+	/* begin CmpCq:R: */
+	quickConstant2 = firstLongFormat();
+	/* begin gen:quickConstant:operand: */
+	anInstruction4 = genoperandoperand(CmpCqR, quickConstant2, formatReg);
+	if (usesOutOfLineLiteral(anInstruction4)) {
+		(anInstruction4->dependent = locateLiteral(quickConstant2));
+	}
+	/* begin JumpGreaterOrEqual: */
+	jumpIsWords = genConditionalBranchoperand(JumpGreaterOrEqual, ((sqInt)0));
+	/* begin Jump: */
+	jumpNotIndexable = genoperand(Jump, ((sqInt)0));
+	jmpTarget(jumpIsBytes, gLogicalShiftLeftCqR(shiftForWord(), ClassReg));
+	/* begin AndCq:R: */
+	anInstruction5 = genoperandoperand(AndCqR, BytesPerWord - 1, formatReg);
+	if (usesOutOfLineLiteral(anInstruction5)) {
+		(anInstruction5->dependent = locateLiteral(BytesPerWord - 1));
+	}
+	/* begin SubR:R: */
+	genoperandoperand(SubRR, formatReg, ClassReg);
+	/* begin CmpR:R: */
+	genoperandoperand(CmpRR, Arg1Reg, ClassReg);
+	/* begin JumpBelowOrEqual: */
+	jumpBytesOutOfBounds = genConditionalBranchoperand(JumpBelowOrEqual, ((sqInt)0));
+	/* begin AddCq:R: */
+	anInstruction6 = genoperandoperand(AddCqR, BaseHeaderSize, Arg1Reg);
+	if (usesOutOfLineLiteral(anInstruction6)) {
+		(anInstruction6->dependent = locateLiteral(BaseHeaderSize));
+	}
+	/* begin MoveXbr:R:R: */
+	genoperandoperandoperand(MoveXbrRR, Arg1Reg, ReceiverResultReg, ReceiverResultReg);
+	/* begin Label */
+	done = genoperandoperand(Label, (labelCounter += 1), bytecodePC);
+	genConvertIntegerToCharacterInReg(ReceiverResultReg);
+	/* begin genPrimReturn */
+	assert(methodOrBlockNumArgs <= (numRegArgs()));
+	/* begin RetN: */
+	genoperand(RetN, 0);
+	jmpTarget(jumpIsShorts, gLogicalShiftLeftCqR((shiftForWord()) - 1, ClassReg));
+	/* begin AndCq:R: */
+	anInstruction7 = genoperandoperand(AndCqR, 1, formatReg);
+	if (usesOutOfLineLiteral(anInstruction7)) {
+		(anInstruction7->dependent = locateLiteral(1));
+	}
+	/* begin SubR:R: */
+	genoperandoperand(SubRR, formatReg, ClassReg);
+	/* begin CmpR:R: */
+	genoperandoperand(CmpRR, Arg1Reg, ClassReg);
+	/* begin JumpBelowOrEqual: */
+	jumpShortsOutOfBounds = genConditionalBranchoperand(JumpBelowOrEqual, ((sqInt)0));
+	/* begin AddR:R: */
+	genoperandoperand(AddRR, Arg1Reg, ReceiverResultReg);
+	/* begin MoveM16:r:R: */
+	anInstruction8 = genoperandoperandoperand(MoveM16rR, BaseHeaderSize, ReceiverResultReg, ReceiverResultReg);
+	if (usesOutOfLineLiteral(anInstruction8)) {
+		(anInstruction8->dependent = locateLiteral(BaseHeaderSize));
+	}
+	/* begin Jump: */
+	genoperand(Jump, ((sqInt)done));
+	jmpTarget(jumpIsWords, gCmpRR(Arg1Reg, ClassReg));
+	/* begin JumpBelowOrEqual: */
+	jumpWordsOutOfBounds = genConditionalBranchoperand(JumpBelowOrEqual, ((sqInt)0));
+	/* begin AddCq:R: */
+	quickConstant3 = ((usqInt) BaseHeaderSize) >> (shiftForWord());
+	/* begin gen:quickConstant:operand: */
+	anInstruction9 = genoperandoperand(AddCqR, quickConstant3, Arg1Reg);
+	if (usesOutOfLineLiteral(anInstruction9)) {
+		(anInstruction9->dependent = locateLiteral(quickConstant3));
+	}
+	/* begin MoveXwr:R:R: */
+	genoperandoperandoperand(MoveXwrRR, Arg1Reg, ReceiverResultReg, TempReg);
+	/* begin SubCq:R: */
+	quickConstant4 = ((usqInt) BaseHeaderSize) >> (shiftForWord());
+	/* begin gen:quickConstant:operand: */
+	anInstruction10 = genoperandoperand(SubCqR, quickConstant4, Arg1Reg);
+	if (usesOutOfLineLiteral(anInstruction10)) {
+		(anInstruction10->dependent = locateLiteral(quickConstant4));
+	}
+	jumpWordTooBig = jumpNotCharacterUnsignedValueInRegister(TempReg);
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, TempReg, ReceiverResultReg);
+	/* begin Jump: */
+	genoperand(Jump, ((sqInt)done));
+	jmpTarget(jumpBytesOutOfBounds, jmpTarget(jumpShortsOutOfBounds, jmpTarget(jumpWordsOutOfBounds, jmpTarget(jumpWordTooBig, jmpTarget(jumpNotIndexable, jmpTarget(jumpBadIndex, gLabel()))))));
+	return CompletePrimitive;
+}
+
+
+/*	c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format:
+	fixedFieldsOf:format:length: 
+ */
+
 	/* CogObjectRepresentationFor32BitSpur>>#genPrimitiveStringAtPut */
 static sqInt
 genPrimitiveStringAtPut(void)
 {
     AbstractInstruction *anInstruction;
     AbstractInstruction *anInstruction1;
+    AbstractInstruction *anInstruction10;
+    AbstractInstruction *anInstruction11;
     AbstractInstruction *anInstruction2;
     AbstractInstruction *anInstruction3;
     AbstractInstruction *anInstruction4;
@@ -18491,25 +18704,28 @@
     AbstractInstruction *anInstruction6;
     AbstractInstruction *anInstruction7;
     AbstractInstruction *anInstruction8;
+    AbstractInstruction *anInstruction9;
     sqInt formatReg;
     AbstractInstruction *jumpBadArg;
     AbstractInstruction *jumpBadIndex;
     AbstractInstruction *jumpBytesOutOfBounds;
-    AbstractInstruction * jumpBytesOutOfRange;
+    AbstractInstruction *jumpBytesOutOfRange;
     AbstractInstruction *jumpIsBytes;
     AbstractInstruction * jumpIsCompiledMethod;
+    AbstractInstruction *jumpIsShorts;
     AbstractInstruction * jumpNotString;
-    AbstractInstruction *jumpShortsUnsupported;
+    AbstractInstruction *jumpShortsDone;
+    AbstractInstruction *jumpShortsOutOfBounds;
+    AbstractInstruction *jumpShortsOutOfRange;
     AbstractInstruction *jumpWordsDone;
     AbstractInstruction *jumpWordsOutOfBounds;
+    AbstractInstruction *jumpWordsOutOfRange;
     sqInt operandOne;
     sqInt quickConstant;
     sqInt quickConstant1;
     sqInt quickConstant2;
     sqInt quickConstant3;
 
-
-	/* c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format: fixedFieldsOf:format:length: */
 	/* begin genLoadArgAtDepth:into: */
 	assert(1 < (numRegArgs()));
 	/* begin genLoadArgAtDepth:into: */
@@ -18520,9 +18736,9 @@
 	jumpBadArg = genJumpNotCharacterInScratchReg(TempReg);
 	genConvertSmallIntegerToIntegerInReg(Arg0Reg);
 	/* begin SubCq:R: */
-	anInstruction8 = genoperandoperand(SubCqR, 1, Arg0Reg);
-	if (usesOutOfLineLiteral(anInstruction8)) {
-		(anInstruction8->dependent = locateLiteral(1));
+	anInstruction10 = genoperandoperand(SubCqR, 1, Arg0Reg);
+	if (usesOutOfLineLiteral(anInstruction10)) {
+		(anInstruction10->dependent = locateLiteral(1));
 	}
 	genGetFormatOfintoleastSignificantHalfOfBaseHeaderIntoScratch(ReceiverResultReg, (formatReg = SendNumArgsReg), NoReg);
 
@@ -18562,7 +18778,14 @@
 		(anInstruction3->dependent = locateLiteral(quickConstant3));
 	}
 	/* begin JumpGreaterOrEqual: */
-	jumpShortsUnsupported = genConditionalBranchoperand(JumpGreaterOrEqual, ((sqInt)0));
+	jumpIsShorts = genConditionalBranchoperand(JumpGreaterOrEqual, ((sqInt)0));
+	/* begin CmpCq:R: */
+	anInstruction4 = genoperandoperand(CmpCqR, 0, Arg1Reg);
+	if (usesOutOfLineLiteral(anInstruction4)) {
+		(anInstruction4->dependent = locateLiteral(0));
+	}
+	/* begin JumpLess: */
+	jumpWordsOutOfRange = genConditionalBranchoperand(JumpLess, ((sqInt)0));
 	/* begin CmpR:R: */
 	genoperandoperand(CmpRR, Arg0Reg, ClassReg);
 	/* begin JumpBelowOrEqual: */
@@ -18573,9 +18796,9 @@
 	/* begin AddCq:R: */
 	operandOne = ((usqInt) BaseHeaderSize) >> (shiftForWord());
 	/* begin checkQuickConstant:forInstruction: */
-	anInstruction4 = genoperandoperand(AddCqR, operandOne, Arg0Reg);
-	if (usesOutOfLineLiteral(anInstruction4)) {
-		(anInstruction4->dependent = locateLiteral(operandOne));
+	anInstruction5 = genoperandoperand(AddCqR, operandOne, Arg0Reg);
+	if (usesOutOfLineLiteral(anInstruction5)) {
+		(anInstruction5->dependent = locateLiteral(operandOne));
 	}
 	/* begin MoveR:Xwr:R: */
 	genoperandoperandoperand(MoveRXwrR, TempReg, Arg0Reg, ReceiverResultReg);
@@ -18583,15 +18806,45 @@
 	genoperandoperand(MoveRR, Arg1Reg, ReceiverResultReg);
 	/* begin Jump: */
 	jumpWordsDone = genoperand(Jump, ((sqInt)0));
+	jmpTarget(jumpIsShorts, gCmpCqR(characterObjectOf(0xFFFF), Arg1Reg));
+	/* begin JumpAbove: */
+	jumpShortsOutOfRange = genConditionalBranchoperand(JumpAbove, ((sqInt)0));
+	/* begin LogicalShiftLeftCq:R: */
+	genoperandoperand(LogicalShiftLeftCqR, (shiftForWord()) - 1, ClassReg);
+	/* begin AndCq:R: */
+	anInstruction6 = genoperandoperand(AndCqR, 1, formatReg);
+	if (usesOutOfLineLiteral(anInstruction6)) {
+		(anInstruction6->dependent = locateLiteral(1));
+	}
+	/* begin SubR:R: */
+	genoperandoperand(SubRR, formatReg, ClassReg);
+	/* begin CmpR:R: */
+	genoperandoperand(CmpRR, Arg0Reg, ClassReg);
+	/* begin JumpBelowOrEqual: */
+	jumpShortsOutOfBounds = genConditionalBranchoperand(JumpBelowOrEqual, ((sqInt)0));
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, Arg1Reg, TempReg);
+	genConvertSmallIntegerToIntegerInReg(TempReg);
+	/* begin AddR:R: */
+	genoperandoperand(AddRR, Arg0Reg, ReceiverResultReg);
+	/* begin MoveR:M16:r: */
+	anInstruction11 = genoperandoperandoperand(MoveRM16r, TempReg, BaseHeaderSize, ReceiverResultReg);
+	if (usesOutOfLineLiteral(anInstruction11)) {
+		(anInstruction11->dependent = locateLiteral(BaseHeaderSize));
+	}
+	/* begin MoveR:R: */
+	genoperandoperand(MoveRR, Arg1Reg, ReceiverResultReg);
+	/* begin Jump: */
+	jumpShortsDone = genoperand(Jump, ((sqInt)0));
 	jmpTarget(jumpIsBytes, gCmpCqR(characterObjectOf(0xFF), Arg1Reg));
 	/* begin JumpAbove: */
 	jumpBytesOutOfRange = genConditionalBranchoperand(JumpAbove, ((sqInt)0));
 	/* begin LogicalShiftLeftCq:R: */
 	genoperandoperand(LogicalShiftLeftCqR, shiftForWord(), ClassReg);
 	/* begin AndCq:R: */
-	anInstruction5 = genoperandoperand(AndCqR, BytesPerWord - 1, formatReg);
-	if (usesOutOfLineLiteral(anInstruction5)) {
-		(anInstruction5->dependent = locateLiteral(BytesPerWord - 1));
+	anInstruction7 = genoperandoperand(AndCqR, BytesPerWord - 1, formatReg);
+	if (usesOutOfLineLiteral(anInstruction7)) {
+		(anInstruction7->dependent = locateLiteral(BytesPerWord - 1));
 	}
 	/* begin SubR:R: */
 	genoperandoperand(SubRR, formatReg, ClassReg);
@@ -18603,24 +18856,24 @@
 	genoperandoperand(MoveRR, Arg1Reg, TempReg);
 	genConvertCharacterToCodeInReg(TempReg);
 	/* begin AddCq:R: */
-	anInstruction6 = genoperandoperand(AddCqR, BaseHeaderSize, Arg0Reg);
-	if (usesOutOfLineLiteral(anInstruction6)) {
-		(anInstruction6->dependent = locateLiteral(BaseHeaderSize));
+	anInstruction8 = genoperandoperand(AddCqR, BaseHeaderSize, Arg0Reg);
+	if (usesOutOfLineLiteral(anInstruction8)) {
+		(anInstruction8->dependent = locateLiteral(BaseHeaderSize));
 	}
 	/* begin MoveR:Xbr:R: */
 	genoperandoperandoperand(MoveRXbrR, TempReg, Arg0Reg, ReceiverResultReg);
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, Arg1Reg, ReceiverResultReg);
-	jmpTarget(jumpWordsDone, genPrimReturn());
-	jmpTarget(jumpBadArg, jmpTarget(jumpNotString, jmpTarget(jumpBytesOutOfRange, jmpTarget(jumpIsCompiledMethod, jmpTarget(jumpBytesOutOfBounds, jmpTarget(jumpShortsUnsupported, jmpTarget(jumpWordsOutOfBounds, gLabel())))))));
+	jmpTarget(jumpShortsDone, jmpTarget(jumpWordsDone, genPrimReturn()));
+	jmpTarget(jumpNotString, jmpTarget(jumpBytesOutOfRange, jmpTarget(jumpShortsOutOfRange, jmpTarget(jumpWordsOutOfRange, jmpTarget(jumpIsCompiledMethod, jmpTarget(jumpBytesOutOfBounds, jmpTarget(jumpShortsOutOfBounds, jmpTarget(jumpWordsOutOfBounds, gLabel()))))))));
 	/* begin AddCq:R: */
-	anInstruction7 = genoperandoperand(AddCqR, 1, Arg0Reg);
-	if (usesOutOfLineLiteral(anInstruction7)) {
-		(anInstruction7->dependent = locateLiteral(1));
+	anInstruction9 = genoperandoperand(AddCqR, 1, Arg0Reg);
+	if (usesOutOfLineLiteral(anInstruction9)) {
+		(anInstruction9->dependent = locateLiteral(1));
 	}
 	genConvertIntegerToSmallIntegerInReg(Arg0Reg);
-	jmpTarget(jumpBadIndex, gLabel());
-	return 0;
+	jmpTarget(jumpBadArg, jmpTarget(jumpBadIndex, gLabel()));
+	return CompletePrimitive;
 }
 
 	/* CogObjectRepresentationFor32BitSpur>>#genRemoveSmallIntegerTagsInScratchReg: */
@@ -18701,13 +18954,6 @@
 	return 1;
 }
 
-	/* CogObjectRepresentationFor32BitSpur>>#numCharacterBits */
-static sqInt
-numCharacterBits(void)
-{
-	return 30;
-}
-
 	/* CogObjectRepresentationFor32BitSpur>>#numSmallIntegerBits */
 static sqInt
 numSmallIntegerBits(void)
@@ -19752,7 +19998,7 @@
 }
 
 	/* CogObjectRepresentationForSpur>>#genGetClassTagOf:into:scratchReg: */
-static AbstractInstruction * NoDbgRegParms
+static sqInt NoDbgRegParms
 genGetClassTagOfintoscratchReg(sqInt instReg, sqInt destReg, sqInt scratchReg)
 {
 	return genGetInlineCacheClassTagFromintoforEntry(instReg, destReg, 1);
@@ -20171,7 +20417,6 @@
 static sqInt
 genPrimitiveAsCharacter(void)
 {
-    AbstractInstruction *anInstruction;
     AbstractInstruction *jumpNotInt;
     AbstractInstruction *jumpOutOfRange;
     sqInt reg;
@@ -20192,13 +20437,7 @@
 	/* begin MoveR:R: */
 	genoperandoperand(MoveRR, reg, TempReg);
 	genConvertSmallIntegerToIntegerInReg(TempReg);
-	/* begin CmpCq:R: */
-	anInstruction = genoperandoperand(CmpCqR, (1 << 30) - 1, TempReg);
-	if (usesOutOfLineLiteral(anInstruction)) {
-		(anInstruction->dependent = locateLiteral((1 << 30) - 1));
-	}
-	/* begin JumpAbove: */
-	jumpOutOfRange = genConditionalBranchoperand(JumpAbove, ((sqInt)0));
+	jumpOutOfRange = jumpNotCharacterUnsignedValueInRegister(TempReg);
 	genConvertSmallIntegerToCharacterInReg(reg);
 	if (reg != ReceiverResultReg) {
 		/* begin MoveR:R: */
@@ -20504,161 +20743,6 @@
 	return CompletePrimitive;
 }
 
-
-/*	Implement the guts of primitiveStringAt; dispatch on size */
-
-	/* CogObjectRepresentationForSpur>>#genPrimitiveStringAt */
-static sqInt
-genPrimitiveStringAt(void)
-{
-    AbstractInstruction *anInstruction;
-    AbstractInstruction *anInstruction1;
-    AbstractInstruction *anInstruction10;
-    AbstractInstruction *anInstruction2;
-    AbstractInstruction *anInstruction3;
-    AbstractInstruction *anInstruction4;
-    AbstractInstruction *anInstruction5;
-    AbstractInstruction *anInstruction6;
-    AbstractInstruction *anInstruction7;
-    AbstractInstruction *anInstruction8;
-    AbstractInstruction *anInstruction9;
-    AbstractInstruction *done;
-    sqInt formatReg;
-    AbstractInstruction *jumpBadIndex;
-    AbstractInstruction *jumpBytesOutOfBounds;
-    AbstractInstruction *jumpIsBytes;
-    AbstractInstruction *jumpIsShorts;
-    AbstractInstruction *jumpIsWords;
-    AbstractInstruction *jumpNotIndexable;
-    AbstractInstruction *jumpShortsOutOfBounds;
-    AbstractInstruction *jumpWordsOutOfBounds;
-    AbstractInstruction *jumpWordTooBig;
-    sqInt quickConstant;
-    sqInt quickConstant1;
-    sqInt quickConstant2;
-    sqInt quickConstant3;
-    sqInt quickConstant4;
-
-
-	/* c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format: fixedFieldsOf:format:length: */
-	/* begin genLoadArgAtDepth:into: */
-	assert(0 < (numRegArgs()));
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, Arg0Reg, Arg1Reg);
-	/* begin genJumpNotSmallInteger:scratchReg: */
-	jumpBadIndex = genJumpNotSmallInteger(Arg0Reg);
-	genConvertSmallIntegerToIntegerInReg(Arg1Reg);
-	/* begin SubCq:R: */
-	anInstruction1 = genoperandoperand(SubCqR, 1, Arg1Reg);
-	if (usesOutOfLineLiteral(anInstruction1)) {
-		(anInstruction1->dependent = locateLiteral(1));
-	}
-	genGetFormatOfintoleastSignificantHalfOfBaseHeaderIntoScratch(ReceiverResultReg, (formatReg = SendNumArgsReg), NoReg);
-	genGetNumSlotsOfinto(ReceiverResultReg, ClassReg);
-	/* begin CmpCq:R: */
-	quickConstant = firstByteFormat();
-	/* begin gen:quickConstant:operand: */
-	anInstruction2 = genoperandoperand(CmpCqR, quickConstant, formatReg);
-	if (usesOutOfLineLiteral(anInstruction2)) {
-		(anInstruction2->dependent = locateLiteral(quickConstant));
-	}
-	/* begin JumpGreaterOrEqual: */
-	jumpIsBytes = genConditionalBranchoperand(JumpGreaterOrEqual, ((sqInt)0));
-	/* begin CmpCq:R: */
-	quickConstant1 = firstShortFormat();
-	/* begin gen:quickConstant:operand: */
-	anInstruction3 = genoperandoperand(CmpCqR, quickConstant1, formatReg);
-	if (usesOutOfLineLiteral(anInstruction3)) {
-		(anInstruction3->dependent = locateLiteral(quickConstant1));
-	}
-	/* begin JumpGreaterOrEqual: */
-	jumpIsShorts = genConditionalBranchoperand(JumpGreaterOrEqual, ((sqInt)0));
-	/* begin CmpCq:R: */
-	quickConstant2 = firstLongFormat();
-	/* begin gen:quickConstant:operand: */
-	anInstruction4 = genoperandoperand(CmpCqR, quickConstant2, formatReg);
-	if (usesOutOfLineLiteral(anInstruction4)) {
-		(anInstruction4->dependent = locateLiteral(quickConstant2));
-	}
-	/* begin JumpGreaterOrEqual: */
-	jumpIsWords = genConditionalBranchoperand(JumpGreaterOrEqual, ((sqInt)0));
-	/* begin Jump: */
-	jumpNotIndexable = genoperand(Jump, ((sqInt)0));
-	jmpTarget(jumpIsBytes, gLogicalShiftLeftCqR(shiftForWord(), ClassReg));
-	/* begin AndCq:R: */
-	anInstruction5 = genoperandoperand(AndCqR, BytesPerWord - 1, formatReg);
-	if (usesOutOfLineLiteral(anInstruction5)) {
-		(anInstruction5->dependent = locateLiteral(BytesPerWord - 1));
-	}
-	/* begin SubR:R: */
-	genoperandoperand(SubRR, formatReg, ClassReg);
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, Arg1Reg, ClassReg);
-	/* begin JumpBelowOrEqual: */
-	jumpBytesOutOfBounds = genConditionalBranchoperand(JumpBelowOrEqual, ((sqInt)0));
-	/* begin AddCq:R: */
-	anInstruction6 = genoperandoperand(AddCqR, BaseHeaderSize, Arg1Reg);
-	if (usesOutOfLineLiteral(anInstruction6)) {
-		(anInstruction6->dependent = locateLiteral(BaseHeaderSize));
-	}
-	/* begin MoveXbr:R:R: */
-	genoperandoperandoperand(MoveXbrRR, Arg1Reg, ReceiverResultReg, ReceiverResultReg);
-	/* begin Label */
-	done = genoperandoperand(Label, (labelCounter += 1), bytecodePC);
-	genConvertIntegerToCharacterInReg(ReceiverResultReg);
-	/* begin genPrimReturn */
-	assert(methodOrBlockNumArgs <= (numRegArgs()));
-	/* begin RetN: */
-	genoperand(RetN, 0);
-	jmpTarget(jumpIsShorts, gLogicalShiftLeftCqR((shiftForWord()) - 1, ClassReg));
-	/* begin AndCq:R: */
-	anInstruction7 = genoperandoperand(AndCqR, 1, formatReg);
-	if (usesOutOfLineLiteral(anInstruction7)) {
-		(anInstruction7->dependent = locateLiteral(1));
-	}
-	/* begin SubR:R: */
-	genoperandoperand(SubRR, formatReg, ClassReg);
-	/* begin CmpR:R: */
-	genoperandoperand(CmpRR, Arg1Reg, ClassReg);
-	/* begin JumpBelowOrEqual: */
-	jumpShortsOutOfBounds = genConditionalBranchoperand(JumpBelowOrEqual, ((sqInt)0));
-	/* begin AddR:R: */
-	genoperandoperand(AddRR, Arg1Reg, ReceiverResultReg);
-	/* begin MoveM16:r:R: */
-	anInstruction8 = genoperandoperandoperand(MoveM16rR, BaseHeaderSize, ReceiverResultReg, ReceiverResultReg);
-	if (usesOutOfLineLiteral(anInstruction8)) {
-		(anInstruction8->dependent = locateLiteral(BaseHeaderSize));
-	}
-	/* begin Jump: */
-	genoperand(Jump, ((sqInt)done));
-	jmpTarget(jumpIsWords, gCmpRR(Arg1Reg, ClassReg));
-	/* begin JumpBelowOrEqual: */
-	jumpWordsOutOfBounds = genConditionalBranchoperand(JumpBelowOrEqual, ((sqInt)0));
-	/* begin AddCq:R: */
-	quickConstant3 = ((usqInt) BaseHeaderSize) >> (shiftForWord());
-	/* begin gen:quickConstant:operand: */
-	anInstruction9 = genoperandoperand(AddCqR, quickConstant3, Arg1Reg);
-	if (usesOutOfLineLiteral(anInstruction9)) {
-		(anInstruction9->dependent = locateLiteral(quickConstant3));
-	}
-	/* begin MoveXwr:R:R: */
-	genoperandoperandoperand(MoveXwrRR, Arg1Reg, ReceiverResultReg, TempReg);
-	/* begin SubCq:R: */
-	quickConstant4 = ((usqInt) BaseHeaderSize) >> (shiftForWord());
-	/* begin gen:quickConstant:operand: */
-	anInstruction10 = genoperandoperand(SubCqR, quickConstant4, Arg1Reg);
-	if (usesOutOfLineLiteral(anInstruction10)) {
-		(anInstruction10->dependent = locateLiteral(quickConstant4));
-	}
-	jumpWordTooBig = jumpNotCharacterUnsignedValueInRegister(TempReg);
-	/* begin MoveR:R: */
-	genoperandoperand(MoveRR, TempReg, ReceiverResultReg);
-	/* begin Jump: */
-	genoperand(Jump, ((sqInt)done));
-	jmpTarget(jumpBytesOutOfBounds, jmpTarget(jumpShortsOutOfBounds, jmpTarget(jumpWordsOutOfBounds, jmpTarget(jumpWordTooBig, jmpTarget(jumpNotIndexable, jmpTarget(jumpBadIndex, gLabel()))))));
-	return CompletePrimitive;
-}
-
 	/* CogObjectRepresentationForSpur>>#genSetSmallIntegerTagsIn: */
 static sqInt NoDbgRegParms
 genSetSmallIntegerTagsIn(sqInt scratchReg)
@@ -20756,13 +20840,13 @@
 	assert(destReg == ReceiverResultReg);
 	/* begin evaluateTrampolineCallBlock:protectLinkRegIfNot: */
 	if (inFrame) {
-		CallRTregistersToBeSavedMask(ceStoreCheckTrampoline, ((((registerMaskFor(valueReg)) | (callerSavedRegMask())) | (registerMaskFor(ReceiverResultReg))) - (registerMaskFor(ReceiverResultReg))));
+		CallRTregistersToBeSavedMask(ceStoreCheckTrampoline, ((((registerMaskFor(valueReg)) | (callerSavedRegMask())) | (registerMaskForand(ReceiverResultReg, scratchReg))) - (registerMaskForand(ReceiverResultReg, scratchReg))));
 
 	}
 	else {
 		/* begin saveAndRestoreLinkRegAround: */
 		inst = genoperand(PushR, LinkReg);
-		CallRTregistersToBeSavedMask(ceStoreCheckTrampoline, ((((registerMaskFor(valueReg)) | (callerSavedRegMask())) | (registerMaskFor(ReceiverResultReg))) - (registerMaskFor(ReceiverResultReg))));
+		CallRTregistersToBeSavedMask(ceStoreCheckTrampoline, ((((registerMaskFor(valueReg)) | (callerSavedRegMask())) | (registerMaskForand(ReceiverResultReg, scratchReg))) - (registerMaskForand(ReceiverResultReg, scratchReg))));
 
 
 		/* begin PopR: */
@@ -20847,11 +20931,14 @@
 jumpNotCharacterUnsignedValueInRegister(sqInt reg)
 {
     AbstractInstruction *anInstruction;
+    sqInt quickConstant;
 
 	/* begin CmpCq:R: */
-	anInstruction = genoperandoperand(CmpCqR, 0x3FFFFFFF, reg);
+	quickConstant = (1 << (numCharacterBits())) - 1;
+	/* begin gen:quickConstant:operand: */
+	anInstruction = genoperandoperand(CmpCqR, quickConstant, reg);
 	if (usesOutOfLineLiteral(anInstruction)) {
-		(anInstruction->dependent = locateLiteral(0x3FFFFFFF));
+		(anInstruction->dependent = locateLiteral(quickConstant));
 	}
 	/* begin JumpAbove: */
 	return genConditionalBranchoperand(JumpAbove, ((sqInt)0));
@@ -20976,7 +21063,14 @@
 	return 0;
 }
 
+	/* CogObjectRepresentationForSpur>>#numCharacterBits */
+static sqInt
+numCharacterBits(void)
+{
+	return 30;
+}
 
+
 /*	Define how many register arguments a StackToRegisterMappingCogit can
 	and should use with the receiver. The value must be 0, 1 or 2. Note that a
 	SimpleStackBasedCogit always has 0 register args (although the receiver is
@@ -25141,7 +25235,7 @@
 	register arguments, if any. */
 
 	/* StackToRegisterMappingCogit>>#compileFrameBuild */
-static sqInt
+static void
 compileFrameBuild(void)
 {
     sqInt address;
@@ -25154,11 +25248,11 @@
 
 	if (!needsFrame) {
 		initSimStackForFramelessMethod(initialPC);
-		return 0;
+		return;
 	}
 	genPushRegisterArgs();
 	if (!needsFrame) {
-		return 0;
+		return;
 	}
 	/* begin PushR: */
 	genoperand(PushR, LinkReg);

Modified: branches/Cog/nsspursrc/vm/cogitIA32.c
===================================================================
--- branches/Cog/nsspursrc/vm/cogitIA32.c	2016-01-10 22:51:42 UTC (rev 3553)
+++ branches/Cog/nsspursrc/vm/cogitIA32.c	2016-01-15 22:02:25 UTC (rev 3554)
@@ -1,9 +1,9 @@
 /* Automatically generated by
-	CCodeGenerator VMMaker.oscog-eem.1630 uuid: 2ed025ea-f400-4440-8e8b-5aa46d06c9ab
+	CCodeGenerator VMMaker.oscog-eem.1636 uuid: b30fe4bc-4de8-4dde-9709-3ad459f46862
    from
-	StackToRegisterMappingCogit VMMaker.oscog-eem.1630 uuid: 2ed025ea-f400-4440-8e8b-5aa46d06c9ab
+	StackToRegisterMappingCogit VMMaker.oscog-eem.1636 uuid: b30fe4bc-4de8-4dde-9709-3ad459f46862
  */
-static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1630 uuid: 2ed025ea-f400-4440-8e8b-5aa46d06c9ab " __DATE__ ;
+static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1636 uuid: b30fe4bc-4de8-4dde-9709-3ad459f46862 " __DATE__ ;
 char *__cogitBuildInfo = __buildInfo;
 
 
@@ -288,6 +288,7 @@
 #define MoveRAw 42
 #define MoveRdM64r 71
 #define MoveRdRd 69
+#define MoveRM16r 52
 #define MoveRMbr 60
 #define MoveRMwr 46
 #define MoveRR 40
@@ -813,13 +814,13 @@
 static sqInt genPrimitiveMirrorNewWithArg(void);
 static sqInt genPrimitiveNew(void);
 static sqInt genPrimitiveNewWithArg(void);
+static sqInt genPrimitiveStringAt(void);
 static sqInt genPrimitiveStringAtPut(void);
 static sqInt NoDbgRegParms genRemoveSmallIntegerTagsInScratchReg(sqInt scratchReg);
 static sqInt NoDbgRegParms genShiftAwaySmallIntegerTagsInScratchReg(sqInt scratchReg);
 static sqInt NoDbgRegParms inlineCacheTagForInstance(sqInt oop);
 static AbstractInstruction * NoDbgRegParms jumpNotSmallIntegerUnsignedValueInRegister(sqInt reg);
 static sqInt NoDbgRegParms markAndTraceCacheTagLiteralinatpc(sqInt literal, CogMethod *cogMethodOrNil, usqInt address);
-static sqInt numCharacterBits(void);
 static sqInt numSmallIntegerBits(void);
 static sqInt NoDbgRegParms validInlineCacheTag(usqInt classIndexOrTagPattern);
 static sqInt NoDbgRegParms cacheTagIsMarked(sqInt cacheTag);
@@ -842,7 +843,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);
@@ -858,7 +859,6 @@
 static sqInt NoDbgRegParms genPrimitiveIdenticalOrNotIf(sqInt orNot);
 static sqInt genPrimitiveObjectAt(void);
 static sqInt genPrimitiveSize(void);
-static sqInt genPrimitiveStringAt(void);
 static sqInt NoDbgRegParms genSetSmallIntegerTagsIn(sqInt scratchReg);
 static sqInt genStoreCheckContextReceiverTrampoline(void);
 static sqInt NoDbgRegParms genStoreCheckReceiverRegvalueRegscratchReginFrame(sqInt destReg, sqInt valueReg, sqInt scratchReg, sqInt inFrame);
@@ -872,6 +872,7 @@
 static void NoDbgRegParms markAndTraceUpdatedLiteralin(sqInt objOop, CogMethod *cogMethodOrNil);
 static void NoDbgRegParms markIfIRC(usqInt maybeIRCs);
 static sqInt NoDbgRegParms maybeCompileRetryonPrimitiveFail(AbstractInstruction *retryInst, sqInt primIndex);
+static sqInt numCharacterBits(void);
 extern sqInt numRegArgs(void);
 static sqInt NoDbgRegParms remapObject(sqInt objOop);
 static sqInt NoDbgRegParms remapOop(sqInt objOop);
@@ -929,7 +930,7 @@
 static sqInt genLongUnconditionalForwardJump(void);
 static sqInt NoDbgRegParms genLookupForPerformNumArgs(sqInt numArgs);
 static AbstractInstruction * NoDbgRegParms genMoveConstantR(sqInt constant, sqInt reg);
-static AbstractInstruction * NoDbgRegParms genMoveTrueR(sqInt reg);
+static sqInt NoDbgRegParms genMoveTrueR(sqInt reg);
 static sqInt NoDbgRegParms genMustBeBooleanTrampolineForcalled(sqInt boolean, char *trampolineName);
 static void NoDbgRegParms genPrimReturnEnterCogCodeEnilopmart(sqInt profiling);
 static sqInt genPushClosureTempsBytecode(void);
@@ -998,7 +999,7 @@
 static void NoDbgRegParms compileBlockFramelessEntry(BlockStart *blockStart);
 static CogMethod * NoDbgRegParms compileCogMethod(sqInt selector);
 static sqInt compileEntireMethod(void);
-static sqInt compileFrameBuild(void);
+static void compileFrameBuild(void);
 static sqInt NoDbgRegParms cPICMissTrampolineFor(sqInt numArgs);
 static sqInt doubleExtendedDoAnythingBytecode(void);
 static sqInt duplicateTopBytecode(void);
@@ -2491,6 +2492,13 @@
 					? 3
 					: 6));
 
+	case MoveRM16r:
+		return ((((self_in_computeMaximumSize->operands))[2]) == ESP
+			? 8
+			: (isQuick(self_in_computeMaximumSize, ((self_in_computeMaximumSize->operands))[1])
+					? 4
+					: 7));
+
 	case MoveM64rRd:
 		return ((isQuick(self_in_computeMaximumSize, ((self_in_computeMaximumSize->operands))[0])
 	? 5
@@ -2640,6 +2648,7 @@
     unsigned long destReg10;
     unsigned long destReg11;
     unsigned long destReg12;
+    unsigned long destReg13;
     unsigned long destReg2;
     unsigned long destReg3;
     unsigned long destReg4;
@@ -2739,10 +2748,11 @@
     sqInt offset117;
     sqInt offset118;
     sqInt offset119;
-    sqInt offset12;
+    unsigned long offset12;
     sqInt offset120;
     sqInt offset121;
     sqInt offset122;
+    sqInt offset123;
     sqInt offset13;
     sqInt offset14;
     sqInt offset15;
@@ -2821,6 +2831,7 @@
     unsigned long srcReg;
     unsigned long srcReg1;
     unsigned long srcReg10;
+    unsigned long srcReg11;
     unsigned long srcReg2;
     unsigned long srcReg3;
     unsigned long srcReg4;
@@ -3101,12 +3112,12 @@
 			jumpTarget = ((AbstractInstruction *) ((jumpTarget->address)));
 		}
 		assert(jumpTarget != 0);
-		offset12 = (((int) jumpTarget)) - (((int) (((self_in_dispatchConcretize->address)) + 5)));
+		offset13 = (((int) jumpTarget)) - (((int) (((self_in_dispatchConcretize->address)) + 5)));
 		((self_in_dispatchConcretize->machineCode))[0] = 233;
-		((self_in_dispatchConcretize->machineCode))[1] = (offset12 & 0xFF);
-		((self_in_dispatchConcretize->machineCode))[2] = ((((usqInt) offset12) >> 8) & 0xFF);
-		((self_in_dispatchConcretize->machineCode))[3] = ((((usqInt) offset12) >> 16) & 0xFF);
-		((self_in_dispatchConcretize->machineCode))[4] = ((((usqInt) offset12) >> 24) & 0xFF);
+		((self_in_dispatchConcretize->machineCode))[1] = (offset13 & 0xFF);
+		((self_in_dispatchConcretize->machineCode))[2] = ((((usqInt) offset13) >> 8) & 0xFF);
+		((self_in_dispatchConcretize->machineCode))[3] = ((((usqInt) offset13) >> 16) & 0xFF);
+		((self_in_dispatchConcretize->machineCode))[4] = ((((usqInt) offset13) >> 24) & 0xFF);
 		((self_in_dispatchConcretize->machineCodeSize) = 5);
 		return;
 
@@ -3122,12 +3133,12 @@
 		}
 		assert(jumpTarget12 != 0);
 		jumpTarget3 = jumpTarget12;
-		offset14 = (((int) jumpTarget3)) - (((int) (((self_in_dispatchConcretize->address)) + 2)));
+		offset15 = (((int) jumpTarget3)) - (((int) (((self_in_dispatchConcretize->address)) + 2)));
 		if ((((self_in_dispatchConcretize->machineCodeSize)) == 0
-			? isQuick(self_in_dispatchConcretize, offset14)
+			? isQuick(self_in_dispatchConcretize, offset15)

@@ Diff output truncated at 50000 characters. @@


More information about the Vm-dev mailing list