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! |
Free forum by Nabble | Edit this page |