[Vm-dev] VM Maker: VMMaker.oscog-cb.2035.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Dec 12 18:37:37 UTC 2016


ClementBera uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-cb.2035.mcz

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

Name: VMMaker.oscog-cb.2035
Author: cb
Time: 12 December 2016, 7:37:09.935383 pm
UUID: 8dd1f98f-643b-4db0-b770-ae057679bef9
Ancestors: VMMaker.oscog-eem.2034

Added support for BranchIfInstanceOf in addition to BranchIfNotInstanceOf by using the sign bit of extB as annotation.

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

Item was added:
+ ----- Method: CogObjectRepresentationFor32BitSpur>>allImmediate:branchIf:instanceOfBehaviors:target: (in category 'sista support') -----
+ allImmediate: immediateMask branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp
+ 	< inline: true>	
+ 	<var: #targetFixUp type: #'AbstractInstruction *'>
+ 	self assert: immediateMask = objectMemory tagMask.
+ 	(self genJumpImmediate: reg) jmpTarget: targetFixUp.
+ 	^0!

Item was changed:
  ----- Method: CogObjectRepresentationFor32BitSpur>>allImmediate:branchIf:notInstanceOfBehaviors:target: (in category 'sista support') -----
  allImmediate: immediateMask branchIf: reg notInstanceOfBehaviors: arrayObj target: targetFixUp
- 	| jmpImmediate |
  	< inline: true>	
  	<var: #targetFixUp type: #'AbstractInstruction *'>
  	self assert: immediateMask = objectMemory tagMask.
+ 	(self genJumpNotImmediate: reg) jmpTarget: targetFixUp.
- 	jmpImmediate := self genJumpNotImmediate: reg.
- 	jmpImmediate jmpTarget: targetFixUp.
  	^0!

Item was added:
+ ----- Method: CogObjectRepresentationFor32BitSpur>>branch2CasesIf:instanceOfBehaviors:target: (in category 'sista support') -----
+ branch2CasesIf: reg instanceOfBehaviors: arrayObj target: targetFixUp
+ 	<inline: true>
+ 	self Jump: targetFixUp!

Item was added:
+ ----- Method: CogObjectRepresentationFor32BitSpur>>branchIf:hasImmediateTag:target: (in category 'sista support') -----
+ branchIf: reg hasImmediateTag: classIndex target: targetFixUp
+ 	<var: #targetFixUp type: #'AbstractInstruction *'>
+ 	| jmpImmediate|
+ 	<inline: true>
+ 	cogit MoveR: reg R: TempReg.
+ 	classIndex = objectMemory smallIntegerTag ifTrue:
+ 		[jmpImmediate := self genJumpSmallIntegerInScratchReg: TempReg].
+ 	classIndex = objectMemory characterTag ifTrue:
+ 		[jmpImmediate := self genJumpCharacterInScratchReg: TempReg].
+ 	jmpImmediate jmpTarget: targetFixUp!

Item was added:
+ ----- Method: CogObjectRepresentationFor64BitSpur>>allImmediate:branchIf:instanceOfBehaviors:target: (in category 'sista support') -----
+ allImmediate: immediateMask branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp
+ 	| tag1 tag2 |
+ 	<var: #targetFixUp type: #'AbstractInstruction *'>
+ 	immediateMask = objectMemory tagMask ifTrue: [(self genJumpImmediate: reg) jmpTarget: targetFixUp. ^0].
+ 	"TempReg holds the rcvr tag"
+ 	"In this case one immediate tag out of the three is not present in arrayObj."
+ 	tag1 := objectMemory classTagForClass: (objectMemory fetchPointer: 0 ofObject: arrayObj).
+ 	tag2 := objectMemory classTagForClass: (objectMemory fetchPointer: 1 ofObject: arrayObj).
+ 	(tag1 = objectMemory smallIntegerTag or: [tag2 = objectMemory smallIntegerTag]) ifTrue:
+ 		[(self genJumpSmallIntegerInScratchReg: TempReg) jmpTarget: targetFixUp].
+ 	(tag1 = objectMemory characterTag or: [tag2 = objectMemory characterTag]) ifTrue:
+ 		[(self genJumpCharacterInScratchReg: TempReg) jmpTarget: targetFixUp].
+ 	(tag1 = objectMemory smallFloatTag or: [tag2 = objectMemory smallFloatTag]) ifTrue:
+ 		[(self genJumpSmallFloatInScratchReg: TempReg) jmpTarget: targetFixUp].
+ 	^0!

