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

commits at source.squeak.org commits at source.squeak.org
Tue Mar 31 23:47:58 UTC 2015


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

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

Name: VMMaker.oscog-eem.1140
Author: eem
Time: 31 March 2015, 4:45:47.233 pm
UUID: b5079ad1-0ca2-4184-bb6f-4c61f4390d1c
Ancestors: VMMaker.oscog-eem.1139

Fix code generation for 
ARM concretizeMoveMbrR/RMbr

Fix in-image compilation for ARM and varBaseReg.
Beware!  There may be discrepancies between
in-image compiled code and simulated compiled
code.  We need to reduce these, ideally to none.

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

Item was changed:
  ----- Method: CogARMCompiler>>concretizeMoveMbrR (in category 'generate machine code - concretize') -----
  concretizeMoveMbrR
  	"Will get inlined into concretizeAt: switch."
  	"ldrb destReg, [srcReg, #immediate] or ldrb destReg, [srcReg, ConcreteIPReg]"
  	<inline: true>
  	| srcReg offset destReg instrOffset|
  	offset := operands at: 0.
  	srcReg := self concreteRegister: (operands at: 1).
  	destReg := self concreteRegister: (operands at: 2).
  	self is12BitValue: offset
  		ifTrue:
  			[ :u :immediate | 
  			self machineCodeAt: 0 "ldrb destReg, [srcReg, #immediate]"
  				put: (self ldrb: destReg rn: srcReg plus: u imm: immediate).
  			^machineCodeSize := 4]
  		ifFalse:
  			[(self isAddressRelativeToVarBase: offset)
  				ifTrue:
+ 					[self machineCodeAt: 0 put: (self adds: ConcreteIPReg rn: ConcreteVarBaseReg imm: offset - cogit varBaseAddress ror: 0).
- 					[self machineCodeAt: 0 put: (self ldr: ConcreteIPReg rn: ConcreteVarBaseReg plusImm: offset - cogit varBaseAddress).
  					 instrOffset := 4]
  				ifFalse:
  					[instrOffset := self at: 0 moveCw: offset intoR: ConcreteIPReg].
  			 "ldrb destReg, [srcReg, ConcreteIPReg]"
  			 self machineCodeAt: instrOffset put: (self ldrb: destReg rn: srcReg rm: ConcreteIPReg).
  			 ^machineCodeSize := instrOffset + 4]!

Item was changed:
  ----- Method: CogARMCompiler>>concretizeMoveRMbr (in category 'generate machine code - concretize') -----
  concretizeMoveRMbr
  	"Will get inlined into concretizeAt: switch."
  	<inline: true>
  	| srcReg offset baseReg instrOffset|
  	srcReg := self concreteRegister: (operands at: 0).
  	offset := operands at: 1.
  	baseReg := self concreteRegister: (operands at: 2).
  	self is12BitValue: offset
  		ifTrue:
  			[ :u :immediate | 
  			self machineCodeAt: 0 "strb 	srcReg, [baseReg, #immediate]"
  				put: (self strb: srcReg rn: baseReg plus: u imm: immediate).
  			^machineCodeSize := 4]
  		ifFalse:
  			[(self isAddressRelativeToVarBase: offset)
  				ifTrue:
+ 					[self machineCodeAt: 0 put: (self adds: ConcreteIPReg rn: ConcreteVarBaseReg imm: offset - cogit varBaseAddress ror: 0).
- 					[self machineCodeAt: 0 put: (self ldr: ConcreteIPReg rn: ConcreteVarBaseReg plusImm: offset - cogit varBaseAddress).
  					 instrOffset := 4]
  				ifFalse:
  					[instrOffset := self at: 0 moveCw: offset intoR: ConcreteIPReg].
  			"strb 	srcReg, [baseReg, ConcreteIPReg]"
  			self machineCodeAt: instrOffset put: (self strb: srcReg rn: baseReg rm: ConcreteIPReg).
  			^machineCodeSize := instrOffset + 4 ]!

Item was changed:
  ----- Method: Cogit>>fakeAddressFor:index: (in category 'initialization') -----
  fakeAddressFor: anObject index: index
  	"Answer a fake address for some variable based on some index.
  	 The index will usually be the size of simulatedAddresses, but
  	 in determining the varBaseAddress we take a guess at the final
  	 size of simulatedAddresses."
  	<doNotGenerate>
  	^(index + 101 * objectMemory wordSize) negated
+ 		bitAnd: ((backEnd notNil
+ 				and: [backEnd wantsNearAddressFor: anObject])
- 		bitAnd: ((backEnd wantsNearAddressFor: anObject)
  					ifTrue: [self addressSpaceMask]
  					ifFalse: [self allButTopBitOfAddressSpaceMask])!

Item was changed:
  ----- Method: CurrentImageCoInterpreterFacade>>addressForLabel: (in category 'labels') -----
  addressForLabel: l
+ 	^variables
+ 		at: l
+ 		ifAbsentPut:
+ 			[(coInterpreter class instVarIndexFor: l ifAbsent: [objectMemory class instVarIndexFor: l ifAbsent: [#(CStackPointer CFramePointer) includes: l]])
+ 				ifNil: [variables size * 4 + self variablesBase]
+ 				ifNotNil: [cogit fakeAddressFor: l index: (variables keys select: [:k| (coInterpreter class instVarIndexFor: l ifAbsent: []) notNil]) size]]!
- 	^variables at: l ifAbsentPut: [variables size * 4 + self variablesBase]!

Item was changed:
  ----- Method: CurrentImageCoInterpreterFacade>>cogit: (in category 'initialize-release') -----
  cogit: aCogit
  	cogit := aCogit.
+ 	cogit objectMemory ifNil:
+ 		[cogit instVarNamed: 'objectMemory' put: objectMemory].
  	coInterpreter cogit: aCogit.
  	(objectMemory respondsTo: #cogit:) ifTrue:
  		[objectMemory cogit: aCogit].
  	(objectMemory respondsTo: #coInterpreter:) ifTrue:
+ 		[objectMemory coInterpreter: coInterpreter].
+ 	#('stackLimit') do:
+ 		[:l| self addressForLabel: l].
+ 	self initializeObjectMap!
- 		[objectMemory coInterpreter: coInterpreter]!

Item was changed:
  ----- Method: CurrentImageCoInterpreterFacade>>initialize (in category 'initialize-release') -----
  initialize
  	memory := (VMBIGENDIAN
  					ifTrue: [Bitmap]
  					ifFalse: [LittleEndianBitmap]) new: 1024*1024/4.
  	objectMemory := self class objectMemoryClass simulatorClass new.
  	objectMemory memory: memory.
  	objectMemory
  		initializeFreeSpaceForFacadeFrom: self startOfMemory
  		to: self variablesBase.
  	coInterpreter := CoInterpreter new.
  	coInterpreter
  		instVarNamed: 'objectMemory'
  			put: objectMemory;
  		instVarNamed: 'primitiveTable'
  			put: (CArrayAccessor on: CoInterpreter primitiveTable copy).
+ 	variables := Dictionary new!
- 	variables := Dictionary new.
- 	#('stackLimit') do:
- 		[:l| self addressForLabel: l].
- 	self initializeObjectMap!



More information about the Vm-dev mailing list