[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