Item was added:
+ ----- Method: CogObjectRepresentationFor64BitSpur>>branch2CasesIf:instanceOfBehaviors:target: (in category 'sista support') -----
+ branch2CasesIf: reg instanceOfBehaviors: arrayObj target: targetFixUp
+ 	| classObj tag1 tag2 |
+ 	< inline: true>		
+ 	
+ 	"look for the 2 tags requiring jmps"
+ 	0 to: (objectMemory numSlotsOf: arrayObj) - 1 do:
+ 		[:i|
+ 		 classObj := objectMemory fetchPointer: i ofObject: arrayObj.
+ 		 (objectMemory isImmediateClass: classObj)
+ 			ifTrue: [ tag1
+ 				ifNil: [tag1 := objectMemory classTagForClass: classObj ]
+ 				ifNotNil: [tag2 := objectMemory classTagForClass: classObj ] ] ].
+ 		
+ 	(tag1 = objectMemory smallIntegerTag or: [tag2 = objectMemory smallIntegerTag]) ifTrue:
+ 		[(self genJumpSmallIntegerInScratchReg: TempReg) jmpTarget: targetFixUp].
+ 	(tag1 = objectMemory characterTag or: [tag2 = objectMemory characterTag]) ifTrue:
+ 		[(self genJumpCharacterInScratchReg: TempReg) jmpTarget: targetFixUp].
+ 	(tag1 = objectMemory smallFloatTag or: [tag2 = objectMemory smallFloatTag]) ifTrue:
+ 		[(self genJumpSmallFloatInScratchReg: TempReg) jmpTarget: targetFixUp].
+ 	^ 0!

Item was added:
+ ----- Method: CogObjectRepresentationFor64BitSpur>>branchIf:hasImmediateTag:target: (in category 'sista support') -----
+ branchIf: reg hasImmediateTag: classIndex target: targetFixUp
+ 	<var: #targetFixUp type: #'AbstractInstruction *'>
+ 	| jmpImmediate|
+ 	<inline: true>
+ 	cogit MoveR: reg R: TempReg.
+ 	classIndex = objectMemory smallIntegerTag ifTrue:
+ 		[jmpImmediate := self genJumpSmallIntegerInScratchReg: TempReg].
+ 	classIndex = objectMemory characterTag ifTrue:
+ 		[jmpImmediate := self genJumpCharacterInScratchReg: TempReg].
+ 	classIndex = objectMemory smallFloatTag ifTrue:
+ 		[jmpImmediate := self genJumpSmallFloatInScratchReg: TempReg].
+ 	jmpImmediate jmpTarget: targetFixUp!

Item was added:
+ ----- Method: CogObjectRepresentationForSpur>>branchIf:instanceOfBehavior:target: (in category 'sista support') -----
+ branchIf: reg instanceOfBehavior: classObj target: targetFixUp
+ 	"Generate a branch if reg is an instance of classObj, otherwise fall-
+ 	 through. Cannot change the value of reg (may be used afterwards)."
+ 	| classIndex jmp |
+ 	<inline: true>
+ 	<var: #targetFixUp type: #'AbstractInstruction *'>
+ 	<var: #jmp type: #'AbstractInstruction *'>
+ 	classIndex := objectMemory classTagForClass: classObj.
+ 	(objectMemory isImmediateClass: classObj)
+ 		ifTrue:
+ 			[self branchIf: reg hasImmediateTag: classIndex target: targetFixUp ]
+ 		ifFalse:
+ 			[jmp := (self genJumpImmediate: reg) .
+ 			 self genGetClassIndexOfNonImm: reg into: TempReg.
+ 			 self genCmpClassIndex: classIndex R: TempReg.
+ 			 cogit JumpZero: targetFixUp.
+ 			jmp jmpTarget: cogit Label ].
+ 	^0!

