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

commits at source.squeak.org commits at source.squeak.org
Sat Apr 18 01:10:04 UTC 2015


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

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

Name: VMMaker.oscog-eem.1212
Author: eem
Time: 17 April 2015, 6:08:18.528 pm
UUID: 57841054-6567-44f4-9719-ab98551d8f2a
Ancestors: VMMaker.oscog-cb.1211

Fix C generation issues with recent changes.

=============== Diff against VMMaker.oscog-cb.1211 ===============

Item was changed:
  ----- Method: CogObjectRepresentation>>isUnannotatableConstant: (in category 'compile abstract instructions') -----
  isUnannotatableConstant: simStackEntry
  	<inline: true>
+ 	<var: 'simStackEntry' type: #'CogSimStackEntry *'>
  	^ simStackEntry type = SSConstant 
  		and: [(self shouldAnnotateObjectReference: simStackEntry constant) not ]!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>genMoveConstant:R: (in category 'bytecode generator support') -----
+ genMoveConstant: constant R: reg
- genMoveConstant: constant R: register
  	<inline: true>
  	^ (objectRepresentation shouldAnnotateObjectReference: constant)
+ 		ifTrue: [ (self annotate: (self MoveCw: constant R: reg) objRef: constant) ]
+ 		ifFalse: [ self MoveCq: constant R: reg ]
- 		ifTrue: [ (self annotate: (self MoveCw: constant R: register) objRef: constant) ]
- 		ifFalse: [ self MoveCq: constant R: register ]
  	
  	!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>genMoveFalseR: (in category 'bytecode generator support') -----
+ genMoveFalseR: reg
- genMoveFalseR: register
  	<inline: true>
+ 	^ self genMoveConstant: objectMemory falseObject R: reg
- 	^ self genMoveConstant: objectMemory falseObject R: register
  	!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>genMoveTrueR: (in category 'bytecode generator support') -----
+ genMoveTrueR: reg
- genMoveTrueR: register
  	<inline: true>
+ 	^ self genMoveConstant: objectMemory trueObject R: reg
- 	^ self genMoveConstant: objectMemory trueObject R: register
  	!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>genSpecialSelectorEqualsEqualsWithForwarders (in category 'bytecode generators') -----
  genSpecialSelectorEqualsEqualsWithForwarders
  	| primDescriptor nextPC nExts branchDescriptor unforwardRcvr argReg targetBytecodePC
  	unforwardArg  rcvrReg jumpNotEqual jumpEqual postBranchPC label fixup |
