[Vm-dev] VM Maker: VMMaker.oscog-eem.747.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Jun 2 15:07:13 UTC 2014
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.747.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.747
Author: eem
Time: 2 June 2014, 8:04:31.883 am
UUID: 488671d9-ac3b-4b24-8102-9a2623c7ce72
Ancestors: VMMaker.oscog-eem.746
In the indirection vector initialization peephole check that the
store temp index matches the indirect temp store index and
accept long store temp bytecodes.
=============== Diff against VMMaker.oscog-eem.746 ===============
Item was changed:
----- Method: StackToRegisterMappingCogit>>tryCollapseTempVectorInitializationOfSize: (in category 'peephole optimizations') -----
tryCollapseTempVectorInitializationOfSize: slots
+ "If the sequence of bytecodes is
- "Try and collapse
push: (Array new: 1)
popIntoTemp: tempIndex
pushConstant: const or pushTemp: n
popIntoTemp: 0 inVectorAt: tempIndex
+ collapse this into
+ tempAt: tempIndex put: {const or temp}
+ and answer true, otherwise answer false.
- into
- tempAt: tempIndex put: {const}.
One might think that we should look for a sequence of more than
+ one pushes and pops but this is extremely rare.
+ Exclude pushRcvr: n to avoid potential complications with context inst vars."
+ | pushArrayDesc storeArrayDesc pushValueDesc storeValueDesc tempIndex remoteTempIndex reg |
- one pushes and pops but this is extremely rare."
- | pushArrayDesc storeArrayDesc pushValueDesc storeValueDesc reg |
<var: #pushArrayDesc type: #'BytecodeDescriptor *'>
<var: #pushValueDesc type: #'BytecodeDescriptor *'>
<var: #storeArrayDesc type: #'BytecodeDescriptor *'>
<var: #storeValueDesc type: #'BytecodeDescriptor *'>
slots ~= 1 ifTrue:
[^false].
pushArrayDesc := self generatorAt: bytecodeSetOffset
+ (objectMemory
fetchByte: bytecodePC
ofObject: methodObj).
self assert: pushArrayDesc generator == #genPushNewArrayBytecode.
storeArrayDesc := self generatorAt: bytecodeSetOffset
+ (objectMemory
fetchByte: bytecodePC
+ pushArrayDesc numBytes
ofObject: methodObj).
+ storeArrayDesc generator == #genStoreAndPopTemporaryVariableBytecode
+ ifTrue:
+ [tempIndex := (objectMemory
+ fetchByte: bytecodePC + pushArrayDesc numBytes
+ ofObject: methodObj) bitAnd: 16r7]
+ ifFalse:
+ [storeArrayDesc generator == #genLongStoreAndPopTemporaryVariableBytecode ifFalse:
+ [^false].
+ tempIndex := objectMemory
+ fetchByte: bytecodePC + pushArrayDesc numBytes + 1
+ ofObject: methodObj].
- storeArrayDesc generator ~~ #genStoreAndPopTemporaryVariableBytecode ifTrue:
- [^false].
pushValueDesc := self generatorAt: bytecodeSetOffset
+ (objectMemory
fetchByte: bytecodePC
+ pushArrayDesc numBytes
+ storeArrayDesc numBytes
ofObject: methodObj).
+ (pushValueDesc generator == #genPushLiteralConstantBytecode
+ or: [pushValueDesc generator == #genPushQuickIntegerConstantBytecode
+ or: [pushValueDesc generator == #genPushTemporaryVariableBytecode]]) ifFalse:
- (pushValueDesc generator ~~ #genPushLiteralConstantBytecode
- and: [pushValueDesc generator ~~ #genPushQuickIntegerConstantBytecode
- and: [pushValueDesc generator ~~ #genPushTemporaryVariableBytecode]]) ifTrue:
[^false].
storeValueDesc := self generatorAt: bytecodeSetOffset
+ (objectMemory
fetchByte: bytecodePC
+ pushArrayDesc numBytes
+ storeArrayDesc numBytes
+ pushValueDesc numBytes
ofObject: methodObj).
+ remoteTempIndex := objectMemory
+ fetchByte: bytecodePC
+ + pushArrayDesc numBytes
+ + storeArrayDesc numBytes
+ + pushValueDesc numBytes
+ + 2
+ ofObject: methodObj.
+ (storeValueDesc generator == #genStoreAndPopRemoteTempLongBytecode
+ and: [tempIndex = remoteTempIndex]) ifFalse:
- storeValueDesc generator ~~ #genStoreAndPopRemoteTempLongBytecode ifTrue:
[^false].
objectRepresentation genNewArrayOfSize: 1 initialized: false.
self evaluate: pushValueDesc at: bytecodePC + pushArrayDesc numBytes + storeArrayDesc numBytes.
reg := self ssStorePop: true toPreferredReg: TempReg.
objectRepresentation
genStoreSourceReg: reg
slotIndex: 0
intoNewObjectInDestReg: ReceiverResultReg.
self ssPushRegister: ReceiverResultReg.
self evaluate: storeArrayDesc at: bytecodePC + pushArrayDesc numBytes.
bytecodePC := bytecodePC
"+ pushArrayDesc numBytes this gets added by nextBytecodePCFor:at:exts:in:"
+ storeArrayDesc numBytes
+ pushValueDesc numBytes
+ storeValueDesc numBytes.
^true!
More information about the Vm-dev
mailing list