[Vm-dev] VM Maker: VMMaker.oscogSPC-cb.2105.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Jan 19 17:00:07 UTC 2017
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscogSPC-cb.2105.mcz
==================== Summary ====================
Name: VMMaker.oscogSPC-cb.2105
Author: eem
Time: 19 January 2017, 8:59:20.328004 am
UUID: 1917b0eb-51a0-442f-abae-5c3b09d7b82d
Ancestors: VMMaker.oscogSPC-eem.2102, VMMaker.oscog-cb.2105
Temporary branch for SpurPlanningCompactor as default compactor. Otherwise the same as VMMaker.oscog-cb.2105.
Set deadCode to true in trap bytecode to avoid generating merge machne code that is never reached.
Fixed a bug in eventualTargetOf: where nExts was misscomputed, leading jumps targeting jumps with extensions to be incorrectly computed.
Fixed a bug where branchIfNotInstanceOf: span function misscomputed the distance when ExtB is negated to inverse the branch.
Fixed CharacterAsInteger inlined primitive.
=============== Diff against VMMaker.oscogSPC-eem.2102 ===============
Item was changed:
----- Method: SimpleStackBasedCogit>>v4:Long:BranchIfNotInstanceOf:Distance: (in category 'span functions') -----
v4: descriptor Long: pc BranchIfNotInstanceOf: nExts Distance: aMethodObj
"** 254 11111110 kkkkkkkk jjjjjjjj branch If Not Instance Of Behavior/Array Of Behavior kkkkkkkk (+ Extend A * 256, where Extend A >= 0) distance jjjjjjjj (+ Extend B * 256, where Extend B >= 0)"
<var: #descriptor type: #'BytecodeDescriptor *'>
| extBValue |
self assert: nExts >= 0.
self parseV4Exts: nExts priorTo: pc in: aMethodObj into: [:ea :eb| extBValue := eb].
+ extBValue < 0 ifTrue: [extBValue := extBValue + 128].
^(objectMemory fetchByte: pc + 2 ofObject: aMethodObj) + (extBValue << 8)!
Item was changed:
----- Method: SistaCogit>>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 |
rcvrReg := self allocateRegForStackEntryAt: 0.
resultReg := self allocateRegNotConflictingWith: (self registerMaskFor: rcvrReg).
prim
caseOf: {
"00 unchecked class"
[1] -> "01 unchecked pointer numSlots"
[self ssTop popToReg: rcvrReg.
self ssPop: 1.
objectRepresentation
genGetNumSlotsOf: rcvrReg into: resultReg;
genConvertIntegerToSmallIntegerInReg: resultReg].
"02 unchecked pointer basicSize"
[3] -> "03 unchecked byte numBytes"
[self ssTop popToReg: rcvrReg.
self ssPop: 1.
objectRepresentation
genGetNumBytesOf: rcvrReg into: resultReg;
genConvertIntegerToSmallIntegerInReg: resultReg].
"04 unchecked short16Type format numShorts"
"05 unchecked word32Type format numWords"
"06 unchecked doubleWord64Type format numDoubleWords"
[11] -> "11 unchecked fixed pointer basicNew"
[self ssTop type ~= SSConstant ifTrue:
[^EncounteredUnknownBytecode].
(objectRepresentation
genGetInstanceOf: self ssTop constant
into: resultReg
initializingIf: self extBSpecifiesInitializeInstance) ~= 0 ifTrue:
[^ShouldNotJIT]. "e.g. bad class"
self ssPop: 1] .
[20] -> "20 identityHash"
[self ssTop popToReg: rcvrReg.
objectRepresentation genGetHashFieldNonImmOf: rcvrReg asSmallIntegerInto: resultReg.
self ssPop: 1] .
"21 identityHash (SmallInteger)"
"22 identityHash (Character)"
"23 identityHash (SmallFloat64)"
"24 identityHash (Behavior)"
"30 immediateAsInteger (Character)
31 immediateAsInteger (SmallFloat64)"
[30] ->
+ [self ssTop popToReg: resultReg.
+ objectRepresentation genConvertCharacterToSmallIntegerInReg: resultReg.
- [self ssTop popToReg: rcvrReg.
- objectRepresentation genConvertCharacterToSmallIntegerInReg: rcvrReg.
self ssPop: 1]
}
otherwise:
[^EncounteredUnknownBytecode].
extB := 0.
numExtB := 0.
self ssPushRegister: resultReg.
^0!
Item was changed:
----- Method: SistaCogit>>genUnconditionalTrapBytecode (in category 'bytecode generators') -----
genUnconditionalTrapBytecode
"SistaV1: * 217 Trap"
self ssFlushTo: simStackPtr.
self CallRT: ceTrapTrampoline.
self annotateBytecode: self Label.
+ deadCode := true.
^0!
Item was changed:
----- Method: StackToRegisterMappingCogit>>eventualTargetOf: (in category 'peephole optimizations') -----
eventualTargetOf: targetBytecodePC
"Attempt to follow a branch to a pc. Handle branches to unconditional jumps
and branches to push: aBoolean; conditional branch pairs. If the branch cannot
be followed answer targetBytecodePC."
| currentTarget nextPC nExts descriptor span cond |
<var: #descriptor type: #'BytecodeDescriptor *'>
nextPC := currentTarget := targetBytecodePC.
+ [ nExts := 0.
+ [descriptor := self generatorAt: bytecodeSetOffset
- [[nExts := 0.
- descriptor := self generatorAt: bytecodeSetOffset
+ (objectMemory fetchByte: nextPC ofObject: methodObj).
descriptor isReturn ifTrue: [^currentTarget]. "avoid stepping off the end of methods"
descriptor isExtension]
whileTrue:
[nExts := nExts + 1.
nextPC := nextPC + descriptor numBytes].
descriptor isUnconditionalBranch
ifTrue:
[span := self spanFor: descriptor at: nextPC exts: nExts in: methodObj.
span < 0 ifTrue: "Do *not* follow backward branches; these are interrupt points and should not be elided."
[^currentTarget].
nextPC := nextPC + descriptor numBytes + span]
ifFalse:
[descriptor generator == #genPushConstantTrueBytecode ifTrue: [ cond := true ]
ifFalse: [ descriptor generator == #genPushConstantFalseBytecode ifTrue: [ cond := false ] ifFalse: [ ^currentTarget ] ].
"Don't step into loops across a pushTrue; jump:if: boundary, so as not to confuse stack depth fixup."
(fixups at: nextPC - initialPC) isBackwardBranchFixup ifTrue:
[^currentTarget].
nextPC := self eventualTargetOf: nextPC + descriptor numBytes.
nExts := 0.
[descriptor := self generatorAt: bytecodeSetOffset
+ (objectMemory fetchByte: nextPC ofObject: methodObj).
descriptor isReturn ifTrue: [^currentTarget]. "avoid stepping off the end of methods"
descriptor isExtension]
whileTrue:
[nExts := nExts + 1.
nextPC := nextPC + descriptor numBytes].
descriptor isBranch ifFalse:
[^currentTarget].
descriptor isUnconditionalBranch ifTrue:
[^currentTarget].
nextPC := cond == descriptor isBranchTrue
ifTrue: [nextPC
+ descriptor numBytes
+ (self spanFor: descriptor at: nextPC exts: nExts in: methodObj)]
ifFalse: [nextPC + descriptor numBytes]].
currentTarget := nextPC]
repeat!
More information about the Vm-dev
mailing list