[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