Item was added:
+ ----- Method: CogObjectRepresentationForSpur>>branchIf:instanceOfBehaviors:target: (in category 'sista support') -----
+ branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp
+ 	"Generate a branch if reg is an instance of any of the classes in arrayObj,
+ 	 otherwise fall-through. reg should not be edited."
+ 	
+ 	| allImmediate noneImmediate immediateMask numNonImmediates classObj |
+ 	<var: #targetFixUp type: #'AbstractInstruction *'>
+ 	
+ 	"let me tell you all about it, let me falsify"
+ 	allImmediate := true. noneImmediate := true. immediateMask := 0. numNonImmediates := 0.
+ 	0 to: (objectMemory numSlotsOf: arrayObj) - 1 do:
+ 		[:i|
+ 		 classObj := objectMemory fetchPointer: i ofObject: arrayObj.
+ 		 (objectMemory isImmediateClass: classObj)
+ 			ifTrue:
+ 				[noneImmediate := false.
+ 				 immediateMask := immediateMask + (objectMemory classTagForClass: classObj)]
+ 			ifFalse:
+ 				[allImmediate := false.
+ 				 numNonImmediates := numNonImmediates + 1]].
+ 
+ 	noneImmediate ifTrue: [ ^ self noneImmediateBranchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp ].
+ 
+ 	allImmediate ifTrue: [ ^ self allImmediate: immediateMask branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp ].
+ 
+ 	^ self mixed: numNonImmediates branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp!

Item was added:
+ ----- Method: CogObjectRepresentationForSpur>>mixed:branchIf:instanceOfBehaviors:target: (in category 'sista support') -----
+ mixed: numNonImmediates branchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp
+ 	| jmpImmediate numCases classObj index jmp |
+ 	<var: #label type: #'AbstractInstruction *'>
+ 	<var: #jmpImmediate type: #'AbstractInstruction *'>
+ 	<var: #jmp type: #'AbstractInstruction *'>
+ 	<var: #targetFixUp type: #'AbstractInstruction *'>
+ 	numCases := objectMemory numSlotsOf: arrayObj.
+ 	jmpImmediate := self genJumpImmediate: reg.
+ 	
+ 	"Rcvr is non immediate"
+ 	self genGetClassIndexOfNonImm: reg into: TempReg.
+ 	index := 0.
+ 	0 to: numCases - 1 do:
+ 		[:i|
+ 			classObj := objectMemory fetchPointer: i ofObject: arrayObj.
+ 			(objectMemory isImmediateClass: classObj) ifFalse: [
+ 				self genCmpClassIndex: (objectMemory classTagForClass: classObj) R: TempReg.
+ 				cogit JumpZero: targetFixUp.
+ 				index := index + 1 ] ].
+ 	jmp := cogit Jump: 0.
+ 	
+ 	"Rcvr is immediate"
+ 	jmpImmediate jmpTarget: cogit Label.
+ 	numCases - numNonImmediates "num Immediates allowed"
+ 		caseOf:
+ 		{[ 1 ] -> [ "1 immediate needs to jump. Find it and jump."
+ 			0 to: numCases - 1 do:
+ 				[ :j |
+ 				classObj := objectMemory fetchPointer: j ofObject: arrayObj.
+ 				(objectMemory isImmediateClass: classObj) ifTrue: [
+ 					self branchIf: reg hasImmediateTag: (objectMemory classTagForClass: classObj) target: targetFixUp ] ] ] .
+ 		[ 2 ] -> [ "2 immediates needs to jump"
+ 				self branch2CasesIf: reg instanceOfBehaviors: arrayObj target: targetFixUp ] .
+ 		[ 3 ] -> [ "all 3 needs to jump" self Jump: targetFixUp ] }.
+ 	
+ 	jmp jmpTarget: self Label.
+ 	
+ 	^ 0
+ 		!

Item was added:
+ ----- Method: CogObjectRepresentationForSpur>>noneImmediateBranchIf:instanceOfBehaviors:target: (in category 'sista support') -----
+ noneImmediateBranchIf: reg instanceOfBehaviors: arrayObj target: targetFixUp
+ 	"All classes in arrayObj are not immediate"
+ 	| classObj jmp |
+ 	<var: #targetFixUp type: #'AbstractInstruction *'>
+ 	<var: #label type: #'AbstractInstruction *'>
+ 	<var: #jmp type: #'AbstractInstruction *'>
+ 	jmp := self genJumpImmediate: reg.
+ 	self genGetClassIndexOfNonImm: reg into: TempReg.
+ 	0 to: (objectMemory numSlotsOf: arrayObj) - 1 do:
+ 		[:i|
+ 		 classObj := objectMemory fetchPointer: i ofObject: arrayObj.
+ 		 self genCmpClassIndex: (objectMemory classTagForClass: classObj) R: TempReg.
+ 		cogit JumpZero: targetFixUp ].
+ 	jmp jmpTarget: self Label.
+ 	^0!

