[Vm-dev] VM Maker: VMMaker.oscog-eem.2638.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Dec 27 06:02:18 UTC 2019
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2638.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.2638
Author: eem
Time: 26 December 2019, 10:02:05.572892 pm
UUID: ab76ca48-4c80-4fe7-964a-047389ca5746
Ancestors: VMMaker.oscog-eem.2637
Use three argument shifts to save an instruction in converting teh result of a division primitive into a SmallInteger. (We can do the same for the set tags case too, but have toi introduce OrCqRR or similar).
=============== Diff against VMMaker.oscog-eem.2637 ===============
Item was changed:
----- Method: CogObjectRepresentation>>genPrimitiveDiv (in category 'primitive generators') -----
genPrimitiveDiv
| jumpNotSI jumpIsSI jumpZero jumpExact jumpSameSign convert |
<var: #convert type: #'AbstractInstruction *'>
<var: #jumpIsSI type: #'AbstractInstruction *'>
<var: #jumpZero type: #'AbstractInstruction *'>
<var: #jumpNotSI type: #'AbstractInstruction *'>
<var: #jumpExact type: #'AbstractInstruction *'>
<var: #jumpSameSign type: #'AbstractInstruction *'>
cogit processorHasDivQuoRemAndMClassIsSmallInteger ifFalse:
[^UnimplementedPrimitive].
cogit genLoadArgAtDepth: 0 into: Arg0Reg.
cogit MoveR: Arg0Reg R: ClassReg.
cogit MoveR: Arg0Reg R: Arg1Reg.
jumpNotSI := self genJumpNotSmallInteger: Arg0Reg scratchReg: TempReg.
"We must shift away the tags, not just subtract them, so that the
overflow case doesn't actually overflow the machine instruction."
self genShiftAwaySmallIntegerTagsInScratchReg: ClassReg.
(cogit lastOpcode setsConditionCodesFor: JumpZero) ifFalse:
[cogit CmpCq: 0 R: ClassReg].
jumpZero := cogit JumpZero: 0.
cogit MoveR: ReceiverResultReg R: TempReg.
self genShiftAwaySmallIntegerTagsInScratchReg: TempReg.
cogit DivR: ClassReg R: TempReg Quo: TempReg Rem: ClassReg.
"If remainder is zero we must check for overflow."
cogit CmpCq: 0 R: ClassReg.
jumpExact := cogit JumpZero: 0.
"If arg and remainder signs are different we must round down."
cogit XorR: ClassReg R: Arg1Reg.
(cogit lastOpcode setsConditionCodesFor: JumpZero) ifFalse:
[cogit CmpCq: 0 R: Arg1Reg].
jumpSameSign := cogit JumpGreaterOrEqual: 0.
cogit SubCq: 1 R: TempReg.
jumpSameSign jmpTarget: (convert := cogit Label).
+ self genConvertIntegerInReg: TempReg toSmallIntegerInReg: ReceiverResultReg.
- self genConvertIntegerToSmallIntegerInReg: TempReg.
- cogit MoveR: TempReg R: ReceiverResultReg.
cogit genPrimReturn.
"test for overflow; the only case is SmallInteger minVal // -1"
jumpExact jmpTarget: cogit Label.
jumpIsSI := self genJumpIsSmallIntegerValue: TempReg scratch: Arg1Reg.
jumpIsSI jmpTarget: convert.
jumpZero jmpTarget: (jumpNotSI jmpTarget: cogit Label).
^CompletePrimitive!
Item was changed:
----- Method: CogObjectRepresentation>>genPrimitiveDivide (in category 'primitive generators') -----
genPrimitiveDivide
| jumpNotSI jumpZero jumpInexact jumpOverflow |
<var: #jumpNotSI type: #'AbstractInstruction *'>
<var: #jumpZero type: #'AbstractInstruction *'>
<var: #jumpInexact type: #'AbstractInstruction *'>
<var: #jumpOverflow type: #'AbstractInstruction *'>
cogit processorHasDivQuoRemAndMClassIsSmallInteger ifFalse:
[^UnimplementedPrimitive].
cogit genLoadArgAtDepth: 0 into: Arg0Reg.
cogit MoveR: Arg0Reg R: ClassReg.
jumpNotSI := self genJumpNotSmallInteger: Arg0Reg scratchReg: TempReg.
"We must shift away the tags, not just subtract them, so that the
overflow case doesn't actually overflow the machine instruction."
self genShiftAwaySmallIntegerTagsInScratchReg: ClassReg.
jumpZero := cogit JumpZero: 0.
cogit MoveR: ReceiverResultReg R: TempReg.
self genShiftAwaySmallIntegerTagsInScratchReg: TempReg.
cogit DivR: ClassReg R: TempReg Quo: TempReg Rem: ClassReg.
"If remainder is non-zero fail."
cogit CmpCq: 0 R: ClassReg.
jumpInexact := cogit JumpNonZero: 0.
"test for overflow; the only case is SmallInteger minVal / -1"
jumpOverflow := self genJumpNotSmallIntegerValue: TempReg scratch: Arg1Reg.
+ self genConvertIntegerInReg: TempReg toSmallIntegerInReg: ReceiverResultReg.
- self genConvertIntegerToSmallIntegerInReg: TempReg.
- cogit MoveR: TempReg R: ReceiverResultReg.
cogit genPrimReturn.
jumpOverflow jmpTarget: (jumpInexact jmpTarget: (jumpZero jmpTarget: (jumpNotSI jmpTarget: cogit Label))).
^CompletePrimitive!
Item was changed:
----- Method: CogObjectRepresentation>>genPrimitiveQuo (in category 'primitive generators') -----
genPrimitiveQuo
| convert jumpNotSI jumpZero jumpIsSI jumpExact |
<var: #convert type: #'AbstractInstruction *'>
<var: #jumpIsSI type: #'AbstractInstruction *'>
<var: #jumpZero type: #'AbstractInstruction *'>
<var: #jumpNotSI type: #'AbstractInstruction *'>
<var: #jumpExact type: #'AbstractInstruction *'>
cogit processorHasDivQuoRemAndMClassIsSmallInteger ifFalse:
[^UnimplementedPrimitive].
cogit genLoadArgAtDepth: 0 into: Arg0Reg.
cogit MoveR: Arg0Reg R: ClassReg.
jumpNotSI := self genJumpNotSmallInteger: Arg0Reg scratchReg: TempReg.
"We must shift away the tags, not just subtract them, so that the
overflow case doesn't actually overflow the machine instruction."
self genShiftAwaySmallIntegerTagsInScratchReg: ClassReg.
(cogit lastOpcode setsConditionCodesFor: JumpZero) ifFalse:
[cogit CmpCq: 0 R: ClassReg].
jumpZero := cogit JumpZero: 0.
cogit MoveR: ReceiverResultReg R: TempReg.
self genShiftAwaySmallIntegerTagsInScratchReg: TempReg.
cogit DivR: ClassReg R: TempReg Quo: TempReg Rem: ClassReg.
"If remainder is zero we must check for overflow."
cogit CmpCq: 0 R: ClassReg.
jumpExact := cogit JumpZero: 0.
convert := cogit Label.
+ self genConvertIntegerInReg: TempReg toSmallIntegerInReg: ReceiverResultReg.
- self genConvertIntegerToSmallIntegerInReg: TempReg.
- cogit MoveR: TempReg R: ReceiverResultReg.
cogit genPrimReturn.
jumpExact jmpTarget: cogit Label.
jumpIsSI := self genJumpIsSmallIntegerValue: TempReg scratch: Arg1Reg.
jumpIsSI jmpTarget: convert.
jumpZero jmpTarget: (jumpNotSI jmpTarget: cogit Label).
^CompletePrimitive!
Item was added:
+ ----- Method: CogObjectRepresentationFor32BitSpur>>genConvertIntegerInReg:toSmallIntegerInReg: (in category 'compile abstract instructions') -----
+ genConvertIntegerInReg: srcReg toSmallIntegerInReg: destReg
+ cogit LogicalShiftLeftCq: 1 R: srcReg R: destReg.
+ cogit AddCq: 1 R: destReg.
+ ^0!
Item was added:
+ ----- Method: CogObjectRepresentationFor64BitSpur>>genConvertIntegerInReg:toSmallIntegerInReg: (in category 'compile abstract instructions') -----
+ genConvertIntegerInReg: srcReg toSmallIntegerInReg: destReg
+ cogit LogicalShiftLeftCq: objectMemory numTagBits R: srcReg R: destReg.
+ cogit AddCq: 1 R: destReg.
+ ^0!
Item was changed:
----- Method: CogObjectRepresentationForSpur>>genPrimitiveSize (in category 'primitive generators') -----
genPrimitiveSize
| jumpImm jumpNotIndexable jumpIsContext |
"c.f. StackInterpreter>>stSizeOf: lengthOf:baseHeader:format: fixedFieldsOf:format:length:"
<var: #jumpImm type: #'AbstractInstruction *'>
<var: #jumpIsContext type: #'AbstractInstruction *'>
<var: #jumpNotIndexable type: #'AbstractInstruction *'>
jumpImm := self genJumpImmediate: ReceiverResultReg.
self
genGetSizeOf: ReceiverResultReg
into: ClassReg
formatReg: SendNumArgsReg
scratchReg: TempReg
abortJumpsInto: [:jnx :jic| jumpNotIndexable := jnx. jumpIsContext := jic].
+ self genConvertIntegerInReg: ClassReg toSmallIntegerInReg: ReceiverResultReg.
- self genConvertIntegerToSmallIntegerInReg: ClassReg.
- cogit MoveR: ClassReg R: ReceiverResultReg.
cogit genPrimReturn.
jumpImm jmpTarget: (jumpNotIndexable jmpTarget: (jumpIsContext jmpTarget: cogit Label)).
^CompletePrimitive!
Item was added:
+ ----- Method: CogObjectRepresentationForSqueakV3>>genConvertIntegerInReg:toSmallIntegerInReg: (in category 'compile abstract instructions') -----
+ genConvertIntegerInReg: srcReg toSmallIntegerInReg: destReg
+ cogit LogicalShiftLeftCq: 1 R: srcReg R: destReg.
+ cogit AddCq: 1 R: destReg.
+ ^0!
Item was changed:
----- Method: CogObjectRepresentationForSqueakV3>>genPrimitiveSize (in category 'primitive generators') -----
genPrimitiveSize
| jumpSI jumpNotIndexable jumpIsContext |
"c.f. StackInterpreter>>stSizeOf: lengthOf:baseHeader:format: fixedFieldsOf:format:length:"
<var: #jumpSI type: #'AbstractInstruction *'>
<var: #jumpIsContext type: #'AbstractInstruction *'>
<var: #jumpNotIndexable type: #'AbstractInstruction *'>
jumpSI := self genJumpSmallInteger: ReceiverResultReg.
self
genGetSizeOf: ReceiverResultReg
into: ClassReg
formatReg: SendNumArgsReg
scratchReg: TempReg
abortJumpsInto: [:jnx :jic| jumpNotIndexable := jnx. jumpIsContext := jic].
+ self genConvertIntegerInReg: ClassReg toSmallIntegerInReg: ReceiverResultReg.
- self genConvertIntegerToSmallIntegerInReg: ClassReg.
- cogit MoveR: ClassReg R: ReceiverResultReg.
cogit genPrimReturn.
jumpSI jmpTarget: (jumpNotIndexable jmpTarget: (jumpIsContext jmpTarget: cogit Label)).
^0!
More information about the Vm-dev
mailing list