[Vm-dev] VM Maker: VMMaker.oscog-eem.945.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Nov 20 05:54:19 UTC 2014


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.945.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.945
Author: eem
Time: 19 November 2014, 9:49:43.751 pm
UUID: 8fea87e3-42d1-45d9-8f11-d49d0c9edccc
Ancestors: VMMaker.oscog-eem.944

Fix new primitiveBitShift (primitiveFailed => primitiveFail).
Fix integerObjectOfCharacterObject: for 64-bits.
Add bitInvert64.
Fix mem:mo:ve: for 64-bits.
Fix error in reverseDisplayFrom:to:
Use dsame leak checker for 64-bits as 32-bits.

=============== Diff against VMMaker.oscog-eem.944 ===============

Item was removed:
- ----- Method: CCodeGenerator>>generateBitInvert32:on:indent: (in category 'C translation') -----
- generateBitInvert32: msgNode on: aStream indent: level
- 	"Generate the C code for this message onto the given stream."
- 
- 	aStream nextPut: $~.
- 	self emitCExpression: msgNode receiver on: aStream!

Item was added:
+ ----- Method: CCodeGenerator>>generateBitInvert:on:indent: (in category 'C translation') -----
+ generateBitInvert: msgNode on: aStream indent: level
+ 	"Generate the C code for this message onto the given stream."
+ 
+ 	aStream nextPut: $~.
+ 	self emitCExpression: msgNode receiver on: aStream!

Item was changed:
  ----- Method: CCodeGenerator>>initializeCTranslationDictionary (in category 'C translation') -----
  initializeCTranslationDictionary 
  	"Initialize the dictionary mapping message names to actions for C code generation."
  
  	| pairs |
  	
  	translationDict := Dictionary new: 200.
  	pairs := #(
  	#&				#generateAnd:on:indent:
  	#|				#generateOr:on:indent:
  	#and:			#generateSequentialAnd:on:indent:
  	#or:			#generateSequentialOr:on:indent:
  	#not			#generateNot:on:indent:
  
  	#+				#generatePlus:on:indent:
  	#-				#generateMinus:on:indent:
  	#negated		#generateNegated:on:indent:
  	#*				#generateTimes:on:indent:
  	#/				#generateDivide:on:indent:
  	#//				#generateDivide:on:indent:
  	#\\				#generateModulo:on:indent:
  	#<<			#generateShiftLeft:on:indent:
  	#>>			#generateShiftRight:on:indent:
  	#min:			#generateMin:on:indent:
  	#max:			#generateMax:on:indent:
  	#between:and:	#generateBetweenAnd:on:indent:
  
  	#bitAnd:			#generateBitAnd:on:indent:
  	#bitOr:				#generateBitOr:on:indent:
  	#bitXor:			#generateBitXor:on:indent:
  	#bitShift:			#generateBitShift:on:indent:
  	#signedBitShift:	#generateSignedBitShift:on:indent:
