[Vm-dev] VM Maker: VMMaker.oscog-eem.1180.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Apr 10 23:01:12 UTC 2015


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1180.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.1180
Author: eem
Time: 10 April 2015, 3:59:26.259 pm
UUID: 7b05983e-40dd-497e-9b91-91c188ecc133
Ancestors: VMMaker.oscog-eem.1179

Do register allocation in the right place in
genUnaryInlinePrimitive:.

Fix overflow slot access in genGetNumSlotsOf:into:
et al.

=============== Diff against VMMaker.oscog-eem.1179 ===============

Item was changed:
  ----- Method: CogObjectRepresentationFor32BitSpur>>genGetNumBytesOf:into: (in category 'compile abstract instructions') -----
  genGetNumBytesOf: srcReg into: destReg
  	"Get the size in byte-sized slots of the object in srcReg into destReg.
  	 srcReg may equal destReg.
  	 destReg <- numSlots << self shiftForWord - (fmt bitAnd: 3).
  	 Assumes the object in srcReg has a byte format, i.e. 16 to 23 or 24 to 31 "
  	<var: #jmp type: #'AbstractInstruction *'>
  	| jmp |
  	self genGetRawSlotSizeOfNonImm: srcReg into: TempReg.
  	cogit CmpCq: objectMemory numSlotsMask R: TempReg.
  	jmp := cogit JumpLess: 0.
+ 	self genGetOverflowSlotsOf: srcReg into: destReg.
- 	cogit MoveMw: objectMemory wordSize negated r: srcReg R: destReg.
  	jmp jmpTarget: (cogit LogicalShiftLeftCq: objectMemory shiftForWord R: destReg). 
  	"Now: destReg = numSlots << shiftForWord"
  	cogit MoveMw: 0 r: srcReg R: TempReg.
  	cogit LogicalShiftRightCq: objectMemory formatShift R: TempReg.
  	cogit AndCq: objectMemory wordSize - 1 R: TempReg.
  	"Now: fmt bitAnd: 3 in TempReg"
  	cogit SubR: TempReg R: destReg.
  	^0!

Item was changed:
  ----- Method: CogObjectRepresentationFor32BitSpur>>genGetNumSlotsOf:into: (in category 'compile abstract instructions') -----
  genGetNumSlotsOf: srcReg into: destReg
  	"Get the size in word-sized slots of the object in srcReg into destReg.
  	 srcReg may equal destReg."
  	<var: #jmp type: #'AbstractInstruction *'>
  	| jmp |
+ 	self assert: srcReg ~= destReg.
+ 	self genGetRawSlotSizeOfNonImm: srcReg into: destReg.
+ 	cogit CmpCq: objectMemory numSlotsMask R: destReg.
- 	self genGetRawSlotSizeOfNonImm: srcReg into: TempReg.
- 	cogit CmpCq: objectMemory numSlotsMask R: TempReg.
  	jmp := cogit JumpLess: 0.
+ 	self genGetOverflowSlotsOf: srcReg into: destReg.
+ 	jmp jmpTarget: cogit Label.
- 	cogit MoveMw: objectMemory wordSize negated r: srcReg R: TempReg.
- 	jmp jmpTarget: (cogit MoveR: TempReg R: destReg).
  	^0!

Item was added:
+ ----- Method: CogObjectRepresentationFor32BitSpur>>genGetOverflowSlotsOf:into: (in category 'compile abstract instructions') -----
+ genGetOverflowSlotsOf: srcReg into: destReg
+ 	cogit MoveMw: objectMemory baseHeaderSize negated r: srcReg R: destReg.
+ 	^0!

Item was added:
+ ----- Method: CogObjectRepresentationForSpur>>genGetOverflowSlotsOf:into: (in category 'compile abstract instructions') -----
+ genGetOverflowSlotsOf: srcReg into: destReg
+ 	self subclassResponsibility!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>genUnaryInlinePrimitive: (in category 'inline primitive generators') -----
  genUnaryInlinePrimitive: prim
  	"Unary inline primitives."
  	"SistaV1: 248		11111000 	iiiiiiii		mjjjjjjj		Call Primitive #iiiiiiii + (jjjjjjj * 256) m=1 means inlined primitive, no hard return after execution.
  	 See EncoderForSistaV1's class comment and StackInterpreter>>#unaryInlinePrimitive:"
  	| rcvrReg resultReg |
  	self ssTop type = SSRegister
  		ifTrue: [rcvrReg := self ssTop register]
  		ifFalse:
  			[(rcvrReg := backEnd availableRegisterOrNilFor: self liveRegisters) ifNil:
  				[self ssAllocateRequiredReg:
  					(rcvrReg := optStatus isReceiverResultRegLive
  							ifTrue: [Arg0Reg]
  							ifFalse: [ReceiverResultReg])]].
- 	self ssTop popToReg: rcvrReg.
- 	self ssPop: 1.
  	(resultReg := backEnd availableRegisterOrNilFor: (self liveRegisters bitOr: (self registerMaskFor: rcvrReg))) ifNil:
  		[self ssAllocateRequiredReg: (resultReg := Arg1Reg)].
+ 	self ssTop popToReg: rcvrReg.
+ 	self ssPop: 1.
  	prim
  		caseOf: {
+ 					"00		unchecked class"
  			[1] ->	"01		unchecked pointer numSlots"
  				[objectRepresentation
  					genGetNumSlotsOf: rcvrReg into: resultReg;
  					genConvertIntegerToSmallIntegerInReg: resultReg].
+ 					"02		unchecked pointer basicSize"
+ 			[3] ->	"03		unchecked byte numBytes"
- 			[3] ->	"03 unchecked byte numBytes"
  				[objectRepresentation
  					genGetNumBytesOf: rcvrReg into: resultReg;
  					genConvertIntegerToSmallIntegerInReg: resultReg].
+ 					"04		unchecked short16Type format numShorts"
+ 					"05		unchecked word32Type format numWords"
+ 					"06		unchecked doubleWord64Type format numDoubleWords"
  				  }
  		otherwise:
  			[^EncounteredUnknownBytecode]..
  	self ssPushRegister: resultReg.
  	^0!



More information about the Vm-dev mailing list