[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