+ 	#bitInvert32		#generateBitInvert:on:indent:
+ 	#bitInvert64		#generateBitInvert:on:indent:
- 	#bitInvert32		#generateBitInvert32:on:indent:
  	#bitClear:			#generateBitClear:on:indent:
  	#truncateTo:		#generateTruncateTo:on:indent:
  	#rounded			#generateRounded:on:indent:
  
  	#<				#generateLessThan:on:indent:
  	#<=			#generateLessThanOrEqual:on:indent:
  	#=				#generateEqual:on:indent:
  	#>				#generateGreaterThan:on:indent:
  	#>=			#generateGreaterThanOrEqual:on:indent:
  	#~=			#generateNotEqual:on:indent:
  	#==			#generateEqual:on:indent:
  	#~~			#generateNotEqual:on:indent:
  	#isNil			#generateIsNil:on:indent:
  	#notNil			#generateNotNil:on:indent:
  
  	#whileTrue: 	#generateWhileTrue:on:indent:
  	#whileFalse:	#generateWhileFalse:on:indent:
  	#whileTrue 	#generateDoWhileTrue:on:indent:
  	#whileFalse		#generateDoWhileFalse:on:indent:
  	#to:do:			#generateToDo:on:indent:
  	#to:by:do:		#generateToByDo:on:indent:
  	#repeat 		#generateRepeat:on:indent:
  
  	#ifTrue:			#generateIfTrue:on:indent:
  	#ifFalse:		#generateIfFalse:on:indent:
  	#ifTrue:ifFalse:	#generateIfTrueIfFalse:on:indent:
  	#ifFalse:ifTrue:	#generateIfFalseIfTrue:on:indent:
  
  	#ifNotNil:		#generateIfNotNil:on:indent:
  	#ifNil:			#generateIfNil:on:indent:
  	#ifNotNil:ifNil:	#generateIfNotNilIfNil:on:indent:
  	#ifNil:ifNotNil:	#generateIfNilIfNotNil:on:indent:
  
  	#at:				#generateAt:on:indent:
  	#at:put:			#generateAtPut:on:indent:
  	#basicAt:		#generateAt:on:indent:
  	#basicAt:put:	#generateAtPut:on:indent:
  
  	#integerValueOf:			#generateIntegerValueOf:on:indent:
  	#integerObjectOf:			#generateIntegerObjectOf:on:indent:
  	#isIntegerObject: 			#generateIsIntegerObject:on:indent:
  	#cCode:					#generateInlineCCode:on:indent:
  	#cCode:inSmalltalk:			#generateInlineCCode:on:indent:
  	#cPreprocessorDirective:	#generateInlineCPreprocessorDirective:on:indent:
  	#cppIf:ifTrue:ifFalse:		#generateInlineCppIfElse:on:indent:
  	#cppIf:ifTrue:				#generateInlineCppIfElse:on:indent:
  	#cCoerce:to:				#generateCCoercion:on:indent:
  	#cCoerceSimple:to:			#generateCCoercion:on:indent:
  	#addressOf:				#generateAddressOf:on:indent:
  	#addressOf:put:			#generateAddressOf:on:indent:
  	#asAddress:put:			#generateAsAddress:on:indent:
  	#signedIntFromLong		#generateSignedIntFromLong:on:indent:
  	#signedIntToLong			#generateSignedIntToLong:on:indent:
  	#signedIntFromShort		#generateSignedIntFromShort:on:indent:
  	#signedIntToShort			#generateSignedIntToShort:on:indent:
  	#preIncrement				#generatePreIncrement:on:indent:
  	#preDecrement			#generatePreDecrement:on:indent:
  	#inline:						#generateInlineDirective:on:indent:
  	#asFloat					#generateAsFloat:on:indent:
  	#asInteger					#generateAsInteger:on:indent:
  	#asUnsignedInteger		#generateAsUnsignedInteger:on:indent:
  	#asLong					#generateAsLong:on:indent:
  	#asUnsignedLong			#generateAsUnsignedLong:on:indent:
  	#asVoidPointer				#generateAsVoidPointer:on:indent:
  	#asSymbol					#generateAsSymbol:on:indent:
  	#flag:						#generateFlag:on:indent:
  	#anyMask:					#generateBitAnd:on:indent:
  	#noMask:					#generateNoMask:on:indent:
  	#raisedTo:					#generateRaisedTo:on:indent:
  	#touch:						#generateTouch:on:indent:
  
  	#bytesPerOop 				#generateBytesPerOop:on:indent:
  	#bytesPerWord 			#generateBytesPerWord:on:indent:
  	#wordSize		 			#generateBytesPerWord:on:indent:
  	#baseHeaderSize			#generateBaseHeaderSize:on:indent:
  	#minSmallInteger			#generateSmallIntegerConstant:on:indent:
  	#maxSmallInteger			#generateSmallIntegerConstant:on:indent:
  	
  	#sharedCodeNamed:inCase:		#generateSharedCodeDirective:on:indent:
  
  	#perform:							#generatePerform:on:indent:
  	#perform:with:						#generatePerform:on:indent:
  	#perform:with:with:					#generatePerform:on:indent:
  	#perform:with:with:with:				#generatePerform:on:indent:
  	#perform:with:with:with:with:		#generatePerform:on:indent:
  	#perform:with:with:with:with:with:	#generatePerform:on:indent:
  
  	#value								#generateValue:on:indent:
  	#value:								#generateValue:on:indent:
  	#value:value:						#generateValue:on:indent:
  	#value:value:value:					#generateValue:on:indent:
  
  	#deny:								#generateDeny:on:indent:
  
  	#shouldNotImplement				#generateSmalltalkMetaError:on:indent:
  	#shouldBeImplemented			#generateSmalltalkMetaError:on:indent:
  	#subclassResponsibility			#generateSmalltalkMetaError:on:indent:
  	).
  
  	1 to: pairs size by: 2 do: [:i |
  		translationDict at: (pairs at: i) put: (pairs at: i + 1)].
  
  	pairs := #(
  	#ifTrue:					#generateIfTrueAsArgument:on:indent:	
  	#ifFalse:				#generateIfFalseAsArgument:on:indent:
  	#ifTrue:ifFalse:			#generateIfTrueIfFalseAsArgument:on:indent:
  	#ifFalse:ifTrue:			#generateIfFalseIfTrueAsArgument:on:indent:
  	#ifNotNil:				#generateIfNotNilAsArgument:on:indent:	
  	#ifNil:					#generateIfNilAsArgument:on:indent:
  	#ifNotNil:ifNil:			#generateIfNotNilIfNilAsArgument:on:indent:
  	#ifNil:ifNotNil:			#generateIfNilIfNotNilAsArgument:on:indent:
  	#cCode:				#generateInlineCCodeAsArgument:on:indent:
  	#cCode:inSmalltalk:		#generateInlineCCodeAsArgument:on:indent:
  	#cppIf:ifTrue:ifFalse:	#generateInlineCppIfElseAsArgument:on:indent:
  	#cppIf:ifTrue:			#generateInlineCppIfElseAsArgument:on:indent:
  
  	#value					#generateValueAsArgument:on:indent:
  	#value:					#generateValueAsArgument:on:indent:
  	#value:value:			#generateValueAsArgument:on:indent:
  	).
  
  	asArgumentTranslationDict := Dictionary new: 8.
  	1 to: pairs size by: 2 do: [:i |
  		asArgumentTranslationDict at: (pairs at: i) put: (pairs at: i + 1)].
  !

