Revision: 2836 Author: eliot Date: 2013-12-24 20:06:57 -0800 (Tue, 24 Dec 2013) Log Message: ----------- CogVM source as per VMMaker.oscog-eem.569
Fix Spur's machine-code identityHash primitive for Character receivers. Refactor into the conventional cogit/objRep split genPrimitiveFoo/genInnerPrimitiveFoo. Nuke the now-unused isHashSetOnInstanceCreation.
Fix Spur's machine-code == & ~~ primitives for potentially forwarded arguments.
Implement machine-code primitives for Character>>value and SmallInteger>>asCharacter/Character class>>value:.
Check for valid bitmap in primitivePixelValueAt aka BitBltSimulation>> primitivePixelValueAtX:y: Fix provided by Nicolas Cellier. Reference Mantis 7799
Revert/change Spur entry-code: a) 4 byte entry-point alignment is as good as 8-byte on Core i7 b) the older backward-branching for immediates entry-point code is significantly faster for non-immediates and because we expect most SmallInteger code to be performed in-line it is better to prefer non-immediate send performance.
Modified Paths: -------------- branches/Cog/nscogsrc/plugins/BitBltPlugin/BitBltPlugin.c branches/Cog/nscogsrc/vm/cogit.c branches/Cog/nscogsrc/vm/cogit.h branches/Cog/nscogsrc/vm/cogmethod.h branches/Cog/nscogsrc/vm/cointerp.c branches/Cog/nscogsrc/vm/cointerp.h branches/Cog/nscogsrc/vm/gcc3x-cointerp.c branches/Cog/nscogsrc/vm/interp.h branches/Cog/nscogsrc/vm/vmCallback.h branches/Cog/spursrc/vm/cogit.c branches/Cog/spursrc/vm/cogit.h branches/Cog/spursrc/vm/cogmethod.h branches/Cog/spursrc/vm/cointerp.c branches/Cog/spursrc/vm/cointerp.h branches/Cog/spursrc/vm/gcc3x-cointerp.c branches/Cog/spursrc/vm/interp.h branches/Cog/spursrc/vm/vmCallback.h branches/Cog/spurstacksrc/vm/gcc3x-interp.c branches/Cog/spurstacksrc/vm/interp.c branches/Cog/spurstacksrc/vm/interp.h branches/Cog/spurstacksrc/vm/vmCallback.h branches/Cog/src/plugins/BitBltPlugin/BitBltPlugin.c branches/Cog/src/vm/cogit.c branches/Cog/src/vm/cogit.h branches/Cog/src/vm/cogmethod.h 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/src/vm/interp.h branches/Cog/src/vm/vmCallback.h
Property Changed: ---------------- branches/Cog/platforms/Cross/vm/sqSCCSVersion.h
Modified: branches/Cog/nscogsrc/plugins/BitBltPlugin/BitBltPlugin.c =================================================================== --- branches/Cog/nscogsrc/plugins/BitBltPlugin/BitBltPlugin.c 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/nscogsrc/plugins/BitBltPlugin/BitBltPlugin.c 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,9 +1,9 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 from - BitBltSimulation VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0 + BitBltSimulation VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */ -static char __buildInfo[] = "BitBltSimulation VMMaker.oscog-eem.555 uuid: 9b99d897-eecb-4b11-97c9-7f7a75c7d8b0 " __DATE__ ; +static char __buildInfo[] = "BitBltSimulation VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 " __DATE__ ;
@@ -344,9 +344,9 @@ }; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "BitBltPlugin VMMaker.oscog-eem.555 (i)" + "BitBltPlugin VMMaker.oscog-eem.569 (i)" #else - "BitBltPlugin VMMaker.oscog-eem.555 (e)" + "BitBltPlugin VMMaker.oscog-eem.569 (e)" #endif ; static sqInt noHalftone; @@ -5424,6 +5424,7 @@ primitivePixelValueAt(void) { sqInt bitmap; + sqInt bitsSize; sqInt depth; sqInt mask; sqInt pixel; @@ -5458,6 +5459,10 @@ return null; } bitmap = fetchPointerofObject(FormBitsIndex, rcvr); + if (!(isWordsOrBytes(bitmap))) { + primitiveFail(); + return null; + } width = fetchIntegerofObject(FormWidthIndex, rcvr); height = fetchIntegerofObject(FormHeightIndex, rcvr);
@@ -5485,10 +5490,18 @@
ppW = 32 / depth;
- /* how many words per rox of pixels */ + /* how many words per row of pixels */
stride = (width + (ppW - 1)) / ppW; + bitsSize = byteSizeOf(bitmap); + if (!(bitsSize == ((stride * height) * 4))) {
+ /* bytes per word */ + + primitiveFail(); + return null; + } + /* load the word that contains our target */
word = fetchLong32ofObject((yVal * stride) + (xVal / ppW), bitmap);
Modified: branches/Cog/nscogsrc/vm/cogit.c =================================================================== --- branches/Cog/nscogsrc/vm/cogit.c 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/nscogsrc/vm/cogit.c 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGenerator VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 from - StackToRegisterMappingCogit VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + StackToRegisterMappingCogit VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 " __DATE__ ; char *__cogitBuildInfo = __buildInfo;
@@ -646,8 +646,12 @@ static sqInt genGetLeafCallStackPointer(void); static AbstractInstruction * genGetLeafCallStackPointerFunction(AbstractInstruction * self_in_genGetLeafCallStackPointerFunction); static sqInt genInnerPICAbortTrampoline(char *name); +static sqInt genInnerPrimitiveAsCharacterinReg(sqInt retNOffset, sqInt reg); static sqInt genInnerPrimitiveAtPut(sqInt retNoffset); static sqInt genInnerPrimitiveAt(sqInt retNoffset); +static sqInt genInnerPrimitiveCharacterValue(sqInt retNOffset); +static sqInt genInnerPrimitiveIdenticalorNotIf(sqInt retNoffset, sqInt orNot); +static sqInt genInnerPrimitiveIdentityHash(sqInt retNOffset); static sqInt genInnerPrimitiveNewMethod(sqInt retNoffset); static sqInt genInnerPrimitiveNewWithArg(sqInt retNoffset); static sqInt genInnerPrimitiveNew(sqInt retNoffset); @@ -690,6 +694,7 @@ static sqInt genPICMissTrampolineFor(sqInt numArgs); static sqInt genPopStackBytecode(void); static sqInt genPrimitiveAdd(void); +static sqInt genPrimitiveAsCharacter(void); static sqInt genPrimitiveAsFloat(void); static sqInt genPrimitiveAt(void); static sqInt genPrimitiveAtPut(void); @@ -697,6 +702,7 @@ static sqInt genPrimitiveBitOr(void); static sqInt genPrimitiveBitShift(void); static sqInt genPrimitiveBitXor(void); +static sqInt genPrimitiveCharacterValue(void); static sqInt genPrimitiveClass(void); static sqInt genPrimitiveClosureValue(void); static sqInt genPrimitiveDiv(void); @@ -856,7 +862,6 @@ static sqInt isBigEndian(AbstractInstruction * self_in_isBigEndian); static sqInt isBranch(BytecodeDescriptor * self_in_isBranch); static sqInt isCallPreceedingReturnPC(AbstractInstruction * self_in_isCallPreceedingReturnPC, sqInt mcpc); -static sqInt isHashSetOnInstanceCreation(void); static sqInt isJump(AbstractInstruction * self_in_isJump); static sqInt isJumpAt(AbstractInstruction * self_in_isJumpAt, sqInt pc); static sqInt isLongJump(AbstractInstruction * self_in_isLongJump); @@ -1901,9 +1906,12 @@ { 0, -1, 0 }, { 0, -1, 0 }, { genPrimitiveNotIdentical, 1, 0 }, + { genPrimitiveAsCharacter, -1, 0 }, + { genPrimitiveCharacterValue, 0, 0 }, { 0, -1, 0 }, { 0, -1, 0 }, { 0, -1, 0 }, + { genPrimitiveIdentityHash, 0, 0 }, { 0, -1, 0 }, { 0, -1, 0 }, { 0, -1, 0 }, @@ -1926,9 +1934,6 @@ { 0, -1, 0 }, { 0, -1, 0 }, { 0, -1, 0 }, - { 0, -1, 0 }, - { 0, -1, 0 }, - { 0, -1, 0 }, { genFastPrimFail, -1, 0 }, { genFastPrimFail, -1, 0 }, { 0, -1, 0 }, @@ -12281,6 +12286,15 @@ /* subclasses override if they can */
static sqInt +genInnerPrimitiveAsCharacterinReg(sqInt retNOffset, sqInt reg) +{ + return unimplementedPrimitive(); +} + + +/* subclasses override if they can */ + +static sqInt genInnerPrimitiveAtPut(sqInt retNoffset) { return unimplementedPrimitive(); @@ -12487,6 +12501,53 @@ /* subclasses override if they can */
static sqInt +genInnerPrimitiveCharacterValue(sqInt retNOffset) +{ + return unimplementedPrimitive(); +} + +static sqInt +genInnerPrimitiveIdenticalorNotIf(sqInt retNoffset, sqInt orNot) +{ + AbstractInstruction *jumpCmp; + + /* begin CmpR:R: */ + genoperandoperand(CmpRR, Arg0Reg, ReceiverResultReg); + jumpCmp = (orNot + ? (/* begin JumpZero: */ + genoperand(JumpZero, ((sqInt)0))) + : (/* begin JumpNonZero: */ + genoperand(JumpNonZero, ((sqInt)0)))); + annotateobjRef(gMoveCwR(trueObject(), ReceiverResultReg), trueObject()); + /* begin RetN: */ + genoperand(RetN, retNoffset); + jmpTarget(jumpCmp, annotateobjRef(gMoveCwR(falseObject(), ReceiverResultReg), falseObject())); + /* begin RetN: */ + genoperand(RetN, retNoffset); + return 0; +} + +static sqInt +genInnerPrimitiveIdentityHash(sqInt retNOffset) +{ + AbstractInstruction *jumpSI; + + /* begin MoveR:R: */ + genoperandoperand(MoveRR, ReceiverResultReg, ClassReg); + jumpSI = genJumpSmallIntegerInScratchReg(ClassReg); + genGetHashFieldNonImmOfasSmallIntegerInto(ReceiverResultReg, TempReg); + /* begin MoveR:R: */ + genoperandoperand(MoveRR, TempReg, ReceiverResultReg); + /* begin RetN: */ + genoperand(RetN, retNOffset); + jmpTarget(jumpSI, gLabel()); + return 0; +} + + +/* subclasses override if they can */ + +static sqInt genInnerPrimitiveNewMethod(sqInt retNoffset) { return unimplementedPrimitive(); @@ -13257,6 +13318,23 @@ }
static sqInt +genPrimitiveAsCharacter(void) +{ + sqInt na; + sqInt r; + + na = argumentCountOf(methodObj); + if (na <= 1) { + if (((r = genInnerPrimitiveAsCharacterinReg(0, (na == 0 + ? ReceiverResultReg + : Arg0Reg)))) < 0) { + return r; + } + } + return compileFallbackToInterpreterPrimitive(); +} + +static sqInt genPrimitiveAsFloat(void) { AbstractInstruction *jumpFailAlloc; @@ -13458,7 +13536,18 @@ return 0; }
+static sqInt +genPrimitiveCharacterValue(void) +{ + sqInt r;
+ if (((r = genInnerPrimitiveCharacterValue(0))) < 0) { + return r; + } + return compileFallbackToInterpreterPrimitive(); +} + + /* Depending on argument count the argument is either 0 args: ReceiverResultReg 1 args: Arg0Reg @@ -13752,39 +13841,18 @@ static sqInt genPrimitiveIdentical(void) { - AbstractInstruction *jumpFalse; - - /* begin CmpR:R: */ - genoperandoperand(CmpRR, Arg0Reg, ReceiverResultReg); - /* begin JumpNonZero: */ - jumpFalse = genoperand(JumpNonZero, ((sqInt)0)); - annotateobjRef(gMoveCwR(trueObject(), ReceiverResultReg), trueObject()); - /* begin RetN: */ - genoperand(RetN, 0); - jmpTarget(jumpFalse, annotateobjRef(gMoveCwR(falseObject(), ReceiverResultReg), falseObject())); - /* begin RetN: */ - genoperand(RetN, 0); - return 0; + return genInnerPrimitiveIdenticalorNotIf(0, 0); }
static sqInt genPrimitiveIdentityHash(void) { - AbstractInstruction *jumpNotSet; - AbstractInstruction *jumpSI; + sqInt r;
- /* begin MoveR:R: */ - genoperandoperand(MoveRR, ReceiverResultReg, ClassReg); - jumpSI = genJumpSmallIntegerInScratchReg(ClassReg); - genGetHashFieldNonImmOfasSmallIntegerInto(ReceiverResultReg, TempReg); - - /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, ReceiverResultReg); - /* begin RetN: */ - genoperand(RetN, 0); - - jmpTarget(jumpSI, gLabel()); - return 0; + if (((r = genInnerPrimitiveIdentityHash(0))) < 0) { + return r; + } + return compileFallbackToInterpreterPrimitive(); }
static sqInt @@ -13924,19 +13992,7 @@ static sqInt genPrimitiveNotIdentical(void) { - AbstractInstruction *jumpFalse; - - /* begin CmpR:R: */ - genoperandoperand(CmpRR, Arg0Reg, ReceiverResultReg); - /* begin JumpZero: */ - jumpFalse = genoperand(JumpZero, ((sqInt)0)); - annotateobjRef(gMoveCwR(trueObject(), ReceiverResultReg), trueObject()); - /* begin RetN: */ - genoperand(RetN, 0); - jmpTarget(jumpFalse, annotateobjRef(gMoveCwR(falseObject(), ReceiverResultReg), falseObject())); - /* begin RetN: */ - genoperand(RetN, 0); - return 0; + return genInnerPrimitiveIdenticalorNotIf(0, 1); }
static sqInt @@ -16547,12 +16603,6 @@ }
static sqInt -isHashSetOnInstanceCreation(void) -{ - return 1; -} - -static sqInt isJump(AbstractInstruction * self_in_isJump) { return ((((self_in_isJump->opcode)) >= FirstJump) && (((self_in_isJump->opcode)) <= LastJump));
Modified: branches/Cog/nscogsrc/vm/cogit.h =================================================================== --- branches/Cog/nscogsrc/vm/cogit.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/nscogsrc/vm/cogit.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGenerator VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
Modified: branches/Cog/nscogsrc/vm/cogmethod.h =================================================================== --- branches/Cog/nscogsrc/vm/cogmethod.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/nscogsrc/vm/cogmethod.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGenerator VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
typedef struct {
Modified: branches/Cog/nscogsrc/vm/cointerp.c =================================================================== --- branches/Cog/nscogsrc/vm/cointerp.c 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/nscogsrc/vm/cointerp.c 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 from - CoInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CoInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -2030,7 +2030,7 @@ /* 575 */ (void (*)(void))0, 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.565"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.569"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -4824,6 +4824,7 @@ GIV(framePointer) = localFP; ceEnterCogCodePopReceiverReg(); + null; goto l307; } localIP = pointerForOop(longAt(localFP + FoxIFSavedIP)); @@ -4841,7 +4842,7 @@ /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
- /* return self */ + null; l307: /* end baseFrameReturn */; goto l304; } @@ -5666,7 +5667,6 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), longAt((rcvr + BaseHeaderSize) + (byte3 << ShiftForWord))); } - null; goto l4; } if (opType == 3) { @@ -5676,7 +5676,6 @@ assert(GIV(method) == (iframeMethod(localFP))); object = longAt((GIV(method) + BaseHeaderSize) + ((byte3 + LiteralStart) << ShiftForWord)); longAtPointerput((localSP -= BytesPerOop), object); - null; goto l4; } if (opType == 4) { @@ -5690,7 +5689,6 @@ object2 = longAt((oop + BaseHeaderSize) + (ValueIndex << ShiftForWord)); longAtPointerput((localSP -= BytesPerOop), object2);
- null; goto l4; } top = longAtPointer(localSP);
Modified: branches/Cog/nscogsrc/vm/cointerp.h =================================================================== --- branches/Cog/nscogsrc/vm/cointerp.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/nscogsrc/vm/cointerp.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
Modified: branches/Cog/nscogsrc/vm/gcc3x-cointerp.c =================================================================== --- branches/Cog/nscogsrc/vm/gcc3x-cointerp.c 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/nscogsrc/vm/gcc3x-cointerp.c 2013-12-25 04:06:57 UTC (rev 2836) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 from - CoInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CoInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -2033,7 +2033,7 @@ /* 575 */ (void (*)(void))0, 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.565"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreter_VMMaker.oscog-eem.569"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -4833,6 +4833,7 @@ GIV(framePointer) = localFP; ceEnterCogCodePopReceiverReg(); + null; goto l307; } localIP = pointerForOop(longAt(localFP + FoxIFSavedIP)); @@ -4850,7 +4851,7 @@ /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
- /* return self */ + null; l307: /* end baseFrameReturn */; goto l304; } @@ -5675,7 +5676,6 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), longAt((rcvr + BaseHeaderSize) + (byte3 << ShiftForWord))); } - null; goto l4; } if (opType == 3) { @@ -5685,7 +5685,6 @@ assert(GIV(method) == (iframeMethod(localFP))); object = longAt((GIV(method) + BaseHeaderSize) + ((byte3 + LiteralStart) << ShiftForWord)); longAtPointerput((localSP -= BytesPerOop), object); - null; goto l4; } if (opType == 4) { @@ -5699,7 +5698,6 @@ object2 = longAt((oop + BaseHeaderSize) + (ValueIndex << ShiftForWord)); longAtPointerput((localSP -= BytesPerOop), object2);
- null; goto l4; } top = longAtPointer(localSP);
Modified: branches/Cog/nscogsrc/vm/interp.h =================================================================== --- branches/Cog/nscogsrc/vm/interp.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/nscogsrc/vm/interp.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
#define VM_PROXY_MAJOR 1
Modified: branches/Cog/nscogsrc/vm/vmCallback.h =================================================================== --- branches/Cog/nscogsrc/vm/vmCallback.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/nscogsrc/vm/vmCallback.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
#define VM_CALLBACK_INC 1
Property changes on: branches/Cog/platforms/Cross/vm/sqSCCSVersion.h ___________________________________________________________________ Modified: checkindate - Fri Dec 20 11:19:05 PST 2013 + Tue Dec 24 20:04:40 PST 2013
Modified: branches/Cog/spursrc/vm/cogit.c =================================================================== --- branches/Cog/spursrc/vm/cogit.c 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spursrc/vm/cogit.c 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGenerator VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 from - StackToRegisterMappingCogit VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + StackToRegisterMappingCogit VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 " __DATE__ ; char *__cogitBuildInfo = __buildInfo;
@@ -560,9 +560,11 @@ static AbstractInstruction * genAllocFloatValueintoscratchRegscratchReg(sqInt dpreg, sqInt resultReg, sqInt scratch1, sqInt scratch2); static sqInt genCheckForInterruptsTrampoline(void); static sqInt genConvertCharacterToCodeInReg(sqInt reg); +static void genConvertCharacterToSmallIntegerInReg(sqInt reg); static sqInt genConvertIntegerToCharacterInReg(sqInt reg); static sqInt genConvertIntegerToSmallIntegerInReg(sqInt reg); static sqInt genConvertIntegerToSmallIntegerInScratchReg(sqInt scratchReg); +static void genConvertSmallIntegerToCharacterInReg(sqInt reg); static sqInt genConvertSmallIntegerToIntegerInReg(sqInt reg); static AbstractInstruction * genDivRRQuoRem(AbstractInstruction * self_in_genDivRRQuoRem, sqInt abstractRegDivisor, sqInt abstractRegDividend, sqInt abstractRegQuotient, sqInt abstractRegRemainder); static sqInt genDoubleArithmeticpreOpCheck(sqInt arithmeticOperator, AbstractInstruction *(*preOpCheckOrNil)(int rcvrReg, int argReg)); @@ -610,8 +612,12 @@ static sqInt genGetLeafCallStackPointer(void); static AbstractInstruction * genGetLeafCallStackPointerFunction(AbstractInstruction * self_in_genGetLeafCallStackPointerFunction); static sqInt genInnerPICAbortTrampoline(char *name); +static sqInt genInnerPrimitiveAsCharacterinReg(sqInt retNOffset, sqInt reg); static sqInt genInnerPrimitiveAtPut(sqInt retNoffset); static sqInt genInnerPrimitiveAt(sqInt retNoffset); +static sqInt genInnerPrimitiveCharacterValue(sqInt retNOffset); +static sqInt genInnerPrimitiveIdenticalorNotIf(sqInt retNoffset, sqInt orNot); +static sqInt genInnerPrimitiveIdentityHash(sqInt retNoffset); static sqInt genInnerPrimitiveNewMethod(sqInt retNoffset); static sqInt genInnerPrimitiveNewWithArg(sqInt retNoffset); static sqInt genInnerPrimitiveNew(sqInt retNoffset); @@ -651,6 +657,7 @@ static sqInt genPICMissTrampolineFor(sqInt numArgs); static sqInt genPopStackBytecode(void); static sqInt genPrimitiveAdd(void); +static sqInt genPrimitiveAsCharacter(void); static sqInt genPrimitiveAsFloat(void); static sqInt genPrimitiveAt(void); static sqInt genPrimitiveAtPut(void); @@ -658,6 +665,7 @@ static sqInt genPrimitiveBitOr(void); static sqInt genPrimitiveBitShift(void); static sqInt genPrimitiveBitXor(void); +static sqInt genPrimitiveCharacterValue(void); static sqInt genPrimitiveClass(void); static sqInt genPrimitiveClosureValue(void); static sqInt genPrimitiveDiv(void); @@ -740,6 +748,7 @@ static sqInt genSendTrampolineFornumArgscalledargargarg(void *aRoutine, sqInt numArgs, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2); static sqInt genSendTrampolineFornumArgscalledargargargarg(void *aRoutine, sqInt numArgs, char *aString, sqInt regOrConst0, sqInt regOrConst1, sqInt regOrConst2, sqInt regOrConst3); static sqInt genSendnumArgs(sqInt selector, sqInt numArgs); +static void genSetCharacterTagsIn(sqInt reg); static sqInt genSetSmallIntegerTagsIn(sqInt scratchReg); static sqInt genShiftAwaySmallIntegerTagsInScratchReg(sqInt scratchReg); static sqInt genShortJumpIfFalse(void); @@ -807,7 +816,6 @@ static sqInt isBigEndian(AbstractInstruction * self_in_isBigEndian); static sqInt isBranch(BytecodeDescriptor * self_in_isBranch); static sqInt isCallPreceedingReturnPC(AbstractInstruction * self_in_isCallPreceedingReturnPC, sqInt mcpc); -static sqInt isHashSetOnInstanceCreation(void); static sqInt isJump(AbstractInstruction * self_in_isJump); static sqInt isJumpAt(AbstractInstruction * self_in_isJumpAt, sqInt pc); static sqInt isLongJump(AbstractInstruction * self_in_isLongJump); @@ -897,6 +905,7 @@ static AbstractInstruction * nopsFromto(AbstractInstruction * self_in_nopsFromto, sqInt startAddr, sqInt endAddr); static sqInt noTargetsFreeInClosedPIC(CogMethod *cPIC); static sqInt numberOfSpillsInTopNItems(sqInt n); +static sqInt numCharacterBits(void); static sqInt numCheckFeaturesOpcodes(AbstractInstruction * self_in_numCheckFeaturesOpcodes); static sqInt numICacheFlushOpcodes(AbstractInstruction * self_in_numICacheFlushOpcodes); static sqInt numLowLevelLockOpcodes(AbstractInstruction * self_in_numLowLevelLockOpcodes); @@ -1586,9 +1595,12 @@ { 0, -1, 0 }, { 0, -1, 0 }, { genPrimitiveNotIdentical, 1, 0 }, + { genPrimitiveAsCharacter, -1, 0 }, + { genPrimitiveCharacterValue, 0, 0 }, { 0, -1, 0 }, { 0, -1, 0 }, { 0, -1, 0 }, + { genPrimitiveIdentityHash, 0, 0 }, { 0, -1, 0 }, { 0, -1, 0 }, { 0, -1, 0 }, @@ -1611,9 +1623,6 @@ { 0, -1, 0 }, { 0, -1, 0 }, { 0, -1, 0 }, - { 0, -1, 0 }, - { 0, -1, 0 }, - { 0, -1, 0 }, { genFastPrimFail, -1, 0 }, { genFastPrimFail, -1, 0 }, { 0, -1, 0 }, @@ -9938,6 +9947,20 @@ return 0; }
+ +/* Convert the SmallInteger in reg to a Character, assuming + the SmallInteger's value is a valid character. */ +/* self assume: objectMemory smallIntegerTag = 1 */ + +static void +genConvertCharacterToSmallIntegerInReg(sqInt reg) +{ + assert(((characterTag()) == 2) + && (((numCharacterBits()) + 1) == (numSmallIntegerBits()))); + /* begin LogicalShiftRightCq:R: */ + genoperandoperand(LogicalShiftRightCqR, 1, reg); +} + static sqInt genConvertIntegerToCharacterInReg(sqInt reg) { @@ -9973,6 +9996,20 @@ return 0; }
+ +/* Convert the SmallInteger in reg to a Character, assuming + the SmallInteger's value is a valid character. */ +/* self assume: objectMemory smallIntegerTag = 1 */ + +static void +genConvertSmallIntegerToCharacterInReg(sqInt reg) +{ + assert(((characterTag()) == 2) + && (((numCharacterBits()) + 1) == (numSmallIntegerBits()))); + /* begin LogicalShiftLeftCq:R: */ + genoperandoperand(LogicalShiftLeftCqR, 1, reg); +} + static sqInt genConvertSmallIntegerToIntegerInReg(sqInt reg) { @@ -11351,7 +11388,39 @@ return genTrampolineForcalledcallJumpBarnumArgsargargargargsaveRegsresultRegappendOpcodes(ceMNUFromPICMNUMethodreceiver, name, 1, 2, SendNumArgsReg, ReceiverResultReg, null, null, 0, null, 1); }
+static sqInt +genInnerPrimitiveAsCharacterinReg(sqInt retNOffset, sqInt reg) +{ + AbstractInstruction *jumpNotInt; + AbstractInstruction *jumpOutOfRange;
+ if (reg != ReceiverResultReg) { + /* begin MoveR:R: */ + genoperandoperand(MoveRR, reg, TempReg); + jumpNotInt = genJumpNotSmallIntegerInScratchReg(TempReg); + } + /* begin MoveR:R: */ + genoperandoperand(MoveRR, reg, TempReg); + genConvertSmallIntegerToIntegerInReg(TempReg); + /* begin CmpCq:R: */ + genoperandoperand(CmpCqR, (1 << 30) - 1, TempReg); + /* begin JumpAbove: */ + jumpOutOfRange = genoperand(JumpAbove, ((sqInt)0)); + genConvertSmallIntegerToCharacterInReg(reg); + if (reg != ReceiverResultReg) { + /* begin MoveR:R: */ + genoperandoperand(MoveRR, reg, ReceiverResultReg); + } + /* begin RetN: */ + genoperand(RetN, retNOffset); + jmpTarget(jumpOutOfRange, gLabel()); + if (reg != ReceiverResultReg) { + jmpTarget(jumpNotInt, getJmpTarget(jumpOutOfRange)); + } + return 0; +} + + /* Implement the guts of primitiveAtPut */
static sqInt @@ -11751,7 +11820,74 @@ return 0; }
+static sqInt +genInnerPrimitiveCharacterValue(sqInt retNOffset) +{ + genConvertCharacterToSmallIntegerInReg(ReceiverResultReg); + /* begin RetN: */ + genoperand(RetN, retNOffset); + return 0; +}
+static sqInt +genInnerPrimitiveIdenticalorNotIf(sqInt retNoffset, sqInt orNot) +{ + AbstractInstruction *jumpCmp; + AbstractInstruction *jumpImmediate; + + /* begin MoveR:R: */ + genoperandoperand(MoveRR, Arg0Reg, TempReg); + jumpImmediate = genJumpImmediateInScratchReg(TempReg); + genEnsureObjInRegRegNotForwardedscratchReg(Arg0Reg, TempReg); + jmpTarget(jumpImmediate, gCmpRR(Arg0Reg, ReceiverResultReg)); + jumpCmp = (orNot + ? (/* begin JumpZero: */ + genoperand(JumpZero, ((sqInt)0))) + : (/* begin JumpNonZero: */ + genoperand(JumpNonZero, ((sqInt)0)))); + annotateobjRef(gMoveCwR(trueObject(), ReceiverResultReg), trueObject()); + /* begin RetN: */ + genoperand(RetN, retNoffset); + jmpTarget(jumpCmp, annotateobjRef(gMoveCwR(falseObject(), ReceiverResultReg), falseObject())); + /* begin RetN: */ + genoperand(RetN, retNoffset); + return 0; +} + +static sqInt +genInnerPrimitiveIdentityHash(sqInt retNoffset) +{ + AbstractInstruction *jumpImm; + AbstractInstruction *jumpNotSet; + AbstractInstruction *jumpSI; + AbstractInstruction * ret; + + /* begin MoveR:R: */ + genoperandoperand(MoveRR, ReceiverResultReg, ClassReg); + jumpImm = genJumpImmediateInScratchReg(ClassReg); + genGetHashFieldNonImmOfasSmallIntegerInto(ReceiverResultReg, TempReg); + /* begin CmpCq:R: */ + genoperandoperand(CmpCqR, ConstZero, TempReg); + /* begin JumpZero: */ + jumpNotSet = genoperand(JumpZero, ((sqInt)0)); + /* begin MoveR:R: */ + genoperandoperand(MoveRR, TempReg, ReceiverResultReg); + /* begin RetN: */ + ret = genoperand(RetN, 0); + /* begin MoveR:R: */ + genoperandoperand(MoveRR, ReceiverResultReg, ClassReg); + jumpSI = genJumpSmallIntegerInScratchReg(ClassReg); + jmpTarget(jumpSI, ret); + jmpTarget(jumpImm, gLabel()); + genRemoveSmallIntegerTagsInScratchReg(ReceiverResultReg); + genSetCharacterTagsIn(ReceiverResultReg); + /* begin Jump: */ + genoperand(Jump, ((sqInt)ret)); + jmpTarget(jumpNotSet, gLabel()); + return 0; +} + + /* subclasses override if they can */
static sqInt @@ -13028,6 +13164,23 @@ }
static sqInt +genPrimitiveAsCharacter(void) +{ + sqInt na; + sqInt r; + + na = argumentCountOf(methodObj); + if (na <= 1) { + if (((r = genInnerPrimitiveAsCharacterinReg(0, (na == 0 + ? ReceiverResultReg + : Arg0Reg)))) < 0) { + return r; + } + } + return compileFallbackToInterpreterPrimitive(); +} + +static sqInt genPrimitiveAsFloat(void) { AbstractInstruction *jumpFailAlloc; @@ -13229,7 +13382,18 @@ return 0; }
+static sqInt +genPrimitiveCharacterValue(void) +{ + sqInt r;
+ if (((r = genInnerPrimitiveCharacterValue(0))) < 0) { + return r; + } + return compileFallbackToInterpreterPrimitive(); +} + + /* Depending on argument count the argument is either 0 args: ReceiverResultReg 1 args: Arg0Reg @@ -13523,45 +13687,18 @@ static sqInt genPrimitiveIdentical(void) { - AbstractInstruction *jumpFalse; - - /* begin CmpR:R: */ - genoperandoperand(CmpRR, Arg0Reg, ReceiverResultReg); - /* begin JumpNonZero: */ - jumpFalse = genoperand(JumpNonZero, ((sqInt)0)); - annotateobjRef(gMoveCwR(trueObject(), ReceiverResultReg), trueObject()); - /* begin RetN: */ - genoperand(RetN, 0); - jmpTarget(jumpFalse, annotateobjRef(gMoveCwR(falseObject(), ReceiverResultReg), falseObject())); - /* begin RetN: */ - genoperand(RetN, 0); - return 0; + return genInnerPrimitiveIdenticalorNotIf(0, 0); }
static sqInt genPrimitiveIdentityHash(void) { - AbstractInstruction *jumpNotSet; - AbstractInstruction *jumpSI; + sqInt r;
- /* begin MoveR:R: */ - genoperandoperand(MoveRR, ReceiverResultReg, ClassReg); - jumpSI = genJumpSmallIntegerInScratchReg(ClassReg); - genGetHashFieldNonImmOfasSmallIntegerInto(ReceiverResultReg, TempReg); - /* begin CmpCq:R: */ - genoperandoperand(CmpCqR, ConstZero, TempReg); - /* begin JumpZero: */ - jumpNotSet = genoperand(JumpZero, ((sqInt)0)); - - /* begin MoveR:R: */ - genoperandoperand(MoveRR, TempReg, ReceiverResultReg); - /* begin RetN: */ - genoperand(RetN, 0); - jmpTarget(jumpNotSet, gLabel()); - compileFallbackToInterpreterPrimitive(); - - jmpTarget(jumpSI, gLabel()); - return 0; + if (((r = genInnerPrimitiveIdentityHash(0))) < 0) { + return r; + } + return compileFallbackToInterpreterPrimitive(); }
static sqInt @@ -13701,19 +13838,7 @@ static sqInt genPrimitiveNotIdentical(void) { - AbstractInstruction *jumpFalse; - - /* begin CmpR:R: */ - genoperandoperand(CmpRR, Arg0Reg, ReceiverResultReg); - /* begin JumpZero: */ - jumpFalse = genoperand(JumpZero, ((sqInt)0)); - annotateobjRef(gMoveCwR(trueObject(), ReceiverResultReg), trueObject()); - /* begin RetN: */ - genoperand(RetN, 0); - jmpTarget(jumpFalse, annotateobjRef(gMoveCwR(falseObject(), ReceiverResultReg), falseObject())); - /* begin RetN: */ - genoperand(RetN, 0); - return 0; + return genInnerPrimitiveIdenticalorNotIf(0, 1); }
static sqInt @@ -14565,6 +14690,16 @@ return genMarshalledSendnumArgs(selector, numArgs); }
+static void +genSetCharacterTagsIn(sqInt reg) +{ + sqInt quickConstant; + + /* begin OrCq:R: */ + quickConstant = characterTag(); + genoperandoperand(OrCqR, quickConstant, reg); +} + static sqInt genSetSmallIntegerTagsIn(sqInt scratchReg) { @@ -15633,29 +15768,33 @@ 1 & 3 collapsed to 1 for SmallIntegers, and 2 collapsed to 0 for Characters), or the receiver's classIndex. Generate something like this: + Limm: + andl $0x1, rDest + j Lcmp Lentry: movl rSource, rDest andl $0x3, rDest - jz LnotImm - andl $1, rDest - j Lcmp - LnotImm: + jnz Limm movl 0(%edx), rDest andl $0x3fffff, rDest Lcmp: - At least on a 2.2GHz Intel Core i7 it is slightly faster, - 136m sends/sec vs 130m sends/sec for nfib in tinyBenchmarks, than - Limm: - andl $0x1, rDest - j Lcmp + At least on a 2.2GHz Intel Core i7 the following is slightly faster than + the above, + 136m sends/sec vs 130m sends/sec for nfib in tinyBenchmarks Lentry: movl rSource, rDest andl $0x3, rDest - jnz Limm + jz LnotImm + andl $1, rDest + j Lcmp + LnotImm: movl 0(%edx), rDest andl $0x3fffff, rDest Lcmp: - */ + But we expect most SMallInteger arithmetic to be performwd in-line and so + prefer the + version that is faster for non-immediates (because it branches for + immediates only). */
static AbstractInstruction * getInlineCacheClassTagFrominto(sqInt sourceReg, sqInt destReg) @@ -15669,23 +15808,31 @@ sqInt quickConstant2;
/* begin AlignmentNops: */ - genoperand(AlignmentNops, ((BytesPerWord < 8) ? 8 : BytesPerWord)); + genoperand(AlignmentNops, BytesPerWord); /* begin Label */ + immLabel = genoperandoperand(Label, (labelCounter += 1), bytecodePC); + /* begin AndCq:R: */ + genoperandoperand(AndCqR, 1, destReg); + /* begin Jump: */ + jumpCompare = genoperand(Jump, ((sqInt)0)); + /* begin AlignmentNops: */ + genoperand(AlignmentNops, BytesPerWord); + /* begin Label */ entryLabel = genoperandoperand(Label, (labelCounter += 1), bytecodePC); /* begin MoveR:R: */ genoperandoperand(MoveRR, sourceReg, destReg); /* begin AndCq:R: */ - quickConstant = tagMask(); - genoperandoperand(AndCqR, quickConstant, destReg); - /* begin JumpZero: */ - jumpNotImm = genoperand(JumpZero, ((sqInt)0)); + quickConstant1 = tagMask(); + genoperandoperand(AndCqR, quickConstant1, destReg); + /* begin JumpNonZero: */ + genoperand(JumpNonZero, ((sqInt)immLabel)); + flag("endianness"); + /* begin MoveMw:r:R: */ + genoperandoperandoperand(MoveMwrR, 0, sourceReg, destReg); /* begin AndCq:R: */ - genoperandoperand(AndCqR, 1, destReg); - /* begin Jump: */ - jumpCompare = genoperand(Jump, ((sqInt)0)); - flag("endianness"); - jmpTarget(jumpNotImm, gMoveMwrR(0, sourceReg, destReg)); - jmpTarget(jumpCompare, gAndCqR(classIndexMask(), destReg)); + quickConstant2 = classIndexMask(); + genoperandoperand(AndCqR, quickConstant2, destReg); + jmpTarget(jumpCompare, gLabel());
return entryLabel; } @@ -16214,12 +16361,6 @@ }
static sqInt -isHashSetOnInstanceCreation(void) -{ - return 0; -} - -static sqInt isJump(AbstractInstruction * self_in_isJump) { return ((((self_in_isJump->opcode)) >= FirstJump) && (((self_in_isJump->opcode)) <= LastJump)); @@ -17915,7 +18056,13 @@ return 0; }
+static sqInt +numCharacterBits(void) +{ + return 30; +}
+ /* Answer the number of opcodes required to compile the CPUID call to extract the extended features information. */
Modified: branches/Cog/spursrc/vm/cogit.h =================================================================== --- branches/Cog/spursrc/vm/cogit.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spursrc/vm/cogit.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGenerator VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
Modified: branches/Cog/spursrc/vm/cogmethod.h =================================================================== --- branches/Cog/spursrc/vm/cogmethod.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spursrc/vm/cogmethod.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGenerator VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
typedef struct {
Modified: branches/Cog/spursrc/vm/cointerp.c =================================================================== --- branches/Cog/spursrc/vm/cointerp.c 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spursrc/vm/cointerp.c 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 from - CoInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CoInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -2162,7 +2162,7 @@ 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); usqInt heapBase; -const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.565]"; +const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.569]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -6363,6 +6363,7 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), longAt((rcvr1 + (BaseHeaderSize)) + (byte3 << 2))); } + null; goto l4; } if (opType == 3) { @@ -6372,6 +6373,7 @@ assert(GIV(method) == (iframeMethod(localFP))); object = longAt((GIV(method) + (BaseHeaderSize)) + ((byte3 + LiteralStart) << 2)); longAtPointerput((localSP -= BytesPerOop), object); + null; goto l4; } if (opType == 4) { @@ -6399,6 +6401,7 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), longAt((litVar1 + (BaseHeaderSize)) + (ValueIndex << 2)));
+ null; goto l4; } top = longAtPointer(localSP); @@ -26020,8 +26023,7 @@ sqInt isCharacterValue(sqInt anInteger) { - return (anInteger >= 0) - && (anInteger < (pow(2,30))); + return ((anInteger >= 0) && (anInteger <= ((1 << 30) - 1))); }
sqInt @@ -32348,8 +32350,7 @@ characterCode = longAt(GIV(stackPointer)); if (!(((characterCode & 1)) && (((characterCode = (characterCode >> 1)), - (characterCode >= 0) - && (characterCode < (pow(2,30))))))) { + ((characterCode >= 0) && (characterCode <= ((1 << 30) - 1))))))) { /* begin primitiveFailFor: */ reasonCode = (GIV(argumentCount) == 0 ? PrimErrBadReceiver
Modified: branches/Cog/spursrc/vm/cointerp.h =================================================================== --- branches/Cog/spursrc/vm/cointerp.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spursrc/vm/cointerp.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
Modified: branches/Cog/spursrc/vm/gcc3x-cointerp.c =================================================================== --- branches/Cog/spursrc/vm/gcc3x-cointerp.c 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spursrc/vm/gcc3x-cointerp.c 2013-12-25 04:06:57 UTC (rev 2836) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 from - CoInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CoInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -2165,7 +2165,7 @@ 0 }; static void (*externalPrimitiveTable[MaxExternalPrimitiveTableSize + 1 /* 4097 */])(void); usqInt heapBase; -const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.565]"; +const char *interpreterVersion = "Croquet Closure Cog VM [CoInterpreter VMMaker.oscog-eem.569]"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 10 */; volatile int sendTrace;
@@ -6372,6 +6372,7 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), longAt((rcvr1 + (BaseHeaderSize)) + (byte3 << 2))); } + null; goto l4; } if (opType == 3) { @@ -6381,6 +6382,7 @@ assert(GIV(method) == (iframeMethod(localFP))); object = longAt((GIV(method) + (BaseHeaderSize)) + ((byte3 + LiteralStart) << 2)); longAtPointerput((localSP -= BytesPerOop), object); + null; goto l4; } if (opType == 4) { @@ -6408,6 +6410,7 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), longAt((litVar1 + (BaseHeaderSize)) + (ValueIndex << 2)));
+ null; goto l4; } top = longAtPointer(localSP); @@ -26029,8 +26032,7 @@ sqInt isCharacterValue(sqInt anInteger) { - return (anInteger >= 0) - && (anInteger < (pow(2,30))); + return ((anInteger >= 0) && (anInteger <= ((1 << 30) - 1))); }
sqInt @@ -32357,8 +32359,7 @@ characterCode = longAt(GIV(stackPointer)); if (!(((characterCode & 1)) && (((characterCode = (characterCode >> 1)), - (characterCode >= 0) - && (characterCode < (pow(2,30))))))) { + ((characterCode >= 0) && (characterCode <= ((1 << 30) - 1))))))) { /* begin primitiveFailFor: */ reasonCode = (GIV(argumentCount) == 0 ? PrimErrBadReceiver
Modified: branches/Cog/spursrc/vm/interp.h =================================================================== --- branches/Cog/spursrc/vm/interp.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spursrc/vm/interp.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
#define VM_PROXY_MAJOR 1
Modified: branches/Cog/spursrc/vm/vmCallback.h =================================================================== --- branches/Cog/spursrc/vm/vmCallback.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spursrc/vm/vmCallback.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
#define VM_CALLBACK_INC 1
Modified: branches/Cog/spurstacksrc/vm/gcc3x-interp.c =================================================================== --- branches/Cog/spurstacksrc/vm/gcc3x-interp.c 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spurstacksrc/vm/gcc3x-interp.c 2013-12-25 04:06:57 UTC (rev 2836) @@ -2,11 +2,11 @@
/* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 from - StackInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + StackInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -1955,7 +1955,7 @@ 0 }; char * breakSelector; sqInt breakSelectorLength = -1; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreter VMMaker.oscog-eem.565]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreter VMMaker.oscog-eem.569]"; volatile int sendTrace; sqInt suppressHeartbeatFlag;
@@ -23370,8 +23370,7 @@ sqInt isCharacterValue(sqInt anInteger) { - return (anInteger >= 0) - && (anInteger < (pow(2,30))); + return ((anInteger >= 0) && (anInteger <= ((1 << 30) - 1))); }
@@ -28857,8 +28856,7 @@ characterCode = longAt(GIV(stackPointer)); if (!(((characterCode & 1)) && (((characterCode = (characterCode >> 1)), - (characterCode >= 0) - && (characterCode < (pow(2,30))))))) { + ((characterCode >= 0) && (characterCode <= ((1 << 30) - 1))))))) { /* begin primitiveFailFor: */ reasonCode = (GIV(argumentCount) == 0 ? PrimErrBadReceiver
Modified: branches/Cog/spurstacksrc/vm/interp.c =================================================================== --- branches/Cog/spurstacksrc/vm/interp.c 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spurstacksrc/vm/interp.c 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 from - StackInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + StackInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */ -static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 " __DATE__ ; +static char __buildInfo[] = "StackInterpreter VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -1952,7 +1952,7 @@ 0 }; char * breakSelector; sqInt breakSelectorLength = -1; -const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreter VMMaker.oscog-eem.565]"; +const char *interpreterVersion = "Croquet Closure Stack VM [StackInterpreter VMMaker.oscog-eem.569]"; volatile int sendTrace; sqInt suppressHeartbeatFlag;
@@ -23361,8 +23361,7 @@ sqInt isCharacterValue(sqInt anInteger) { - return (anInteger >= 0) - && (anInteger < (pow(2,30))); + return ((anInteger >= 0) && (anInteger <= ((1 << 30) - 1))); }
@@ -28848,8 +28847,7 @@ characterCode = longAt(GIV(stackPointer)); if (!(((characterCode & 1)) && (((characterCode = (characterCode >> 1)), - (characterCode >= 0) - && (characterCode < (pow(2,30))))))) { + ((characterCode >= 0) && (characterCode <= ((1 << 30) - 1))))))) { /* begin primitiveFailFor: */ reasonCode = (GIV(argumentCount) == 0 ? PrimErrBadReceiver
Modified: branches/Cog/spurstacksrc/vm/interp.h =================================================================== --- branches/Cog/spurstacksrc/vm/interp.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spurstacksrc/vm/interp.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
#define VM_PROXY_MAJOR 1
Modified: branches/Cog/spurstacksrc/vm/vmCallback.h =================================================================== --- branches/Cog/spurstacksrc/vm/vmCallback.h 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/spurstacksrc/vm/vmCallback.h 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */
#define VM_CALLBACK_INC 1
Modified: branches/Cog/src/plugins/BitBltPlugin/BitBltPlugin.c =================================================================== --- branches/Cog/src/plugins/BitBltPlugin/BitBltPlugin.c 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/src/plugins/BitBltPlugin/BitBltPlugin.c 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,9 +1,9 @@ /* Automatically generated by - SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.554 uuid: a666e7e4-245e-4e8a-9536-3aefd4509f47 + SmartSyntaxPluginCodeGenerator VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 from - BitBltSimulation VMMaker.oscog-eem.554 uuid: a666e7e4-245e-4e8a-9536-3aefd4509f47 + BitBltSimulation VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */ -static char __buildInfo[] = "BitBltSimulation VMMaker.oscog-eem.554 uuid: a666e7e4-245e-4e8a-9536-3aefd4509f47 " __DATE__ ; +static char __buildInfo[] = "BitBltSimulation VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 " __DATE__ ;
@@ -344,9 +344,9 @@ }; static const char *moduleName = #ifdef SQUEAK_BUILTIN_PLUGIN - "BitBltPlugin VMMaker.oscog-eem.554 (i)" + "BitBltPlugin VMMaker.oscog-eem.569 (i)" #else - "BitBltPlugin VMMaker.oscog-eem.554 (e)" + "BitBltPlugin VMMaker.oscog-eem.569 (e)" #endif ; static sqInt noHalftone; @@ -5424,6 +5424,7 @@ primitivePixelValueAt(void) { sqInt bitmap; + sqInt bitsSize; sqInt depth; sqInt mask; sqInt pixel; @@ -5458,6 +5459,10 @@ return null; } bitmap = fetchPointerofObject(FormBitsIndex, rcvr); + if (!(isWordsOrBytes(bitmap))) { + primitiveFail(); + return null; + } width = fetchIntegerofObject(FormWidthIndex, rcvr); height = fetchIntegerofObject(FormHeightIndex, rcvr);
@@ -5485,10 +5490,18 @@
ppW = 32 / depth;
- /* how many words per rox of pixels */ + /* how many words per row of pixels */
stride = (width + (ppW - 1)) / ppW; + bitsSize = byteSizeOf(bitmap); + if (!(bitsSize == ((stride * height) * 4))) {
+ /* bytes per word */ + + primitiveFail(); + return null; + } + /* load the word that contains our target */
word = fetchLong32ofObject((yVal * stride) + (xVal / ppW), bitmap);
Modified: branches/Cog/src/vm/cogit.c =================================================================== --- branches/Cog/src/vm/cogit.c 2013-12-21 17:06:08 UTC (rev 2835) +++ branches/Cog/src/vm/cogit.c 2013-12-25 04:06:57 UTC (rev 2836) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + CCodeGenerator VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 from - StackToRegisterMappingCogit VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 + StackToRegisterMappingCogit VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.565 uuid: aa89a317-26e5-404d-aaff-e2433a344379 " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.569 uuid: 84f8b41f-92bf-41d2-9927-6c7e3d3e4272 " __DATE__ ; char *__cogitBuildInfo = __buildInfo;
@@ -617,8 +617,12 @@ static sqInt genGetLeafCallStackPointer(void); static AbstractInstruction * genGetLeafCallStackPointerFunction(AbstractInstruction * self_in_genGetLeafCallStackPointerFunction); static sqInt genInnerPICAbortTrampoline(char *name); +static sqInt genInnerPrimitiveAsCharacterinReg(sqInt retNOffset, sqInt reg); static sqInt genInnerPrimitiveAtPut(sqInt retNoffset);
@@ Diff output truncated at 50000 characters. @@
vm-dev@lists.squeakfoundation.org