Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.506.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.506 Author: eem Time: 11 November 2013, 9:44:02.213 am UUID: d08a5441-9507-473d-9dad-412d7702ae96 Ancestors: VMMaker.oscog-eem.505 Allow more wriggle room in the scavengeThreshold (eden bytes / 16 instead of eden bytes / 64). Declare freeListsMask unsigned so that <= bit comparisons work. Do a better job of dead code removal, accepting constant comparisons. Make SpurMemMgr>>objectAfter:/Before: <api>. Nuke a duplicate declareCAsOop:in:. Fix type decl for Spur64BitMemMgr>>rawNumSlotsOf: =============== Diff against VMMaker.oscog-eem.505 =============== Item was changed: ----- Method: CCodeGenerator>>generateIfFalse:on:indent: (in category 'C translation') ----- generateIfFalse: msgNode on: aStream indent: level "Generate the C code for this message onto the given stream." + (self nilOrBooleanConstantReceiverOf: msgNode receiver) - (self nilOrBooleanConstantReceiverOf: msgNode) ifNil: [aStream nextPutAll: 'if (!!'. msgNode receiver isLeaf ifFalse: [aStream nextPut: $(]. "grrrrr" msgNode receiver emitCCodeAsExpressionOn: aStream level: level + 1 generator: self. msgNode receiver isLeaf ifFalse: [aStream nextPut: $)]. "grrrrr" aStream nextPutAll: ') {'; cr. msgNode args last emitCCodeOn: aStream level: level + 1 generator: self. aStream tab: level. aStream nextPut: $}] ifNotNil: [:const | const ifFalse: [msgNode args first emitCCodeOn: aStream level: level generator: self]]! Item was changed: ----- Method: CCodeGenerator>>generateIfFalseAsArgument:on:indent: (in category 'C translation') ----- generateIfFalseAsArgument: msgNode on: aStream indent: level "Generate the C code for this message onto the given stream." + (self nilOrBooleanConstantReceiverOf: msgNode receiver) - (self nilOrBooleanConstantReceiverOf: msgNode) ifNil: [aStream nextPutAll: '(!!('. msgNode receiver emitCCodeAsArgumentOn: aStream level: 0 generator: self. aStream nextPut: $); crtab: level + 1; nextPut: $?; space. msgNode args last emitCCodeAsArgumentOn: aStream level: level + 2 generator: self. aStream crtab: level + 1; nextPutAll: ': 0)'] ifNotNil: [:const| const ifFalse: [msgNode args first emitCCodeAsArgumentOn: aStream level: level generator: self]]! Item was changed: ----- Method: CCodeGenerator>>generateIfFalseIfTrue:on:indent: (in category 'C translation') ----- generateIfFalseIfTrue: msgNode on: aStream indent: level "Generate the C code for this message onto the given stream." + (self nilOrBooleanConstantReceiverOf: msgNode receiver) - (self nilOrBooleanConstantReceiverOf: msgNode) ifNil: [aStream nextPutAll: 'if ('. msgNode receiver emitCCodeAsExpressionOn: aStream level: level generator: self. aStream nextPutAll: ') {'; cr. msgNode args last emitCCodeOn: aStream level: level + 1 generator: self. + aStream tab: level; nextPut: $}; crtab: level; nextPutAll: 'else {'; cr. - aStream tab: level; nextPut: $}; cr; tab: level; nextPutAll: 'else {'; cr. msgNode args first emitCCodeOn: aStream level: level + 1 generator: self. aStream tab: level; nextPut: $}] ifNotNil: [:const | (const ifTrue: [msgNode args last] ifFalse: [msgNode args first]) emitCCodeOn: aStream level: level generator: self]! Item was changed: ----- Method: CCodeGenerator>>generateIfFalseIfTrueAsArgument:on:indent: (in category 'C translation') ----- generateIfFalseIfTrueAsArgument: msgNode on: aStream indent: level "Generate the C code for this message onto the given stream." + (self nilOrBooleanConstantReceiverOf: msgNode receiver) - (self nilOrBooleanConstantReceiverOf: msgNode) ifNil: [aStream nextPut: $(. msgNode receiver emitCCodeAsArgumentOn: aStream level: level generator: self. aStream crtab: level + 1; nextPut: $?; space. msgNode args last emitCCodeAsArgumentOn: aStream level: level + 2 generator: self. aStream crtab: level + 1; nextPut: $:; space. msgNode args first emitCCodeAsArgumentOn: aStream level: level + 2 generator: self. aStream nextPut: $)] ifNotNil: [:const| (const ifTrue: [msgNode args last] ifFalse: [msgNode args first]) emitCCodeAsArgumentOn: aStream level: level generator: self]! Item was changed: ----- Method: CCodeGenerator>>generateIfTrue:on:indent: (in category 'C translation') ----- generateIfTrue: msgNode on: aStream indent: level "Generate the C code for this message onto the given stream." + (self nilOrBooleanConstantReceiverOf: msgNode receiver) - (self nilOrBooleanConstantReceiverOf: msgNode) ifNil: [aStream nextPutAll: 'if ('. msgNode receiver emitCCodeAsExpressionOn: aStream level: level generator: self. aStream nextPutAll: ') {'; cr. msgNode args first emitCCodeOn: aStream level: level + 1 generator: self. + aStream tab: level. - level timesRepeat: [ aStream tab ]. aStream nextPut: $}] ifNotNil: [:const | const ifTrue: [msgNode args first emitCCodeOn: aStream level: level generator: self]]! Item was changed: ----- Method: CCodeGenerator>>generateIfTrueAsArgument:on:indent: (in category 'C translation') ----- generateIfTrueAsArgument: msgNode on: aStream indent: level "Generate the C code for this message onto the given stream." + (self nilOrBooleanConstantReceiverOf: msgNode receiver) - (self nilOrBooleanConstantReceiverOf: msgNode) ifNil: [aStream nextPut: $(. msgNode receiver emitCCodeAsArgumentOn: aStream level: level generator: self. aStream crtab: level + 1; nextPut: $?; space. msgNode args first emitCCodeAsArgumentOn: aStream level: level + 2 generator: self. aStream crtab: level + 1; nextPutAll: ': 0)'] ifNotNil: [:const| const ifTrue: [msgNode args first emitCCodeAsArgumentOn: aStream level: level generator: self]]! Item was changed: ----- Method: CCodeGenerator>>generateIfTrueIfFalse:on:indent: (in category 'C translation') ----- generateIfTrueIfFalse: msgNode on: aStream indent: level "Generate the C code for this message onto the given stream." + (self nilOrBooleanConstantReceiverOf: msgNode receiver) - (self nilOrBooleanConstantReceiverOf: msgNode) ifNil: [aStream nextPutAll: 'if ('. msgNode receiver emitCCodeAsExpressionOn: aStream level: level generator: self. aStream nextPutAll: ') {'; cr. msgNode args first emitCCodeOn: aStream level: level + 1 generator: self. + aStream tab: level; nextPut: $}; crtab: level; nextPutAll: 'else {'; cr. - aStream tab: level; nextPut: $}; cr; tab: level; nextPutAll: 'else {'; cr. msgNode args last emitCCodeOn: aStream level: level + 1 generator: self. aStream tab: level; nextPut: $}] ifNotNil: [:const | (const ifTrue: [msgNode args first] ifFalse: [msgNode args last]) emitCCodeOn: aStream level: level generator: self]! Item was changed: ----- Method: CCodeGenerator>>generateIfTrueIfFalseAsArgument:on:indent: (in category 'C translation') ----- generateIfTrueIfFalseAsArgument: msgNode on: aStream indent: level "Generate the C code for this message onto the given stream." + (self nilOrBooleanConstantReceiverOf: msgNode receiver) - (self nilOrBooleanConstantReceiverOf: msgNode) ifNil: [aStream nextPut: $(. msgNode receiver emitCCodeAsExpressionOn: aStream level: level generator: self. aStream crtab: level + 1; nextPut: $?; space. msgNode args first emitCCodeAsArgumentOn: aStream level: level + 2 generator: self. aStream crtab: level + 1; nextPut: $:; space. msgNode args last emitCCodeAsArgumentOn: aStream level: level + 2 generator: self. aStream nextPut: $)] ifNotNil: [:const| (const ifTrue: [msgNode args first] ifFalse: [msgNode args last]) emitCCodeAsArgumentOn: aStream level: level generator: self]! Item was changed: ----- Method: CCodeGenerator>>nilOrBooleanConstantReceiverOf: (in category 'utilities') ----- nilOrBooleanConstantReceiverOf: aNode "Answer nil or the boolean constant that is the receiver of the given message send. Used to suppress conditional code when the condition is a translation-time constant." - | rcvr | generateDeadCode ifTrue:[^nil]. + (aNode isConstant + and: [#(true false) includes: aNode value]) ifTrue: + [^aNode value]. + aNode isSend ifTrue: + [((#(or: and:) includes: aNode selector) + and: [aNode args last isStmtList + and: [aNode args last statements size = 1]]) ifTrue: + [(self nilOrBooleanConstantReceiverOf: aNode receiver) ifNotNil: + [:rcvr| + (self nilOrBooleanConstantReceiverOf: aNode args last statements first) ifNotNil: + [:arg| + ^rcvr perform: aNode selector with: [arg]]]]. + ((#(= ~= < > <= >=) includes: aNode selector) + and: [(aNode receiver isConstant and: [aNode receiver value isInteger]) + and: [(aNode args first isConstant and: [aNode args first value isInteger])]]) ifTrue: + [^aNode receiver value perform: aNode selector with: aNode args first value]]. - rcvr := aNode isSend ifTrue: [aNode receiver] ifFalse: [aNode]. - (rcvr isConstant - and: [#(true false) includes: rcvr value]) ifTrue: - [^rcvr value]. - (rcvr isSend - and: [(#(or: and:) includes: rcvr selector) - and: [rcvr args last isStmtList - and: [rcvr args last statements size = 1]]]) ifTrue: - [(self nilOrBooleanConstantReceiverOf: rcvr receiver) ifNotNil: - [:rcvrRcvr| - (self nilOrBooleanConstantReceiverOf: rcvr args last statements first) ifNotNil: - [:rcvrArg| - ^rcvrRcvr perform: rcvr selector with: rcvrArg]]]. ^nil ! Item was removed: - ----- Method: CogVMSimulator>>objectBefore: (in category 'testing') ----- - objectBefore: addr - | prev | - objectMemory allObjectsDo: - [:oop| - "look here if debugging prev obj overlapping this one" - oop >= addr ifTrue: [^prev]. - prev := oop]. - ^0! Item was removed: - ----- Method: InterpreterSimulator>>objectBefore: (in category 'testing') ----- - objectBefore: addr - | oop prev | - oop := self firstObject. - [oop < endOfMemory] whileTrue: - [prev := oop. "look here if debugging prev obj overlapping this one" - oop := self objectAfter: oop. - oop >= addr ifTrue: [^ prev]]. - ^0! Item was removed: - ----- Method: NewspeakInterpreterSimulator>>objectBefore: (in category 'testing') ----- - objectBefore: addr - | oop prev | - oop := self firstObject. - [oop < endOfMemory] whileTrue: - [prev := oop. "look here if debugging prev obj overlapping this one" - oop := self objectAfter: oop. - oop >= addr ifTrue: [^ prev]]. - ^0! Item was removed: - ----- Method: ObjectMemory class>>declareCAsOop:in: (in category 'translation') ----- - declareCAsOop: arrayOfVariableNames in: aCCodeGenerator - "Declare the variables in arrayOfVariableNames with type representing position in object memory." - - arrayOfVariableNames - do: [:varName | aCCodeGenerator var: varName type: 'usqInt']! Item was changed: ----- Method: Spur64BitMemoryManager>>rawNumSlotsOf: (in category 'object access') ----- rawNumSlotsOf: objOop + <returnTypeC: #usqInt> + <inline: true> - <returnTypeC: #usqLong> ^(self longAt: objOop) asUnsignedLong >> self numSlotsFullShift! Item was changed: ----- Method: SpurMemoryManager class>>declareCVarsIn: (in category 'translation') ----- declareCVarsIn: aCCodeGenerator self declareCAsOop: #( memory freeStart scavengeThreshold newSpaceLimit pastSpaceStart lowSpaceThreshold freeOldSpaceStart endOfMemory sortedFreeChunks) in: aCCodeGenerator. self declareCAsUSqLong: (self allInstVarNames select: [:ivn| ivn endsWith: 'Usecs']) in: aCCodeGenerator. aCCodeGenerator + var: #freeListsMask type: #usqInt; var: #freeLists type: #'sqInt *'; var: #classTableBitmap type: #'unsigned char *'; var: #highestObjects type: #SpurCircularBuffer; var: #unscannedEphemerons type: #SpurContiguousObjStack. aCCodeGenerator var: #remapBuffer declareC: 'sqInt remapBuffer[RemapBufferSize + 1 /* ', (RemapBufferSize + 1) printString, ' */]'. aCCodeGenerator var: #extraRoots declareC: 'sqInt *extraRoots[ExtraRootsSize + 1 /* ', (ExtraRootsSize + 1) printString, ' */]'.! Item was changed: ----- Method: SpurMemoryManager>>objectAfter: (in category 'object enumeration') ----- objectAfter: objOop + <api> "Object parsing. 1. all objects have at least a word following the header, for a forwarding pointer. 2. objects with an overflow size have a preceeing word with a saturated slotSize. If the word following an object doesn't have a saturated size field it must be a single-header object. If the word following does have a saturated slotSize it must be the overflow size word." <inline: false> objOop < newSpaceLimit ifTrue: [(self isInEden: objOop) ifTrue: [^self objectAfter: objOop limit: freeStart]. (self isInSurvivorSpace: objOop) ifTrue: [^self objectAfter: objOop limit: pastSpaceStart]. ^self objectAfter: objOop limit: scavenger futureSurvivorStart]. ^self objectAfter: objOop limit: freeOldSpaceStart! Item was changed: ----- Method: SpurMemoryManager>>objectBefore: (in category 'object enumeration') ----- objectBefore: objOop + <api> | prev | prev := nil. objOop < newSpaceLimit ifTrue: [self allNewSpaceObjectsDo: [:o| o >= objOop ifTrue: [^prev]. prev := o]. ^prev]. self allOldSpaceObjectsDo: [:o| o >= objOop ifTrue: [^prev]. prev := o]. ^prev! Item was removed: - ----- Method: StackInterpreterSimulator>>objectBefore: (in category 'testing') ----- - objectBefore: addr - | prev | - objectMemory allObjectsDo: - [:oop| - "look here if debugging prev obj overlapping this one" - oop >= addr ifTrue: [^prev]. - prev := oop]. - ^0! |
Free forum by Nabble | Edit this page |