[Vm-dev] VM Maker: VMMaker.oscog-cb.995.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Dec 19 10:44:31 UTC 2014
ClementBera uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-cb.995.mcz
==================== Summary ====================
Name: VMMaker.oscog-cb.995
Author: cb
Time: 19 December 2014, 11:39:18.871 am
UUID: 9e0e4367-220e-459a-807c-0878bfac2320
Ancestors: VMMaker.oscog-cb.994
Fixed a bug in inlined primitive sub (forgot to move to result register the result value).
Now that I understood that ra means registerArgument and rr registerReceiver, rewrote trinaryInlinePrimitive to use correct names.
=============== Diff against VMMaker.oscog-cb.994 ===============
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 |
(ra := backEnd availableRegisterOrNilFor: self liveRegisters) ifNil:
[self ssAllocateRequiredReg:
(ra := optStatus isReceiverResultRegLive
ifTrue: [Arg0Reg]
ifFalse: [ReceiverResultReg])].
ra = ReceiverResultReg ifTrue:
[optStatus isReceiverResultRegLive: false].
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: untaggedVal R: TempReg.
+ self SubR: ra R: TempReg.
+ self MoveR: TempReg R: ra ].
- self SubR: ra R: TempReg ].
[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!!!!)"
"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] -> [self genConvertSmallIntegerToIntegerInReg: ra.
self MoveCq: val R: TempReg.
self MoveXwr: ra R: TempReg R: ra ].
[65] -> [self genConvertSmallIntegerToIntegerInReg: ra.
self MoveCq: val R: TempReg.
self MoveXbr: ra R: TempReg R: ra ]
}
otherwise: [^EncounteredUnknownBytecode].
self ssPushRegister: ra.
^0!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genTrinaryInlinePrimitive: (in category 'inline primitive generators') -----
genTrinaryInlinePrimitive: 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>>#trinaryInlinePrimitive:"
| ra rr |
(rr := backEnd availableRegisterOrNilFor: self liveRegisters) ifNil:
[self ssAllocateRequiredReg:
(rr := optStatus isReceiverResultRegLive
ifTrue: [Arg0Reg]
ifFalse: [ReceiverResultReg])].
(ra := backEnd availableRegisterOrNilFor: (self liveRegisters bitOr: (self registerMaskFor: rr))) ifNil:
[self ssAllocateRequiredReg: (ra := Arg1Reg)].
(rr = ReceiverResultReg or: [ra = ReceiverResultReg]) ifTrue:
[optStatus isReceiverResultRegLive: false].
self ssTop popToReg: TempReg.
self ssPop: 1.
- self ssTop popToReg: rr.
- self ssPop: 1.
self ssTop popToReg: ra.
self ssPop: 1.
+ self ssTop popToReg: rr.
+ self ssPop: 1.
self ssPushRegister: TempReg.
+ self genConvertSmallIntegerToIntegerInReg: ra.
- self genConvertSmallIntegerToIntegerInReg: rr.
"Now: ra is the variable object, rr is long, TempReg holds the value to store."
prim caseOf: {
"0 - 1 pointerAt:put: and byteAt:Put:"
+ [0] -> [ self MoveR: TempReg Xwr: ra R: rr ].
- [0] -> [ self MoveR: TempReg Xwr: rr R: ra ].
[1] -> [ self genConvertSmallIntegerToIntegerInReg: TempReg.
+ self MoveR: TempReg Xbr: ra R: rr ]
- self MoveR: TempReg Xbr: rr R: ra ]
}
otherwise: [^EncounteredUnknownBytecode].
-
^0!
More information about the Vm-dev
mailing list