Revision: 3687 Author: eliot Date: 2016-04-27 15:35:21 -0700 (Wed, 27 Apr 2016) Log Message: ----------- CogVM source as per VMMaker.oscog-eem.1849
General: Change signature of oopForPointer to eliminate compiler warnings.
Fix a bad bug in primitiveVoidVMStateForMethod. One might think that the heap scan is unnecessary if the method does not have a cog method. But it could be the case that the code zone has recently been reclaimed and so not having a cog method is no indication that it didn't have a cog method some time in the recent past, and that there are indeed still contexts with machine code pcs out there.
Refactor flushExternalPrimitiveOf: and callers to eliminate duplication; moving the primitive number test into flushExternalPrimitiveOf:.
Side-step inlining for bereaveAllMarriedContextsForSnapshotFlushingExternalPrimitivesIf: to reduce duplication in Spur's allObjectsDo: (which unrolls its argument three times).
Debugging: Add printContextReferencesTo: & printActivationsOf: and have them print the pcs of the contexts they find.
Eliminate duplication in [directed]SuperclassSend.
Change overflow tests in precondition rather than postcondition for small integer multiplication. Because integer overflow is undefined behaviour, and because we can't rely on undefined behaviour, the compiler has a license to eliminate the post-condition as dead code (at least since iso c89 acception). Post-condition currently works because we use -fwrapv compiler flag, but relying on specific compiler flags is bad practice in the long term.
Fix regression in signed 32bit long access (introduced beginning of April). One symptom is: (Alien newGC: 4) signedLongAt: 1 put: -16r7287E552; signedLongAt: 1
Fix positive32BitIntegerFor: for Spur64 which did work only because the constant was generated ULL.
Cogit: Reorder annotation constants to simplify isPCMappedAnnotation:.
Fix regression in VMMaker.oscog-eem.1823 when merging the two map enumerators into one that affects Sista. The merged enumerator must extend IsSendAnnotations with the AnnotationExtension.
Inline label maintennance funcs.
Susta Cogit: Added a primitive to answer all the methods present in the machine code zone.
allMachineCodeMethods <primitive: 'primitiveAllMethodsCompiledToMachineCode' module:''> ^#()
Slang: Extend type inference capabilities from the AST. Unify type inference used to #inferReturnTypeFromReturnsIn: with that based on AST. Now that type inference is a bit more thorough, release type restrictions in #isFunctional in order to obtain much more aggressive inlining. With those, a gain of 10% is possible on the LargeIntegersPlugin dominated bench:
Use a type inference that better fits C rules (C99 standard section 6.3): - in (float op int), int is promoted to double not float - in (unsigned short op short) both operands are promoted to #int due to int promotion rules.
Use minimum generality for generated integer constants: - use int if variable fits in int - else unsigned int - else long long (long would be enough for 64bits versions, but long long works for both 32 and 64) - else unsigned long long This is to avoid spurious unsigned promotion due to improved type inference.
Protect #pathTo:followWeak: which can currently only work with a signed int, from possibly future spurious unsigned inference (I didn't bissect at which stage exactly this happens, but it happened).
A few minor changes to eliminate C compiler warnings.
Mac OS X: Fix argument processing, so that e.g. myvm -breaksel aSelector my.image works (but -headless still fails).
Modified Paths: -------------- branches/Cog/nsspur64src/vm/cogit.h branches/Cog/nsspur64src/vm/cogitX64.c branches/Cog/nsspur64src/vm/cointerp.c branches/Cog/nsspur64src/vm/cointerp.h branches/Cog/nsspur64src/vm/gcc3x-cointerp.c 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/platforms/Cross/vm/sqMemoryAccess.h branches/Cog/platforms/iOS/vm/OSX/sqSqueakOSXApplication.m branches/Cog/scripts/uploadvms 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/nsspur64src/vm/cogit.h =================================================================== --- branches/Cog/nsspur64src/vm/cogit.h 2016-04-27 15:01:30 UTC (rev 3686) +++ branches/Cog/nsspur64src/vm/cogit.h 2016-04-27 22:35:21 UTC (rev 3687) @@ -1,5 +1,5 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.1834 uuid: 858a9c54-959b-4d7e-b9b3-5f083d37f488 + CCodeGenerator VMMaker.oscog-eem.1849 uuid: d65892b1-b636-442a-affd-36ef8f9abcd1 */
@@ -73,6 +73,8 @@ extern void addAllToYoungReferrers(void); extern void freeMethod(CogMethod *cogMethod); extern CogMethod * methodFor(void *address); +extern sqInt methodsCompiledToMachineCodeInto(sqInt arrayObj); +extern sqInt numMethods(void); extern sqInt numMethodsOfType(sqInt cogMethodType); extern void printCogMethods(void); extern void printCogMethodsOfType(sqInt cmType);
Modified: branches/Cog/nsspur64src/vm/cogitX64.c =================================================================== --- branches/Cog/nsspur64src/vm/cogitX64.c 2016-04-27 15:01:30 UTC (rev 3686) +++ branches/Cog/nsspur64src/vm/cogitX64.c 2016-04-27 22:35:21 UTC (rev 3687) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGenerator VMMaker.oscog-eem.1832 uuid: 3e4d6e88-f60d-4a01-930d-7c5895b8a86a + CCodeGenerator VMMaker.oscog-eem.1849 uuid: d65892b1-b636-442a-affd-36ef8f9abcd1 from - StackToRegisterMappingCogit VMMaker.oscog-eem.1832 uuid: 3e4d6e88-f60d-4a01-930d-7c5895b8a86a + StackToRegisterMappingCogit VMMaker.oscog-eem.1849 uuid: d65892b1-b636-442a-affd-36ef8f9abcd1 */ -static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1832 uuid: 3e4d6e88-f60d-4a01-930d-7c5895b8a86a " __DATE__ ; +static char __buildInfo[] = "StackToRegisterMappingCogit VMMaker.oscog-eem.1849 uuid: d65892b1-b636-442a-affd-36ef8f9abcd1 " __DATE__ ; char *__cogitBuildInfo = __buildInfo;
@@ -102,7 +102,7 @@ #define GCModeBecome 8 #define GCModeFull 1 #define GCModeNewSpace 2 -#define HasBytecodePC 4 +#define HasBytecodePC 5 #define HeaderIndex 0 #define IDIVR 117 #if !defined(IMMUTABILITY) /* Allow this to be overridden on the compiler command line */ @@ -121,7 +121,7 @@ #define IsNSSelfSend 10 #define IsNSSendCall 6 #define IsObjectReference 2 -#define IsRelativeCall 5 +#define IsRelativeCall 4 #define IsSendCall 7 #define IsSuperSend 8 #define Jump 15 @@ -431,7 +431,6 @@ static AbstractInstruction * NoDbgRegParms relocateJumpLongConditionalBeforeFollowingAddressby(AbstractInstruction * self_in_relocateJumpLongConditionalBeforeFollowingAddressby, sqInt pc, sqInt delta); static AbstractInstruction * NoDbgRegParms resolveJumpTarget(AbstractInstruction * self_in_resolveJumpTarget); static sqInt NoDbgRegParms rewriteConditionalJumpLongAttarget(AbstractInstruction * self_in_rewriteConditionalJumpLongAttarget, sqInt callSiteReturnAddress, sqInt callTargetAddress); -static sqInt NoDbgRegParms setLabelOffset(AbstractInstruction * self_in_setLabelOffset, sqInt aValue); static AbstractInstruction * NoDbgRegParms updateLabel(AbstractInstruction * self_in_updateLabel, AbstractInstruction *labelInstruction); static sqInt NoDbgRegParms wantsNearAddressFor(AbstractInstruction * self_in_wantsNearAddressFor, sqInt anObject); static CogMethod * NoDbgRegParms cmHomeMethod(CogBlockMethod * self_in_cmHomeMethod); @@ -515,7 +514,7 @@ static sqInt NoDbgRegParms configureMNUCPICmethodOperandnumArgsdelta(CogMethod *cPIC, sqInt methodOperand, sqInt numArgs, sqInt addrDelta); static sqInt NoDbgRegParms cPICHasForwardedClass(CogMethod *cPIC); static sqInt NoDbgRegParms cPICHasFreedTargets(CogMethod *cPIC); -static sqInt cPICPrototypeCaseOffset(void); +static usqInt cPICPrototypeCaseOffset(void); static sqInt NoDbgRegParms cPICHasTarget(CogMethod *cPIC, CogMethod *targetMethod); static AbstractInstruction * NoDbgRegParms gDivRRQuoRem(sqInt rDivisor, sqInt rDividend, sqInt rQuotient, sqInt rRemainder); extern sqInt defaultCogCodeSize(void); @@ -532,7 +531,7 @@ static sqInt NoDbgRegParms findMapLocationForMcpcinMethod(sqInt targetMcpc, CogMethod *cogMethod); extern CogBlockMethod * findMethodForStartBcpcinHomeMethod(sqInt startbcpc, CogMethod *cogMethod); static sqInt NoDbgRegParms findIsBackwardBranchMcpcBcpcMatchingMcpc(BytecodeDescriptor *descriptor, sqInt isBackwardBranchAndAnnotation, char *mcpc, sqInt bcpc, void *targetMcpc); -static sqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); +static usqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod); extern void followForwardedLiteralsIn(CogMethod *cogMethod); extern void followForwardedMethods(void); static sqInt NoDbgRegParms followMaybeObjRefInClosedPICAt(sqInt mcpc); @@ -642,7 +641,6 @@ extern sqInt patchToOpenPICFornumArgsreceiver(sqInt selector, sqInt numArgs, sqInt receiver); static sqInt picAbortDiscriminatorValue(void); static sqInt picInterpretAbortOffset(void); -static void preenMethodLabel(void); static AbstractInstruction * previousInstruction(void); extern void printCogMethodFor(void *address); extern void printPCMapPairsFor(CogMethod *cogMethod); @@ -702,7 +700,8 @@ static sqInt kosherYoungReferrers(void); static void NoDbgRegParms manageFromto(sqInt theStartAddress, sqInt theLimitAddress); extern CogMethod * methodFor(void *address); -static sqInt numMethods(void); +extern sqInt methodsCompiledToMachineCodeInto(sqInt arrayObj); +extern sqInt numMethods(void); extern sqInt numMethodsOfType(sqInt cogMethodType); static sqInt NoDbgRegParms occurrencesInYoungReferrers(CogMethod *cogMethod); static CogMethod * NoDbgRegParms openPICWithSelector(sqInt aSelector); @@ -2162,19 +2161,6 @@ }
-/* Hack: To arrange that the block method field pushed in a block entry has - its MFMethodFlagIsBlockFlag bit set we provide labels with an offset. The - offset for the fakeHeader reference is MFMethodFlagIsBlockFlag. See - compileBlockFrameBuild: */ - - /* CogAbstractInstruction>>#setLabelOffset: */ -static sqInt NoDbgRegParms -setLabelOffset(AbstractInstruction * self_in_setLabelOffset, sqInt aValue) -{ - return ((self_in_setLabelOffset->operands))[1] = aValue; -} - - /* Update an instruction that depends on a label outside of generated code (e.g. a method or block header). */
@@ -2902,9 +2888,12 @@ if (mapByte >= FirstAnnotation) { annotation = ((usqInt) mapByte) >> AnnotationShift; mcpc1 += (mapByte & DisplacementMask); - if ((annotation >= IsSendCall) - || ((annotation == HasBytecodePC) - || (annotation == IsNSSendCall))) { + if (annotation >= HasBytecodePC) { + if ((annotation == IsSendCall) + && ((((usqInt) ((mapByte = byteAt(map - 1)))) >> AnnotationShift) == IsAnnotationExtension)) { + annotation += mapByte & DisplacementMask; + map -= 1; + } while (1) { byte = (fetchByteofObject(bcpc, aMethodObj)) + bsOffset; descriptor = generatorAt(byte); @@ -3680,7 +3669,7 @@ closedPICRefersToUnmarkedObject(CogMethod *cPIC) { sqInt i; - usqInt object; + sqInt object; sqInt pc;
if (!((isImmediate((cPIC->selector))) @@ -3842,7 +3831,7 @@ { sqInt address; sqInt operand; - sqInt target; + unsigned long target;
compilationBreakpointisMNUCase((cPIC->selector), numBytesOf((cPIC->selector)), isMNUCase); assert(!(inlineCacheTagIsYoung(caseNTag))); @@ -4027,9 +4016,9 @@ { sqInt codeSize; sqInt end; - sqInt fixupSize; + unsigned long fixupSize; sqInt mapSize; - sqInt opcodeSize; + unsigned long opcodeSize; CogMethod *pic; sqInt startAddress;
@@ -4154,6 +4143,7 @@ return cogMethod; } if ((methodClassAssociationOf(aMethodObj)) != (nilObject())) { + extern void *firstIndexableField(sqInt); /* begin warnMultiple:selectors: */ fprintf(stderr, "Warning, attempt to use method with selector %.*s and selector %.*s\n", ((int) (numBytesOf((cogMethod->selector)))), ((char *) (firstIndexableField((cogMethod->selector)))), numBytesOf(aSelectorOop), ((char *) (firstIndexableField(aSelectorOop)))); return null; @@ -4379,11 +4369,12 @@ AbstractInstruction *anInstruction7; sqInt callTarget; const int cStackAlignment = STACK_ALIGN_BYTES; - sqInt delta; + usqInt delta; usqInt numRegsPushed; + sqInt quickConstant; usqInt regMaskCopy; sqInt regsToSave; - sqInt wordsPushedModAlignment; + usqInt wordsPushedModAlignment;
regsToSave = (resultRegOrNone == NoReg ? regMask @@ -4404,7 +4395,9 @@ if (wordsPushedModAlignment != 0) { delta = (cStackAlignment / BytesPerWord) - wordsPushedModAlignment; /* begin SubCq:R: */ - anInstruction = genoperandoperand(SubCqR, delta * BytesPerWord, SPReg); + quickConstant = delta * BytesPerWord; + /* begin gen:quickConstant:operand: */ + anInstruction = genoperandoperand(SubCqR, quickConstant, SPReg); } l1: /* end genAlignCStackSavingRegisters:numArgs:wordAlignment: */; } @@ -4644,8 +4637,8 @@ { sqInt checkedEntryAlignment; sqInt entryPointMask; - sqInt fixupSize; - sqInt opcodeSize; + unsigned long fixupSize; + unsigned long opcodeSize; AbstractInstruction *sendMissCall; sqInt uncheckedEntryAlignment;
@@ -4742,7 +4735,7 @@ sqInt jumpTargetAddress; sqInt operand; sqInt pc; - sqInt targetEntry; + unsigned long targetEntry;
assert(case1Method != null); rewriteCallAttarget(backEnd, (((sqInt)cPIC)) + missOffset, picAbortTrampolineFor(numArgs)); @@ -4891,7 +4884,7 @@ */
/* Cogit>>#cPICPrototypeCaseOffset */ -static sqInt +static usqInt cPICPrototypeCaseOffset(void) { return ((methodZoneBase + (youngReferrers())) / 2) - 13262352; @@ -4972,7 +4965,7 @@ sqInt byte; BytecodeDescriptor *descriptor; sqInt distance; - sqInt end; + usqInt end; sqInt latestContinuation; sqInt nExts; sqInt pc; @@ -5073,27 +5066,27 @@ } classTagPC = pc - (jumpLongConditionalByteSize(backEnd)); classTag = literal32BeforeFollowingAddress(backEnd, classTagPC); - if (!(asserta(classTag == (3133021973ULL + i)))) { + if (!(asserta(classTag == (3133021973U + i)))) { errors = errors | 8; } entryPoint = jumpLongTargetBeforeFollowingAddress(backEnd, pc); if (!(asserta(entryPoint == (((cPICPrototypeCaseOffset()) + 13262352) + (i * 16))))) { errors = errors | 16; } - rewriteCPICCaseAttagobjReftarget(pc, classTag ^ 1515870810, object ^ 2779096485ULL, entryPoint ^ 5614160); + rewriteCPICCaseAttagobjReftarget(pc, classTag ^ 1515870810, object ^ 2779096485U, entryPoint ^ 5614160); object = literalBeforeFollowingAddress(backEnd, methodObjPC); - if (!(asserta(object == ((195929424 + i) ^ 2779096485ULL)))) { + if (!(asserta(object == ((195929424 + i) ^ 2779096485U)))) { errors = errors | 32; } classTag = literal32BeforeFollowingAddress(backEnd, classTagPC); - if (!(asserta(classTag == ((3133021973ULL + i) ^ 1515870810)))) { + if (!(asserta(classTag == ((3133021973U + i) ^ 1515870810)))) { errors = errors | 64; } entryPoint = jumpLongTargetBeforeFollowingAddress(backEnd, pc); if (!(asserta(entryPoint == ((((cPICPrototypeCaseOffset()) + 13262352) + (i * 16)) ^ 5614160)))) { errors = errors | 128; } - rewriteCPICCaseAttagobjReftarget(pc, classTag ^ 1515870810, object ^ 2779096485ULL, entryPoint ^ 5614160); + rewriteCPICCaseAttagobjReftarget(pc, classTag ^ 1515870810, object ^ 2779096485U, entryPoint ^ 5614160); } entryPoint = jumpLongTargetBeforeFollowingAddress(backEnd, (pc + cPICEndSize)); if (!(asserta(entryPoint == (cPICMissTrampolineFor(0))))) { @@ -5245,7 +5238,7 @@ findMapLocationForMcpcinMethod(sqInt targetMcpc, CogMethod *cogMethod) { sqInt annotation; - sqInt map; + usqInt map; sqInt mapByte; sqInt mcpc;
@@ -5316,7 +5309,7 @@ }
/* Cogit>>#firstMappedPCFor: */ -static sqInt NoDbgRegParms +static usqInt NoDbgRegParms firstMappedPCFor(CogMethod *cogMethod) { return (0 @@ -5329,9 +5322,9 @@ followForwardedLiteralsIn(CogMethod *cogMethod) { sqInt annotation; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqInt result;
assert((((cogMethod->cmType)) != CMMethod) @@ -5657,8 +5650,8 @@ AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; AbstractInstruction *anInstruction3; - sqInt fixupSize; - sqInt opcodeSize; + unsigned long fixupSize; + unsigned long opcodeSize; sqInt quickConstant; sqInt quickConstant1; sqInt startAddress; @@ -5728,7 +5721,7 @@ AbstractInstruction * cPICEndOfCodeLabel; sqInt endAddress; AbstractInstruction * endCPICCase1; - sqInt fixupSize; + unsigned long fixupSize; sqInt h; AbstractInstruction *jumpNext; sqInt jumpTarget; @@ -5737,7 +5730,7 @@ sqInt literal; sqInt numArgs; sqInt opcode; - sqInt opcodeSize; + unsigned long opcodeSize; sqInt wordConstant;
@@ -5778,8 +5771,8 @@ /* begin CmpC32:R: */ opcode = CmpC32R; /* begin checkLiteral:forInstruction: */ - literal = 3133021973ULL + h; - anInstruction = genoperandoperand(opcode, 3133021973ULL + h, TempReg); + literal = 3133021973U + h; + anInstruction = genoperandoperand(opcode, 3133021973U + h, TempReg); /* begin JumpLongZero: */ jumpTarget = ((cPICPrototypeCaseOffset()) + 13262352) + (h * 16); genConditionalBranchoperand(JumpLongZero, ((sqInt)jumpTarget)); @@ -5826,7 +5819,7 @@ generateCogMethod(sqInt selector) { sqInt codeSize; - sqInt headerSize; + unsigned long headerSize; sqInt mapSize; CogMethod *method; sqInt result; @@ -5923,12 +5916,12 @@ generateMapAtstart(sqInt addressOrNull, sqInt startAddress) { unsigned char annotation; - sqInt delta; + usqInt delta; sqInt i; AbstractInstruction *instruction; sqInt length; - sqInt location; - sqInt mapEntry; + usqInt location; + usqInt mapEntry; sqInt maxDelta; usqInt mcpc;
@@ -6022,9 +6015,9 @@ generateOpenPICPrototype(void) { sqInt codeSize; - sqInt fixupSize; + unsigned long fixupSize; sqInt mapSize; - sqInt opcodeSize; + unsigned long opcodeSize;
/* begin allocateOpcodes:bytecodes: */ numAbstractOpcodes = 100; @@ -6107,9 +6100,9 @@ static void generateTrampolines(void) { - sqInt fixupSize; + unsigned long fixupSize; sqInt methodZoneStart; - sqInt opcodeSize; + unsigned long opcodeSize;
methodZoneStart = methodZoneBase; (methodLabel->address = methodZoneStart); @@ -6145,8 +6138,8 @@ genGetLeafCallStackPointer(void) { AbstractInstruction *anInstruction; - sqInt fixupSize; - sqInt opcodeSize; + unsigned long fixupSize; + unsigned long opcodeSize; sqInt quickConstant; sqInt startAddress;
@@ -6739,9 +6732,9 @@ void initializeCodeZoneFromupTo(sqInt startAddress, sqInt endAddress) { - sqInt fixupSize; + unsigned long fixupSize; sqInt numberOfAbstractOpcodes; - sqInt opcodeSize; + unsigned long opcodeSize; sqInt startAddress1;
initializeBackend(); @@ -6914,13 +6907,14 @@ return (((descriptor->spanFunction))(descriptor, pc, nExts, aMethodObj)) < 0; }
+ +/* See Cogit class>>initializeAnnotationConstants */ + /* Cogit>>#isPCMappedAnnotation: */ static sqInt NoDbgRegParms isPCMappedAnnotation(sqInt annotation) { - return (annotation >= IsSendCall) - || ((annotation == HasBytecodePC) - || (annotation == IsNSSendCall)); + return annotation >= HasBytecodePC; }
/* Cogit>>#isPCWithinMethodZone: */ @@ -7165,9 +7159,9 @@ mapForperformUntilarg(CogMethod *cogMethod, sqInt (*functionSymbol)(sqInt annotation, char *mcpc, sqInt arg), sqInt arg) { sqInt annotation; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqInt result;
mcpc = (0 @@ -7272,9 +7266,9 @@ sqInt freedPIC; sqInt hasYoungObj; sqInt hasYoungObjPtr; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqInt remappedMethod; sqInt result; sqInt val; @@ -7390,9 +7384,9 @@ { sqInt annotation; CogMethod *cogMethod; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqInt result;
codeModified = 0; @@ -7470,9 +7464,9 @@ CogMethod *cogMethod; sqInt hasYoungObj; sqInt hasYoungObjPtr; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; usqInt pointer; sqInt result; sqInt val; @@ -7590,12 +7584,12 @@ sqInt annotation; sqInt annotation1; CogMethod *cogMethod; - sqInt map; - sqInt map1; + usqInt map; + usqInt map1; sqInt mapByte; sqInt mapByte1; - sqInt mcpc; - sqInt mcpc1; + usqInt mcpc; + usqInt mcpc1; sqInt result; sqInt result1; sqInt val; @@ -7750,9 +7744,9 @@ markAndTraceOrFreeCogMethodfirstVisit(CogMethod *cogMethod, sqInt firstVisit) { sqInt annotation; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqInt result; sqInt val;
@@ -8078,9 +8072,9 @@ { sqInt annotation; CogMethod *cogMethod; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqInt result;
assert((((aCogMethod->cmType)) == CMMethod) @@ -8299,21 +8293,24 @@ if (mapByte >= FirstAnnotation) { annotation = ((usqInt) mapByte) >> AnnotationShift; mcpc += (mapByte & DisplacementMask); - if ((annotation >= IsSendCall) - || ((annotation == HasBytecodePC) - || (annotation == IsNSSendCall))) { + if (annotation >= HasBytecodePC) { + if ((annotation == IsSendCall) + && ((((usqInt) ((mapByte = byteAt(map - 1)))) >> AnnotationShift) == IsAnnotationExtension)) { + annotation += mapByte & DisplacementMask; + map -= 1; + } while (1) { byte = (fetchByteofObject(bcpc1, aMethodObj)) + bsOffset; descriptor = generatorAt(byte); if (isInBlock) { if (bcpc1 >= endbcpc) { - return 0; + return ((sqInt) 0); } } else { if (((descriptor->isReturn)) && (bcpc1 >= latestContinuation)) { - return 0; + return ((sqInt) 0); } if ((isBranch(descriptor)) || ((descriptor->isBlockCreation))) { @@ -8357,7 +8354,7 @@ } map -= 1; } - return 0; + return ((sqInt) 0); }
/* Cogit>>#methodNumArgs */ @@ -8617,22 +8614,6 @@ return (interpretOffset()) - (callInstructionByteSize(backEnd)); }
- -/* The methodLabel serves as the reference to the start of the current code - object being produced (CMMethod, CMClosedPIC etc), but it also carries - type flags for - the frame method field, set via the labelOffset. So we must clean the - flags on each - compilation to avoid stale lags being left behind from previous - compilations. */ - - /* Cogit>>#preenMethodLabel */ -static void -preenMethodLabel(void) -{ - setLabelOffset(methodLabel, 0); -} - /* Cogit>>#previousInstruction */ static AbstractInstruction * previousInstruction(void) @@ -8841,9 +8822,9 @@ { sqInt annotation; sqLong callDelta; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqLong refDelta; sqInt result;
@@ -9306,7 +9287,7 @@ spanForCleanBlockStartingAt(sqInt startPC) { BytecodeDescriptor *descriptor; - sqInt end; + usqInt end; sqInt pc;
pc = startPC; @@ -9415,9 +9396,9 @@ { sqInt annotation; CogMethod *cogMethod; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqInt result;
if (!(methodZoneBase)) { @@ -9858,9 +9839,9 @@ sqInt annotation; CogMethod *cogMethod; sqInt freedPIC; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqInt result;
if (!(methodZoneBase)) { @@ -9935,9 +9916,9 @@ { sqInt annotation; CogMethod *cogMethod; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqInt mustScanAndUnlink; sqInt result;
@@ -10034,9 +10015,9 @@ { sqInt annotation; CogMethod *cogMethod; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqInt result;
if (!(methodZoneBase)) { @@ -10103,9 +10084,9 @@ sqInt annotation; CogMethod *cogMethod; sqInt freedPIC; - sqInt map; + usqInt map; sqInt mapByte; - sqInt mcpc; + usqInt mcpc; sqInt result; CogMethod *targetMethod;
@@ -10491,7 +10472,7 @@ static void freeOlderMethodsForCompaction(void) { - sqInt amountToFree; + usqInt amountToFree; sqInt cascade0; sqInt cascade1; CogMethod *cogMethod; @@ -10586,8 +10567,27 @@ return 0; }
+ /* CogMethodZone>>#methodsCompiledToMachineCodeInto: */ +sqInt +methodsCompiledToMachineCodeInto(sqInt arrayObj) +{ + CogMethod *cogMethod; + sqInt methodIndex; + + methodIndex = 0; + cogMethod = ((CogMethod *) baseAddress); + while (cogMethod < (limitZony())) { + if (((cogMethod->cmType)) == CMMethod) { + storePointerUncheckedofObjectwithValue(methodIndex, arrayObj, (cogMethod->methodObject)); + methodIndex += 1; + } + cogMethod = ((CogMethod *) (roundUpLength((((sqInt)cogMethod)) + ((cogMethod->blockSize))))); + } + return methodIndex; +} + /* CogMethodZone>>#numMethods */ -static sqInt +sqInt numMethods(void) { return methodCount; @@ -11989,7 +11989,7 @@ { sqInt address; sqInt address1; - sqInt allocSize; + unsigned long allocSize; AbstractInstruction *anInstruction; AbstractInstruction *anInstruction1; AbstractInstruction *anInstruction2; @@ -13077,7 +13077,7 @@ /* begin JumpBelow: */ jumpNotIndexableBits = genConditionalBranchoperand(JumpBelow, ((sqInt)0)); /* begin CmpCq:R: */ - anInstruction9 = genoperandoperand(CmpCqR, (((sqInt)0xFFFFFFFFULL << 3) | 1), Arg1Reg); + anInstruction9 = genoperandoperand(CmpCqR, (((sqInt)0xFFFFFFFFU << 3) | 1), Arg1Reg); /* begin JumpAbove: */ jumpWordsOutOfRange = genConditionalBranchoperand(JumpAbove, ((sqInt)0)); /* begin LogicalShiftLeftCq:R: */ @@ -21719,7 +21719,8 @@ sqInt quickConstant; sqInt reg;
- preenMethodLabel(); + /* begin preenMethodLabel */ + ((methodLabel->operands))[1] = 0; compilePICAbort(numArgs); entry = genGetClassTagOfintoscratchReg(ReceiverResultReg, ClassReg, TempReg); /* begin MoveR:R: */ @@ -22299,7 +22300,7 @@ static sqInt genExtSendSuperBytecode(void) { - sqInt isDirected; + int isDirected; sqInt litIndex; sqInt nArgs;
@@ -23258,9 +23259,12 @@ if (mapByte >= FirstAnnotation) { annotation = ((usqInt) mapByte) >> AnnotationShift; mcpc += (mapByte & DisplacementMask); - if ((annotation >= IsSendCall) - || ((annotation == HasBytecodePC) - || (annotation == IsNSSendCall))) { + if (annotation >= HasBytecodePC) { + if ((annotation == IsSendCall) + && ((((usqInt) ((mapByte = byteAt(map - 1)))) >> AnnotationShift) == IsAnnotationExtension)) { + annotation += mapByte & DisplacementMask; + map -= 1; + } while (1) { byte = (fetchByteofObject(bcpc, aMethodObj)) + bsOffset; descriptor = generatorAt(byte); @@ -23430,9 +23434,7 @@ introspectionDataIndex += 6; return 0; } - if (((((usqInt) isBackwardBranchAndAnnotation) >> 1) >= IsSendCall) - || (((((usqInt) isBackwardBranchAndAnnotation) >> 1) == HasBytecodePC) - || ((((usqInt) isBackwardBranchAndAnnotation) >> 1) == IsNSSendCall))) { + if ((((usqInt) isBackwardBranchAndAnnotation) >> 1) >= HasBytecodePC) { actualBcpc = (isBackwardBranchAndAnnotation & 1 ? bcpc + 1 : (bcpc + ((descriptor->numBytes))) + 1); @@ -24652,7 +24654,7 @@ genoperandoperand(MoveRR, ReceiverResultReg, ClassReg); cascade0 = (blockStart->fakeHeader); addDependent(cascade0, annotateAbsolutePCRef(gPushCw(((sqInt)((blockStart->fakeHeader)))))); - setLabelOffset(cascade0, MFMethodFlagIsBlockFlag); + ((cascade0->operands))[1] = MFMethodFlagIsBlockFlag; annotateobjRef(gPushCw(nilObject()), nilObject()); if ((blockStart->hasInstVarRef)) {
@@ -24747,14 +24749,14 @@ static CogMethod * NoDbgRegParms compileCogMethod(sqInt selector) { - sqInt allocBytes; + unsigned long allocBytes; sqInt debugStackPointers; - sqInt extra; - sqInt fixupBytes; + int extra; + unsigned long fixupBytes; sqInt numBlocks; sqInt numBytecodes; sqInt numCleanBlocks; - sqInt opcodeBytes; + unsigned long opcodeBytes; sqInt result;
methodOrBlockNumTemps = tempCountOf(methodObj); @@ -24824,7 +24826,8 @@ sqInt result;
regArgsHaveBeenPushed = 0; - preenMethodLabel(); + /* begin preenMethodLabel */ + ((methodLabel->operands))[1] = 0; compileAbort(); compileEntry(); if (((result = compilePrimitive())) < 0) { @@ -26109,7 +26112,7 @@ genPushNewArrayBytecode(void) { sqInt i; - sqInt popValues; + int popValues; sqInt size;
assert(needsFrame); @@ -26314,7 +26317,7 @@ AbstractInstruction *anInstruction6; AbstractInstruction *anInstruction7; sqInt argInt; - sqInt argIsConst; + int argIsConst; sqInt argIsInt; sqInt index; AbstractInstruction *jumpContinue; @@ -26323,7 +26326,7 @@ sqInt literal1; BytecodeDescriptor *primDescriptor; sqInt rcvrInt; - sqInt rcvrIsConst; + int rcvrIsConst; sqInt rcvrIsInt; sqInt result;
@@ -26704,8 +26707,8 @@ sqInt targetBytecodePC; sqInt targetBytecodePC1; sqInt topRegistersMask; - sqInt unforwardArg; - sqInt unforwardRcvr; + int unforwardArg; + int unforwardRcvr;
/* begin extractMaybeBranchDescriptorInto: */ primDescriptor = generatorAt(byte0); @@ -26923,7 +26926,7 @@ sqInt argInt; BytecodeDescriptor *primDescriptor; sqInt rcvrInt; - sqInt result; + int result;
primDescriptor = generatorAt(byte0); argInt = ((ssTop())->constant);
Modified: branches/Cog/nsspur64src/vm/cointerp.c =================================================================== --- branches/Cog/nsspur64src/vm/cointerp.c 2016-04-27 15:01:30 UTC (rev 3686) +++ branches/Cog/nsspur64src/vm/cointerp.c 2016-04-27 22:35:21 UTC (rev 3687) @@ -1,9 +1,9 @@ /* Automatically generated by - CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1834 uuid: 858a9c54-959b-4d7e-b9b3-5f083d37f488 + CCodeGeneratorGlobalStructure VMMaker.oscog-eem.1849 uuid: d65892b1-b636-442a-affd-36ef8f9abcd1 from - CoInterpreter VMMaker.oscog-eem.1834 uuid: 858a9c54-959b-4d7e-b9b3-5f083d37f488 + CoInterpreter VMMaker.oscog-eem.1849 uuid: d65892b1-b636-442a-affd-36ef8f9abcd1 */ -static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1834 uuid: 858a9c54-959b-4d7e-b9b3-5f083d37f488 " __DATE__ ; +static char __buildInfo[] = "CoInterpreter VMMaker.oscog-eem.1849 uuid: d65892b1-b636-442a-affd-36ef8f9abcd1 " __DATE__ ; char *__interpBuildInfo = __buildInfo;
@@ -342,7 +342,7 @@ #define TraceVMCallback 89 #define TraceVMCallbackReturn 97 #define TrueObject 2 -#define V3PrimitiveBitsMask 0x80000FF8ULL +#define V3PrimitiveBitsMask 0x80000FF8U #define ValueIndex 1 #if !defined(VMBIGENDIAN) /* Allow this to be overridden on the compiler command line */ # define VMBIGENDIAN 0 @@ -487,7 +487,7 @@ static sqInt executeNewMethod(void); static sqInt NoDbgRegParms externalInstVarofContext(sqInt offset, sqInt aContext); static void NoDbgRegParms findNewMethodInClassTag(sqInt classTagArg); -extern sqInt flushExternalPrimitiveOf(sqInt methodObj); +extern void flushExternalPrimitiveOf(sqInt methodObj); static void flushMethodCache(void); static void followForwardedFieldsInCurrentMethod(void); static void NoDbgRegParms followForwardingPointersInStackZone(sqInt theBecomeEffectsFlags); @@ -605,6 +605,7 @@ extern usqInt varBaseAddress(void); static sqInt NoDbgRegParms voidVMStateForSnapshotFlushingExternalPrimitivesIf(sqInt flushExtPrims); extern char * whereIs(sqInt anOop); +static void NoDbgRegParms NeverInline widowOrForceToBytecodePC(sqInt ctxt); static sqInt NoDbgRegParms frameIsMarked(sqInt theFPInt); static void primitiveClosureCopyWithCopiedValues(void); static void primitiveCollectCogCodeConstituents(void); @@ -912,7 +913,7 @@ static void NeverInline computeRefCountToShrinkRT(void); static sqInt NoDbgRegParms copyAndForward(sqInt survivor); static sqInt NoDbgRegParms NeverInline copyToOldSpacebytesformat(sqInt survivor, sqInt bytesInObject, sqInt formatOfSurvivor); -static sqInt NoDbgRegParms firstCorpse(sqInt headOfCorpseList); +static usqInt NoDbgRegParms firstCorpse(sqInt headOfCorpseList); static void growRememberedSet(void); static sqInt NoDbgRegParms isInRememberedSet(sqInt objOop); static sqInt NoDbgRegParms isMaybeOldScavengeSurvivor(sqInt oop); @@ -1169,7 +1170,7 @@ extern sqInt nonIndexablePointerFormat(void); static sqInt noUnscannedEphemerons(void); static sqInt NoDbgRegParms numBytesOfBytes(sqInt objOop); -extern sqInt numBytesOf(sqInt objOop); +extern usqInt numBytesOf(sqInt objOop); static sqInt numberOfForwarders(void); extern sqInt numPointerSlotsOf(sqInt objOop); static usqInt NoDbgRegParms numSlotsOfAny(sqInt objOop); @@ -1187,6 +1188,8 @@ extern sqInt popRemappableOop(void); static void NoDbgRegParms postBecomeScanClassTable(sqInt effectsFlags); extern sqInt primitiveErrorTable(void); +extern void printActivationsOf(sqInt aMethodObj); +extern void printContextReferencesTo(sqInt anOop); extern void printForwarders(void); extern void printFreeChunks(void); extern void printFreeChunk(sqInt freeChunk); @@ -1308,8 +1311,8 @@ static sqInt NoDbgRegParms classNameOfIs(sqInt aClass, char *className); static sqInt NoDbgRegParms contexthasSender(sqInt thisCntx, sqInt aContext); static sqInt NoDbgRegParms contexthasValidInversePCMappingOfin(sqInt aContext, sqInt theIP, char *theFP); -extern sqInt copiedValueCountOfClosure(sqInt closurePointer); -extern sqInt copiedValueCountOfFullClosure(sqInt closurePointer); +extern usqInt copiedValueCountOfClosure(sqInt closurePointer); +extern usqInt copiedValueCountOfFullClosure(sqInt closurePointer); extern sqInt copyBits(void); extern sqInt copyBitsFromtoat(sqInt x0, sqInt x1, sqInt y); static sqInt NoDbgRegParms NeverInline couldBeProcess(sqInt oop); @@ -1372,7 +1375,7 @@ static void handleStackOverflow(void); static sqInt NoDbgRegParms handleStackOverflowOrEventAllowContextSwitch(sqInt mayContextSwitch); extern sqInt headerIndicatesAlternateBytecodeSet(sqInt methodHeader); -extern sqInt highBit(usqInt anUnsignedValue); +extern usqInt highBit(usqInt anUnsignedValue); static sqInt NoDbgRegParms ifCurrentStackPageHasValidHeadPointers(StackPage *thePage); static usqInt NoDbgRegParms iframeMethod(char *theFP); extern sqInt includesBehaviorThatOf(sqInt aClass, sqInt aSuperclass); @@ -1415,6 +1418,7 @@ static sqInt lookupOrdinarySend(void); static sqInt NoDbgRegParms lookupProtectedstartingAtrule(sqInt selector, sqInt mixinApplication, sqInt rule); extern sqInt lookupSelectorinClass(sqInt selector, sqInt class); +static void NoDbgRegParms makeContextSnapshotSafe(sqInt ctxt); extern sqInt makePointwithxValueyValue(sqInt xValue, sqInt yValue); static void mapInterpreterOops(void); static sqInt NoDbgRegParms markAndTraceStackPages(sqInt fullGCFlag); @@ -1621,8 +1625,8 @@ _iss char * stackBasePlus1; _iss sqInt weaklingStack; _iss sqInt trueObj; +_iss sqInt falseObj; _iss usqInt newSpaceStart; -_iss sqInt falseObj; _iss sqInt hiddenRootsObj; _iss SpurSegmentInfo * segments; _iss sqInt lkupClassTag; @@ -2408,12 +2412,12 @@ /*40*/ 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1,-1,-1,-1,-1, /*60*/ 0, 0, 0,-1,-1,-1,-1,-1, 0, 0,-1,-1, 0, 1, 1, 0, 0, 0, 0, 0, /*80*/ -1,-1,-1, 0,-1,-1, 0, 0, 1,-1,-1, 0, 0, 0, 0,-1,-1,-1, 0, 0, -/*100*/ 1, 1, 0, 2,-1, 1,-1,-1,-1,-1, 0, 0,-1,-1,-1, 1, 1,-1, 1, 0, +/*100*/ 1, 1, 0, 2,-1, 1,-1,-1,-1,-1, 0, 0,-1,-1,-1, 1, 0,-1, 1, 0, /*120*/ -1, 0,-1,-1, 0, 0, 0, 0, 0,-1,-1,-1, 1, 0, 0,-1, 0,-1,-1,-1, /*140*/ -1, 1,-1, 1, 0, 0,-1,-1, 0, 0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /*160*/ 0, 0,-1, 0, 0, 1, 1,-1, 1, 0, 0, 1,-1, 1, 1,-1,-1,-1,-1,-1, /*180*/ 0,-1,-1, 0, 0, 0, 1, 1, 1, 0,-1,-1,-1,-1,-1, 1, 2,-1,-1,-1, -/*200*/ -1, 2, 2, 2, 2, 2, 2,-1,-1,-1, 1, 1, 1, 1,-1, 1,-1,-1, 3,-1, +/*200*/ -1, 2, 2, 2, 2, 2, 2,-1,-1,-1, 1, 1, 1, 1,-1, 0,-1,-1, 3,-1, /*220*/ -1, 2, 2,-1,-1,-1,-1,-1,-1,-1, 0,-1, 2, 0,-1,-1,-1,-1,-1,-1, /*240*/ -1,-1, 0,-1, 0,-1,-1,-1,-1,-1,-1, 0, 1,-1, 0,-1,-1,-1,-1,-1, /*260*/ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, @@ -2434,7 +2438,7 @@ /*560*/ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0, 0, 0,-1,-1 }; char expensiveAsserts = 0; -const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1834"; +const char *interpreterVersion = "Newspeak Virtual Machine CoInterpreterPrimitives_VMMaker.oscog-eem.1849"; sqInt minBackwardJumpCountForCompile = MinBackwardJumpCountForCompile /* 40 */; volatile int sendTrace;
@@ -2567,7 +2571,7 @@ sqInt localReturnValue; char * localSP; sqInt stackPageBytes; - sqInt stackPagesBytes; + usqInt stackPagesBytes; char *theStackMemory;
if (GIV(stackLimit) == 0) { @@ -6369,7 +6373,7 @@ sqInt obj1; sqInt object; sqInt object1; - sqInt onCurrentPage; + int onCurrentPage; sqInt opType; sqInt referent; sqInt referent1; @@ -6764,9 +6768,7 @@ sqInt aValue; sqInt classPointer; sqInt err; - sqInt err1; sqInt hash; - sqInt hash1; sqInt objOop; sqInt objOop1; sqInt referent; @@ -6782,32 +6784,15 @@ objOop = fixFollowedFieldofObjectwithInitialValue(SuperclassIndex, classPointer, objOop); } superclass = objOop; - /* begin ensureBehaviorHash: */ - assert(addressCouldBeClassObj(superclass)); - if (((hash = (long32At(superclass + 4)) & (identityHashHalfWordMask()))) != 0) { - } - else { - if (objCouldBeClassObj(superclass)) { - if (((err = enterIntoClassTable(superclass))) != 0) { - -err; - } - else { - (long32At(superclass + 4)) & (identityHashHalfWordMask()); - } - } - else { - -PrimErrBadReceiver; - } - } /* begin classTagForClass: */ assert(addressCouldBeClassObj(superclass)); /* begin ensureBehaviorHash: */ assert(addressCouldBeClassObj(superclass)); - GIV(lkupClassTag) = (((hash1 = (long32At(superclass + 4)) & (identityHashHalfWordMask()))) != 0 - ? hash1 + GIV(lkupClassTag) = (((hash = (long32At(superclass + 4)) & (identityHashHalfWordMask()))) != 0 + ? hash : (objCouldBeClassObj(superclass) - ? (((err1 = enterIntoClassTable(superclass))) != 0 - ? -err1 + ? (((err = enterIntoClassTable(superclass))) != 0 + ? -err : (long32At(superclass + 4)) & (identityHashHalfWordMask())) : -PrimErrBadReceiver)); /* begin ensureReceiverUnforwarded */ @@ -6899,7 +6884,7 @@ sqInt i; usqInt newObj; usqInt numBytes; - sqInt popValues; + int popValues; sqInt size;
VM_LABEL(pushNewArrayBytecode); @@ -7922,7 +7907,7 @@ /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
- goto l465; + goto l464; } if (bytecode == 172) {
@@ -7931,7 +7916,7 @@ /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
- goto l465; + goto l464; } if (bytecode > 167) {
@@ -7941,7 +7926,7 @@ localIP = (localIP + offset) + 1; currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
- goto l465; + goto l464; } } currentBytecode = bytecode + GIV(bytecodeSetSelector); @@ -7949,7 +7934,7 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), GIV(trueObj)); } - l465: /* end case */; + l464: /* end case */; break; case 179: /* bytecodePrimGreaterThan */ @@ -8099,7 +8084,7 @@ localIP = (localIP + (bytecode - 151)) + 1; currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
- goto l466; + goto l465; } if (bytecode == 172) {
@@ -8109,14 +8094,14 @@ localIP = (localIP + offset) + 1; currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
- goto l466; + goto l465; } currentBytecode = bytecode + GIV(bytecodeSetSelector);
/* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), GIV(falseObj)); } - l466: /* end case */; + l465: /* end case */; break; case 180: /* bytecodePrimLessOrEqual */ @@ -8631,6 +8616,8 @@ double arg1; sqInt bits; sqInt bits1; + sqInt oop; + sqInt overflow; sqInt rcvr; double rcvr1; sqInt result; @@ -8651,12 +8638,19 @@ && ((((arg) & 7) == 1))) { rcvr = (rcvr >> 3); arg = (arg >> 3); - result = rcvr * arg; - if ((arg == 0) - || (((result / arg) == rcvr) - && ((((((usqInt) result) >> 60) + 1) & 15) <= 1))) { + overflow = (rcvr > 0 + ? (arg > 0 + ? rcvr > ((MaxSmallInteger) / arg) + : arg < ((MinSmallInteger) / rcvr)) + : (arg > 0 + ? rcvr < ((MinSmallInteger) / arg) + : (rcvr < 0) + && (arg < ((MaxSmallInteger) / rcvr)))); + if (!overflow) { + result = rcvr * arg; + oop = ((result << 3) | 1); /* begin internalPop:thenPush: */ - longAtPointerput((localSP += (2 - 1) * BytesPerOop), ((result << 3) | 1)); + longAtPointerput((localSP += (2 - 1) * BytesPerOop), oop); /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
@@ -10263,7 +10257,7 @@ /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
- goto l467; + goto l466; } if (bytecode == 244) {
@@ -10272,7 +10266,7 @@ /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
- goto l467; + goto l466; } if (bytecode == 243) {
@@ -10282,7 +10276,7 @@ localIP = (localIP + offset) + 1; currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
- goto l467; + goto l466; } } currentBytecode = bytecode + GIV(bytecodeSetSelector); @@ -10290,7 +10284,7 @@ /* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), GIV(trueObj)); } - l467: /* end case */; + l466: /* end case */; break; case 339: /*83*/ /* bytecodePrimGreaterThanV4 */ @@ -10440,7 +10434,7 @@ localIP = (localIP + (bytecode - 207)) + 1; currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
- goto l468; + goto l467; } if (bytecode == 244) {
@@ -10450,14 +10444,14 @@ localIP = (localIP + offset) + 1; currentBytecode = (byteAtPointer(localIP)) + GIV(bytecodeSetSelector);
- goto l468; + goto l467; } currentBytecode = bytecode + GIV(bytecodeSetSelector);
/* begin internalPush: */ longAtPointerput((localSP -= BytesPerOop), GIV(falseObj)); } - l468: /* end case */; + l467: /* end case */; break; case 340: /*84*/ /* bytecodePrimLessOrEqualV4 */ @@ -10972,6 +10966,8 @@ double arg1; sqInt bits; sqInt bits1; + sqInt oop; + sqInt overflow; sqInt rcvr; double rcvr1; sqInt result; @@ -10992,12 +10988,19 @@ && ((((arg) & 7) == 1))) { rcvr = (rcvr >> 3); arg = (arg >> 3); - result = rcvr * arg; - if ((arg == 0) - || (((result / arg) == rcvr) - && ((((((usqInt) result) >> 60) + 1) & 15) <= 1))) { + overflow = (rcvr > 0 + ? (arg > 0 + ? rcvr > ((MaxSmallInteger) / arg) + : arg < ((MinSmallInteger) / rcvr)) + : (arg > 0 + ? rcvr < ((MinSmallInteger) / arg) + : (rcvr < 0) + && (arg < ((MaxSmallInteger) / rcvr)))); + if (!overflow) { + result = rcvr * arg; + oop = ((result << 3) | 1); /* begin internalPop:thenPush: */ - longAtPointerput((localSP += (2 - 1) * BytesPerOop), ((result << 3) | 1)); + longAtPointerput((localSP += (2 - 1) * BytesPerOop), oop); /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
@@ -12310,7 +12313,7 @@ sqInt i; usqInt newObj; usqInt numBytes; - sqInt popValues; + int popValues; sqInt size;
VM_LABEL(pushNewArrayBytecode1); @@ -12382,7 +12385,7 @@ sqInt anObject; sqInt index1; sqInt obj; - sqInt onCurrentPage; + int onCurrentPage; sqInt senderOop; char * theFP; StackPage * thePage; @@ -12618,7 +12621,7 @@ { sqInt index1; sqInt obj; - sqInt onCurrentPage; + int onCurrentPage; sqInt senderOop; char * theFP; StackPage * thePage; @@ -13006,12 +13009,12 @@ classTablePage = longAt((GIV(hiddenRootsObj) + BaseHeaderSize) + (((long)fieldIndex) << (shiftForWord()))); if (classTablePage == GIV(nilObj)) { GIV(lkupClass) = null; - goto l469; + goto l468; } /* begin fetchPointer:ofObject: */ fieldIndex1 = GIV(lkupClassTag) & ((1LL << (classTableMajorIndexShift())) - 1); GIV(lkupClass) = longAt((classTablePage + BaseHeaderSize) + (((long)fieldIndex1) << (shiftForWord()))); - l469: /* end classAtIndex: */; + l468: /* end classAtIndex: */; /* begin lookupImplicitReceiverSend */ GIV(messageSelector) = (((GIV(messageSelector) & (tagMask())) == 0) && (((longAt(GIV(messageSelector))) & (classIndexMask())) == (isForwardedObjectClassIndexPun())) @@ -13076,12 +13079,12 @@ } GIV(newMethod) = objOop2; found = 1; - goto l474; + goto l473; } index += 1; } found = 0; - goto l474; + goto l473; }
/* It is assumed that there are some nils in this dictionary, and search will @@ -13105,7 +13108,7 @@ nextSelector = longAt((dictionary + BaseHeaderSize) + (((long)index) << (shiftForWord()))); if (nextSelector == GIV(nilObj)) { found = 0; - goto l474; + goto l473; } if (((nextSelector & (tagMask())) == 0) && (((longAt(nextSelector)) & (classIndexMask())) == (isForwardedObjectClassIndexPun()))) { @@ -13127,24 +13130,24 @@ } GIV(newMethod) = objOop4; found = 1; - goto l474; + goto l473; } index += 1; if (index == length) { if (wrapAround) { found = 0; - goto l474; + goto l473; } wrapAround = 1; index = SelectorStart; } } found = 0; - l474: /* end lookupMethodInDictionary: */; + l473: /* end lookupMethodInDictionary: */; if (found) { GIV(localAbsentReceiver) = candidateReceiver; actualLookupRule = lookupLexicalfromrule(GIV(messageSelector), candidateMixin, LookupRuleImplicit); - goto l479; + goto l478; } /* begin followObjField:ofObject: */ objOop1 = longAt((candidateMixin + BaseHeaderSize) + (((long)EnclosingMixinIndex) << (shiftForWord()))); @@ -13165,7 +13168,7 @@ ? longAt((GIV(classTableFirstPage) + BaseHeaderSize) + (((long)tagBits1) << (shiftForWord()))) : fetchClassOfNonImm(methodReceiver)); actualLookupRule = lookupProtectedstartingAtrule(GIV(messageSelector), GIV(lkupClass), LookupRuleImplicit); - l479: /* end lookupImplicitReceiverSend */; + l478: /* end lookupImplicitReceiverSend */; /* begin internalizeIPandSP */ assert(GIV(instructionPointer) != (ceReturnToInterpreterPC())); localIP = pointerForOop(GIV(instructionPointer)); @@ -13193,26 +13196,26 @@ if (localPrimIndex >= 264) { /* begin internalStackTopPut: */ longAtPointerput(localSP, longAt(((longAtPointer(localSP)) + BaseHeaderSize) + (((long)(localPrimIndex - 264)) << (shiftForWord())))); - goto l470; + goto l469; } if (localPrimIndex == 256) { - goto l470; + goto l469; } if (localPrimIndex == 257) { longAtPointerput(localSP, GIV(trueObj)); - goto l470; + goto l469; } if (localPrimIndex == 258) { longAtPointerput(localSP, GIV(falseObj)); - goto l470; + goto l469; } if (localPrimIndex == 259) { longAtPointerput(localSP, GIV(nilObj)); - goto l470; + goto l469; } longAtPointerput(localSP, (((localPrimIndex - 261) << 3) | 1)); - l470: /* end internalQuickPrimitiveResponse */; - goto l471; + l469: /* end internalQuickPrimitiveResponse */; + goto l470; } /* begin externalizeIPandSP */ assert((((usqInt)localIP)) != (ceReturnToInterpreterPC())); @@ -13274,7 +13277,7 @@ if (succeeded) { returntoExecutive(popStack(), 1); browserPluginReturnIfNeeded(); - goto l471; + goto l470; } } if (methodHasCogMethod(GIV(newMethod))) { @@ -13349,11 +13352,11 @@ table = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)PrimErrTableIndex) << (shiftForWord()))); if (GIV(primFailCode) <= (numSlotsOf(table))) { errorCode = longAt((table + BaseHeaderSize) + (((long)(GIV(primFailCode) - 1)) << (shiftForWord()))); - goto l482; + goto l481; } } errorCode = ((GIV(primFailCode) << 3) | 1); - l482: /* end getErrorObjectFromPrimFailCode */; + l481: /* end getErrorObjectFromPrimFailCode */; longAtPointerput(localSP, errorCode); } GIV(primFailCode) = 0; @@ -13377,7 +13380,7 @@ localFP = pointerForOop(GIV(framePointer)); } } - l471: /* end internalExecuteNewMethod */; + l470: /* end internalExecuteNewMethod */; /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
@@ -13457,7 +13460,7 @@ GIV(newMethod) = GIV(nsMethodCache)[probe1 + NSMethodCacheTargetMethod]; primitiveFunctionPointer = ((void (*)()) (GIV(nsMethodCache)[probe1 + NSMethodCachePrimFunction])); GIV(localAbsentReceiverOrZero) = GIV(nsMethodCache)[probe1 + NSMethodCacheActualReceiver]; - goto l492; + goto l491; }
/* second probe */ @@ -13469,7 +13472,7 @@ GIV(newMethod) = GIV(nsMethodCache)[probe1 + NSMethodCacheTargetMethod]; primitiveFunctionPointer = ((void (*)()) (GIV(nsMethodCache)[probe1 + NSMethodCachePrimFunction])); GIV(localAbsentReceiverOrZero) = GIV(nsMethodCache)[probe1 + NSMethodCacheActualReceiver]; - goto l492; + goto l491; } probe1 = (((usqInt) hash1) >> 2) & NSMethodCacheMask; if (((((GIV(nsMethodCache)[probe1 + NSMethodCacheSelector]) == GIV(messageSelector)) @@ -13479,7 +13482,7 @@ GIV(newMethod) = GIV(nsMethodCache)[probe1 + NSMethodCacheTargetMethod]; primitiveFunctionPointer = ((void (*)()) (GIV(nsMethodCache)[probe1 + NSMethodCachePrimFunction])); GIV(localAbsentReceiverOrZero) = GIV(nsMethodCache)[probe1 + NSMethodCacheActualReceiver]; - goto l492; + goto l491; } /* end inlineLookupInNSMethodCacheSel:classTag:method:lookupRule:; fall through */ /* begin externalizeIPandSP */ @@ -13506,12 +13509,12 @@ classTablePage = longAt((GIV(hiddenRootsObj) + BaseHeaderSize) + (((long)fieldIndex) << (shiftForWord()))); if (classTablePage == GIV(nilObj)) { GIV(lkupClass) = null; - goto l486; + goto l485; } /* begin fetchPointer:ofObject: */ fieldIndex1 = GIV(lkupClassTag) & ((1LL << (classTableMajorIndexShift())) - 1); GIV(lkupClass) = longAt((classTablePage + BaseHeaderSize) + (((long)fieldIndex1) << (shiftForWord()))); - l486: /* end classAtIndex: */; + l485: /* end classAtIndex: */; /* begin lookupDynamicSuperSend */ GIV(localAbsentReceiver) = longAt(localFP + FoxIFReceiver); GIV(localAbsentReceiverOrZero) = 0; @@ -13533,7 +13536,7 @@ localSP = pointerForOop(GIV(stackPointer)); localFP = pointerForOop(GIV(framePointer)); addNewMethodToNSCache(actualLookupRule); - l492: ; + l491: ;
/* begin shuffleArgumentsAndStoreAbsentReceiver: */
@@ -13555,26 +13558,26 @@ if (localPrimIndex >= 264) { /* begin internalStackTopPut: */ longAtPointerput(localSP, longAt(((longAtPointer(localSP)) + BaseHeaderSize) + (((long)(localPrimIndex - 264)) << (shiftForWord())))); - goto l487; + goto l486; } if (localPrimIndex == 256) { - goto l487; + goto l486; } if (localPrimIndex == 257) { longAtPointerput(localSP, GIV(trueObj)); - goto l487; + goto l486; } if (localPrimIndex == 258) { longAtPointerput(localSP, GIV(falseObj)); - goto l487; + goto l486; } if (localPrimIndex == 259) { longAtPointerput(localSP, GIV(nilObj)); - goto l487; + goto l486; } longAtPointerput(localSP, (((localPrimIndex - 261) << 3) | 1)); - l487: /* end internalQuickPrimitiveResponse */; - goto l488; + l486: /* end internalQuickPrimitiveResponse */; + goto l487; } /* begin externalizeIPandSP */ assert((((usqInt)localIP)) != (ceReturnToInterpreterPC())); @@ -13636,7 +13639,7 @@ if (succeeded) { returntoExecutive(popStack(), 1); browserPluginReturnIfNeeded(); - goto l488; + goto l487; } } if (methodHasCogMethod(GIV(newMethod))) { @@ -13711,11 +13714,11 @@ table = longAt((GIV(specialObjectsOop) + BaseHeaderSize) + (((long)PrimErrTableIndex) << (shiftForWord()))); if (GIV(primFailCode) <= (numSlotsOf(table))) { errorCode = longAt((table + BaseHeaderSize) + (((long)(GIV(primFailCode) - 1)) << (shiftForWord()))); - goto l494; + goto l493; } } errorCode = ((GIV(primFailCode) << 3) | 1); - l494: /* end getErrorObjectFromPrimFailCode */; + l493: /* end getErrorObjectFromPrimFailCode */; longAtPointerput(localSP, errorCode); } GIV(primFailCode) = 0; @@ -13739,7 +13742,7 @@ localFP = pointerForOop(GIV(framePointer)); } } - l488: /* end internalExecuteNewMethod */; + l487: /* end internalExecuteNewMethod */; /* begin fetchNextBytecode */ currentBytecode = (byteAtPointer(++localIP)) + GIV(bytecodeSetSelector);
@@ -15069,7 +15072,7 @@ sqInt errorCode; sqInt header; sqInt i; - sqInt inInterpreter; + int inInterpreter; sqInt methodHeader; sqInt numArgs; sqInt numTemps; @@ -15578,7 +15581,7 @@ EXPORT(sqInt) callbackEnter(sqInt *callbackID) { DECL_MAYBE_VOLATILE_SQ_GLOBAL_STRUCT - volatile sqInt calledFromMachineCode; + volatile int calledFromMachineCode; volatile void *currentCFramePointer; volatile void *currentCStackPointer; volatile sqInt header; @@ -17756,7 +17759,7 @@ static sqInt checkForAndFollowForwardedPrimitiveState(void) { DECL_MAYBE_SQ_GLOBAL_STRUCT - signed char accessorDepth; + sqInt accessorDepth; sqInt firstBytecode; sqInt found;
@@ Diff output truncated at 50000 characters. @@
vm-dev@lists.squeakfoundation.org