Item was changed:
  ----- Method: SistaCogit>>genExtJumpIfNotInstanceOfBehaviorsBytecode (in category 'bytecode generators') -----
  genExtJumpIfNotInstanceOfBehaviorsBytecode
  	"SistaV1: *	254		11111110	kkkkkkkk	jjjjjjjj		branch If Not Instance Of Behavior/Array Of Behavior kkkkkkkk (+ Extend A * 256, where Extend A >= 0) distance jjjjjjjj (+ Extend B * 256, where Extend B >= 0)"
  								
+ 	| reg literal distance targetFixUp inverse |
- 	| reg literal distance targetFixUp |
  	
  	"We loose the information of in which register is stack top 
  	when jitting the branch target so we need to flush everything. 
  	We could use a fixed register here...."
  	reg := self allocateRegForStackEntryAt: 0.
  	self ssTop popToReg: reg.
  	self ssFlushTo: simStackPtr. "flushed but the value is still in reg"
  	
  	self genPopStackBytecode.
  	
  	literal := self getLiteral: (extA * 256 + byte1).
  	extA := 0.
+ 	extB < 0 
+ 		ifTrue: [extB := extB + 128. inverse := true]
+ 		ifFalse: [inverse := false].
  	distance := extB * 256 + byte2.
  	extB := 0.
  	
  	targetFixUp := self cCoerceSimple: (self ensureFixupAt: bytecodePC + 3 + distance - initialPC) to: #'AbstractInstruction *'.
+ 	inverse
+ 		ifFalse: 
+ 			[(objectMemory isArrayNonImm: literal)
+ 				ifTrue: [objectRepresentation branchIf: reg notInstanceOfBehaviors: literal target: targetFixUp]
+ 				ifFalse: [objectRepresentation branchIf: reg notInstanceOfBehavior: literal target: targetFixUp] ]
+ 		ifTrue:
+ 			[(objectMemory isArrayNonImm: literal)
+ 				ifTrue: [objectRepresentation branchIf: reg instanceOfBehaviors: literal target: targetFixUp]
+ 				ifFalse: [objectRepresentation branchIf: reg instanceOfBehavior: literal target: targetFixUp]].
- 		
- 	(objectMemory isArrayNonImm: literal)
- 		ifTrue: [objectRepresentation branchIf: reg notInstanceOfBehaviors: literal target: targetFixUp]
- 		ifFalse: [objectRepresentation branchIf: reg notInstanceOfBehavior: literal target: targetFixUp].
  
+ 			
+ 	
  	^0!

Item was changed:
  ----- Method: StackInterpreter>>extJumpIfNotInstanceOfBehaviorsBytecode (in category 'sista bytecodes') -----
  extJumpIfNotInstanceOfBehaviorsBytecode
  	"254		11111110	kkkkkkkk	jjjjjjjj		branch If Not Instance Of Behavior/Array Of Behavior kkkkkkkk (+ Extend A * 256, where Extend A >= 0) distance jjjjjjjj (+ Extend B * 256, where Extend B >= 0)"
+ 	| tosClassTag literal distance inverse |
- 	| tosClassTag literal distance |
  	SistaVM ifFalse: [^self respondToUnknownBytecode].
+ 	extB < 0 
+ 		ifTrue: [extB := extB + 128. inverse := true]
+ 		ifFalse: [inverse := false].
  	tosClassTag := objectMemory fetchClassTagOf: self internalPopStack.
  	literal := self literal: extA << 8 + self fetchByte.
  	distance := extB << 8 + self fetchByte.
  	extA := 0.
  	extB := 0.
  	(objectMemory isArrayNonImm: literal)
  		ifTrue:
  			[0 to: (objectMemory numSlotsOf: literal) asInteger - 1 do: [:i |
  				tosClassTag = (objectMemory rawClassTagForClass: (objectMemory fetchPointer: i ofObject: literal))
+ 					ifTrue: [ 
+ 						inverse ifTrue: [ localIP := localIP + distance ].
+ 						^ self fetchNextBytecode ] ].
+ 			 inverse ifFalse: [localIP := localIP + distance].
- 					ifTrue: [ ^ self fetchNextBytecode ] ].
- 			 localIP := localIP + distance.
  			 ^ self fetchNextBytecode]
  		ifFalse:
  			[tosClassTag ~= (objectMemory rawClassTagForClass: literal) ifTrue:
+ 				[inverse ifFalse: [localIP := localIP + distance].
- 				[localIP := localIP + distance.
  				^ self fetchNextBytecode]].
+ 	inverse ifTrue: [localIP := localIP + distance].
  	self fetchNextBytecode!



More information about the Vm-dev mailing list