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

commits at source.squeak.org commits at source.squeak.org
Tue Apr 14 18:12:29 UTC 2015


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

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

Name: VMMaker.oscog-eem.1193
Author: eem
Time: 14 April 2015, 11:10:47.632 am
UUID: 0b243ced-57fc-4dee-a6da-ec553b55eb40
Ancestors: VMMaker.oscog-eem.1192

Correct in-line primitive SmallInteger = ~=
missed in the last commit.

Fix slip in genGetNumBytesOf:into:.  And notice
that genGetFormatOf:into:baseHeaderIntoScratch:
et al can use byte access to get at format, as
intended in the Spur header design.

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

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: 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 LogicalShiftLeftCq: objectMemory shiftForWord R: destReg). 
+ 	self genGetFormatOf: srcReg into: TempReg baseHeaderIntoScratch: nil.
- 	"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: CogObjectRepresentationForSpur>>genGetFormatOf:into:baseHeaderIntoScratch: (in category 'compile abstract instructions') -----
  genGetFormatOf: sourceReg into: destReg baseHeaderIntoScratch: scratchReg
+ 	scratchReg
+ 		ifNil:
+ 			[self flag: #endianness.
+ 			 cogit MoveMb: 3 r: sourceReg R: destReg]
+ 		ifNotNil:
+ 			[cogit MoveMw: 0 r: sourceReg R: destReg.
+ 			 cogit MoveR: destReg R: scratchReg. "destReg := (at least) least significant half of self baseHeader: receiver"
+ 			 cogit LogicalShiftRightCq: objectMemory formatShift R: destReg].
- 	cogit MoveMw: 0 r: sourceReg R: destReg.
- 	scratchReg ifNotNil:
- 		[cogit MoveR: destReg R: scratchReg]. "destReg := (at least) least significant half of self baseHeader: receiver"
- 	cogit LogicalShiftRightCq: objectMemory formatShift R: destReg.
  	cogit AndCq: objectMemory formatMask R: destReg.	"formatReg := self formatOfHeader: destReg"
  	^0!

Item was changed:
  ----- Method: CogObjectRepresentationForSpur>>genGetFormatOf:into:leastSignificantHalfOfBaseHeaderIntoScratch: (in category 'compile abstract instructions') -----
  genGetFormatOf: sourceReg into: destReg leastSignificantHalfOfBaseHeaderIntoScratch: scratchRegOrNil
  	"Get the format of the object in sourceReg into destReg.  If scratchRegOrNil
  	 is not nil, load at least the least significant 32-bits (64-bits in 64-bits) of the
  	 header word, which contains the format, into scratchRegOrNil."