Item was added:
+ ----- Method: Integer>>bitInvert64 (in category '*VMMaker-bit manipulation') -----
+ bitInvert64
+ 	"Answer the 64-bit complement of the receiver."
+ 
+ 	^self bitXor: 16rFFFFFFFFFFFFFFFF!

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveBitShift (in category 'arithmetic integer primitives') -----
  primitiveBitShift 
  	| integerReceiver integerArgument shifted |
  	integerArgument := self stackTop.
  	(objectMemory isIntegerObject: integerArgument) ifFalse:
+ 		[^self primitiveFail].
- 		[^self primitiveFailed].
  	integerReceiver := self stackValue: 1.
  	objectMemory wordSize = 4
  		ifTrue:
  			[integerReceiver := self positive32BitValueOf: integerReceiver]
  		ifFalse:
  			[integerReceiver := self signed64BitValueOf: integerReceiver].
  	self successful ifTrue:
  		[(integerArgument := objectMemory integerValueOf: integerArgument) >= 0
  			ifTrue: "Left shift -- must fail if we lose bits beyond 32"
  				[integerArgument <= objectMemory numSmallIntegerBits ifFalse:
+ 					[^self primitiveFail].
- 					[^self primitiveFailed].
  				shifted := integerReceiver << integerArgument.
  				(shifted >> integerArgument) = integerReceiver ifFalse:
+ 					[^self primitiveFail]]
- 					[^self primitiveFailed]]
  			ifFalse: "Right shift -- OK to lose bits"
  				[integerArgument >= objectMemory numSmallIntegerBits negated ifFalse:
+ 					[^self primitiveFail].
- 					[^self primitiveFailed].
  			shifted := integerReceiver >> (0 - integerArgument)].
  		shifted := (objectMemory isIntegerValue: shifted)
  					ifTrue: [objectMemory integerObjectOf: shifted]
  					ifFalse:
  						[objectMemory wordSize = 4
  							ifTrue: [self positive32BitIntegerFor: shifted]
  							ifFalse: [self signed64BitIntegerFor: shifted]].
  		self pop: 2 thenPush: shifted]!