+ 	<var: #fixup type: #'BytecodeFixup *'>
  	<var: #jumpEqual type: #'AbstractInstruction *'>
  	<var: #jumpNotEqual type: #'AbstractInstruction *'>
  	<var: #primDescriptor type: #'BytecodeDescriptor *'>
  	<var: #branchDescriptor type: #'BytecodeDescriptor *'>
  	
  	primDescriptor := self generatorAt: byte0.
  
  	nextPC := bytecodePC + primDescriptor numBytes.
  	nExts := 0.
  	[branchDescriptor := self generatorAt: (objectMemory fetchByte: nextPC ofObject: methodObj) + bytecodeSetOffset.
  	 branchDescriptor isExtension] whileTrue:
  		[nExts := nExts + 1.
  		 nextPC := nextPC + branchDescriptor numBytes].
  	"If branching the stack must be flushed for the merge"
  	(branchDescriptor isBranchTrue or: [branchDescriptor isBranchFalse]) ifTrue:
  		[self ssFlushTo: simStackPtr - 2].
  
  	unforwardRcvr := (objectRepresentation isUnannotatableConstant: (self ssValue: 1)) not.
  	unforwardArg := (objectRepresentation isUnannotatableConstant: self ssTop) not.
  
  	"if the rcvr or the arg is an annotable constant, we need to push it to a register 
  	else the forwarder check can't jump back to the comparison after unforwarding the constant"
  	unforwardArg
  		ifTrue: 
  			[unforwardRcvr
  				ifTrue:
  					[self allocateTwoRegistersInto: [:rTop :rNext| argReg := rTop. rcvrReg := rNext].
  					 self ssTop popToReg: argReg.
  					 (self ssValue:1) popToReg: rcvrReg]
  				ifFalse:
  					[argReg := self allocateOneRegister.
  					 self ssTop popToReg: argReg]]
  		ifFalse:
  			[self assert: unforwardRcvr.
  			 rcvrReg := self allocateOneRegister.
  			 (self ssValue:1) popToReg: rcvrReg].
  
  	label := self Label.
  	
  	"Here we can use Cq because the constant does not need to be annotated"
  	self assert: (unforwardArg not or: [argReg notNil]).
  	self assert: (unforwardRcvr not or: [rcvrReg notNil]).
  	unforwardArg 
  		ifFalse: [ self CmpCq: self ssTop constant R: rcvrReg ]
  		ifTrue: [ unforwardRcvr
  			ifFalse: [ self CmpCq: (self ssValue: 1) constant R: argReg ]
  			ifTrue: [ self CmpR: argReg R: rcvrReg ] ].
  			 
  	self ssPop: 2.
  
  	"If not followed by a branch, resolve to true or false."
  	(branchDescriptor isBranchTrue or: [branchDescriptor isBranchFalse]) ifFalse:
  		[jumpEqual := self JumpZero: 0.
  		 unforwardArg ifTrue: [ objectRepresentation genEnsureOopInRegNotForwarded: argReg scratchReg: TempReg jumpBackTo: label ].
  		 unforwardRcvr ifTrue: [ objectRepresentation genEnsureOopInRegNotForwarded: rcvrReg scratchReg: TempReg jumpBackTo: label ].
  		 self genMoveFalseR: rcvrReg.
  		 jumpNotEqual := self Jump: 0.
  		 jumpEqual jmpTarget: (self genMoveTrueR: rcvrReg).
  		 jumpNotEqual jmpTarget: self Label.
  		 self ssPushRegister: rcvrReg.
  		 ^0].
  
  	"Further since there is a following conditional jump bytecode, define
  	 non-merge fixups and leave the cond bytecode to set the mergeness."
  	targetBytecodePC := nextPC
  							+ branchDescriptor numBytes
  							+ (self spanFor: branchDescriptor at: nextPC exts: nExts in: methodObj).
  	postBranchPC := nextPC + branchDescriptor numBytes.
  	(self fixupAt: nextPC - initialPC) targetInstruction = 0
  		ifTrue: "The next instruction is dead.  we can skip it."
  			[deadCode := true.
  		 	 self ensureFixupAt: targetBytecodePC - initialPC.
  			 self ensureFixupAt: postBranchPC - initialPC]
  		ifFalse:
  			[self ssPushConstant: objectMemory trueObject]. "dummy value"
  
  	self assert: (unforwardArg or: [ unforwardRcvr ]).
  	branchDescriptor isBranchTrue ifTrue: 
  		[ deadCode ifFalse: [ fixup := self ensureNonMergeFixupAt: postBranchPC - initialPC ].
  		self JumpZero:  (self ensureNonMergeFixupAt: targetBytecodePC - initialPC) asUnsignedInteger.
  		unforwardArg ifTrue: [ (deadCode or: [ unforwardRcvr ]) 
  			ifTrue: [ objectRepresentation genEnsureOopInRegNotForwarded: argReg scratchReg: TempReg jumpBackTo: label ]
  			ifFalse: [ objectRepresentation 
  				genEnsureOopInRegNotForwarded: argReg 
  				scratchReg: TempReg 
  				ifForwarder: label
  				ifNotForwarder: fixup ] ].
  		unforwardRcvr ifTrue: [ deadCode 
  			ifTrue: [objectRepresentation genEnsureOopInRegNotForwarded: rcvrReg scratchReg: TempReg jumpBackTo: label ]
  			ifFalse: [objectRepresentation 
  				genEnsureOopInRegNotForwarded: rcvrReg 
  				scratchReg: TempReg 
  				ifForwarder: label
  				ifNotForwarder: fixup ] ] ].
  	branchDescriptor isBranchFalse ifTrue: 
  		[ fixup := (self ensureNonMergeFixupAt: targetBytecodePC - initialPC) asUnsignedInteger.
  		self JumpZero: (self ensureNonMergeFixupAt: postBranchPC - initialPC).
  		unforwardArg ifTrue: [ unforwardRcvr 
  			ifFalse: [objectRepresentation 
  				genEnsureOopInRegNotForwarded: argReg 
  				scratchReg: TempReg 
  				ifForwarder: label
  				ifNotForwarder: fixup ]
  			ifTrue: [ objectRepresentation genEnsureOopInRegNotForwarded: rcvrReg scratchReg: TempReg jumpBackTo: label ] ].
  		unforwardRcvr ifTrue: 
  			[ objectRepresentation 
  				genEnsureOopInRegNotForwarded: rcvrReg 
  				scratchReg: TempReg 
  				ifForwarder: label
  				ifNotForwarder: fixup ].
  		"Not reached"].
  	^0!



More information about the Vm-dev mailing list