+ 	scratchRegOrNil
+ 		ifNil:
+ 			[self flag: #endianness.
+ 			 cogit MoveMb: 3 r: sourceReg R: destReg]
+ 		ifNotNil:
+ 			[cogit MoveMw: 0 r: sourceReg R: destReg.
+ 			 cogit MoveR: destReg R: scratchRegOrNil. "destReg := (at least) least significant half of self baseHeader: receiver"
+ 			 cogit LogicalShiftRightCq: objectMemory formatShift R: destReg].
- 	cogit MoveMw: 0 r: sourceReg R: destReg.
- 	scratchRegOrNil ifNotNil:
- 		[cogit MoveR: destReg R: scratchRegOrNil]. "destReg := (at least) least significant half of self baseHeader: receiver"
- 	cogit LogicalShiftRightCq: objectMemory formatShift R: destReg.
  	cogit AndCq: objectMemory formatMask R: destReg.	"formatReg := self formatOfHeader: destReg"
  	^0!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>genBinaryConstOpVarInlinePrimitive: (in category 'inline primitive generators') -----
  genBinaryConstOpVarInlinePrimitive: prim
  	"Const op var version of binary 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>>#binaryInlinePrimitive:"
  	| ra val untaggedVal adjust |
  	ra := self allocateOneRegister.
  	self ssTop popToReg: ra.
  	self ssPop: 1.
  	val := self ssTop constant.
  	self ssPop: 1.
  	untaggedVal := val - objectMemory smallIntegerTag.
  	prim caseOf: {
  		"0 through 6, +, -, *, /, //, \\, quo:, SmallInteger op SmallInteger => SmallInteger, no overflow"
  		[0]	->	[self AddCq: untaggedVal R: ra].
  		[1]	->	[self MoveCq: val R: TempReg.
  				 self SubR: ra R: TempReg.
  				 objectRepresentation genAddSmallIntegerTagsTo: TempReg.
  				 self MoveR: TempReg R: ra].
  		[2]	->	[objectRepresentation genRemoveSmallIntegerTagsInScratchReg: ra.
  				 self MoveCq: (objectMemory integerValueOf: val) R: TempReg.
  				 self MulR: TempReg R: ra.
  				 objectRepresentation genAddSmallIntegerTagsTo: ra].
  
  		"2016 through 2019, bitAnd:, bitOr:, bitXor, bitShift:, SmallInteger op SmallInteger => SmallInteger, no overflow"
  
  		"2032	through 2037, >, <, >=, <=. =, ~=, SmallInteger op SmallInteger => Boolean (flags?? then in jump bytecodes if ssTop is a flags value, just generate the instruction!!!!)"
  		"CmpCqR is SubRCq so everything is reversed, but because no CmpRCq things are reversed again and we invert the sense of the jumps."
  		[32] -> [ self CmpCq: val R: ra.
  				self genBinaryInlineComparison: JumpLessOrEqual opFalse: JumpGreater destReg: ra ].
  		[33] -> [ self CmpCq: val R: ra.
  				self genBinaryInlineComparison: JumpGreaterOrEqual opFalse: JumpLess destReg: ra ].
  		[34] -> [ self CmpCq: val R: ra.
  				self genBinaryInlineComparison: JumpLess opFalse: JumpGreaterOrEqual destReg: ra ].
  		[35] -> [ self CmpCq: val R: ra.
  				self genBinaryInlineComparison: JumpGreater opFalse: JumpLessOrEqual destReg: ra ].
  		[36] -> [ self CmpCq: val R: ra.
- 				self genBinaryInlineComparison: JumpNonZero opFalse: JumpZero destReg: ra ].
- 		[37] -> [ self CmpCq: val R: ra.
  				self genBinaryInlineComparison: JumpZero opFalse: JumpNonZero destReg: ra ].
+ 		[37] -> [ self CmpCq: val R: ra.
+ 				self genBinaryInlineComparison: JumpNonZero opFalse: JumpZero destReg: ra ].
  
  		"2064	through 2068, Pointer Object>>at:, Byte Object>>at:, Short16 Word Object>>at: LongWord32 Object>>at: Quad64Word Object>>at:. obj op 0-rel SmallInteger => oop"
  		[64] ->	[objectRepresentation genConvertSmallIntegerToIntegerInReg: ra.
  				adjust := (objectMemory baseHeaderSize >> objectMemory shiftForWord) - 1. "shift by baseHeaderSize and then move from 1 relative to zero relative"
  				adjust ~= 0 ifTrue: [ self AddCq: adjust R: ra. ]. 
  				self annotate: (self MoveCw: val R: TempReg) objRef: val.
  				self MoveXwr: ra R: TempReg R: ra].
  		[65] ->	[objectRepresentation genConvertSmallIntegerToIntegerInReg: ra.
  				adjust := objectMemory baseHeaderSize - 1. "shift by baseHeaderSize and then move from 1 relative to zero relative"
  				self AddCq: adjust R: ra.
  				self annotate: (self MoveCw: val R: TempReg) objRef: val.
  				self MoveXbr: ra R: TempReg R: ra.
  				objectRepresentation genConvertIntegerToSmallIntegerInReg: ra]
  	}
  	otherwise: [^EncounteredUnknownBytecode].
  	self ssPushRegister: ra.
  	^0!



More information about the Vm-dev mailing list