Item was added:
+ ----- Method: Spur32BitMemoryManager>>integerObjectOfCharacterObject: (in category 'immediates') -----
+ integerObjectOfCharacterObject: oop
+ 	"Immediate characters are unsigned"
+ 	^(self cCoerceSimple: oop to: #'unsigned long') >> 1!

Item was added:
+ ----- Method: Spur64BitMemoryManager>>integerObjectOfCharacterObject: (in category 'immediates') -----
+ integerObjectOfCharacterObject: oop
+ 	"Immediate characters are unsigned"
+ 	^oop - (self characterTag - self smallIntegerTag)!

Item was added:
+ ----- Method: Spur64BitMemoryManager>>mem:mo:ve: (in category 'simulation only') -----
+ mem: destAddress mo: sourceAddress ve: bytes
+ 	<doNotGenerate>
+ 	| dst src  |
+ 	dst := destAddress asInteger.
+ 	src := sourceAddress asInteger.
+ 	"Emulate the c library memmove function"
+ 	self assert: bytes \\ 8 = 0.
+ 	destAddress > sourceAddress
+ 		ifTrue:
+ 			[bytes - 8 to: 0 by: -8 do:
+ 				[:i| self longAt: dst + i put: (self longAt: src + i)]]
+ 		ifFalse:
+ 			[0 to: bytes - 8 by: 8 do:
+ 				[:i| self longAt: dst + i put: (self longAt: src + i)]]!

Item was changed:
  ----- Method: SpurMemoryManager>>initialize (in category 'initialization') -----
  initialize
  	"We can put all initializations that set something to 0 or to false here.
  	 In C all global variables are initialized to 0, and 0 is false."
  	remapBuffer := Array new: RemapBufferSize.
  	remapBufferCount := extraRootCount := 0. "see below"
  	freeListsMask := totalFreeOldSpace := lowSpaceThreshold := 0.
  	checkForLeaks := 0.
  	needGCFlag := signalLowSpace := scavengeInProgress := marking := false.
  	becomeEffectsFlags := 0.
  	statScavenges := statIncrGCs := statFullGCs := 0.
  	statScavengeGCUsecs := statIncrGCUsecs := statFullGCUsecs := statGCEndUsecs := 0.
  	statSGCDeltaUsecs := statIGCDeltaUsecs := statFGCDeltaUsecs := 0.
  	statGrowMemory := statShrinkMemory := statRootTableCount := statSurvivorCount := 0.
  	statRootTableOverflows := statMarkCount := statSpecialMarkCount := statCompactPassCount := statCoalesces := 0.
  
  	"We can initialize things that are allocated but are lazily initialized."
  	unscannedEphemerons := SpurContiguousObjStack new.
  
  	"we can initialize things that are virtual in C."
  	scavenger := SpurGenerationScavengerSimulator new manager: self; yourself.
  	segmentManager := SpurSegmentManager new manager: self; yourself.
  
  	"We can also initialize here anything that is only for simulation."
+ 	heapMap := CogCheck32BitHeapMap new.
- 	heapMap := self wordSize = 4 ifTrue: [CogCheck32BitHeapMap new].
  
  	"N.B. We *don't* initialize extraRoots because we don't simulate it."!

Item was changed:
  ----- Method: SpurMemoryManager>>integerObjectOfCharacterObject: (in category 'immediates') -----
  integerObjectOfCharacterObject: oop
+ 	self subclassResponsibility!
- 	"Immediate characters are unsigned"
- 	^(self cCoerceSimple: oop to: #'unsigned long') >> 1!

Item was added:
+ ----- Method: SpurMemoryManager>>smallIntegerTag (in category 'cog jit support') -----
+ smallIntegerTag
+ 	^1!

Item was changed:
  ----- Method: StackInterpreter>>reverseDisplayFrom:to: (in category 'I/O primitive support') -----
  reverseDisplayFrom: startIndex to: endIndex 
  	"Reverse the given range of Display words (at different bit 
  	depths, this will reverse different numbers of pixels). Used to 
  	give feedback during VM activities such as garbage 
  	collection when debugging. It is assumed that the given 
  	word range falls entirely within the first line of the Display."
  	| displayObj displayBits w wordStartIndex wordEndIndex primFailCodeValue |
  	displayObj := objectMemory splObj: TheDisplay.
  	((objectMemory isPointers: displayObj) and: [(objectMemory lengthOf: displayObj) >= 4]) ifFalse: [^ nil].
  	w := objectMemory fetchPointer: 1 ofObject: displayObj.
  	displayBits := objectMemory fetchPointer: 0 ofObject: displayObj.
  	((objectMemory isImmediate: displayBits)
  	or: [(objectMemory isNonIntegerObject: w)
  	or: [objectMemory isPointersNonImm: displayBits]]) ifTrue: [^ nil].
  	wordStartIndex := startIndex * 4.
  	wordEndIndex := endIndex * 4 min: (objectMemory sizeBitsOf: displayBits).
  	displayBits := displayBits + objectMemory baseHeaderSize.
  	displayBits + wordStartIndex to: displayBits + wordEndIndex by: 4 do:
  		[:ptr | | reversed  |
  		reversed := (objectMemory long32At: ptr) bitXor: 4294967295.
+ 		objectMemory long32At: ptr put: reversed].
- 		objectMemory longAt: ptr put: reversed].
  	primFailCodeValue := primFailCode.
  	self initPrimCall.
  	self displayBitsOf: displayObj Left: 0 Top: 0 Right: (objectMemory integerValueOf: w) Bottom: 1.
  	self ioForceDisplayUpdate.
  	primFailCode := primFailCodeValue!



More information about the Vm-dev mailing list