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!
vm-dev@lists.squeakfoundation.org