[Vm-dev] VM Maker: VMMaker.oscog-eem.506.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Nov 11 19:02:37 UTC 2013
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!
More information about the Vm-dev
mailing list