[Vm-dev] VM Maker: VMMaker.oscog-eem.2006.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Nov 26 03:19:59 UTC 2016
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2006.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.2006
Author: eem
Time: 25 November 2016, 7:19:10.023637 pm
UUID: cad39d34-1c14-416f-aeae-5b9fc776a3fc
Ancestors: VMMaker.oscog-eem.2005
RegisterAllocatingCogit:
methodOrBlockNumTemps must not be reset to the actual value ignoring the initial pushNils. Doing so wrecks spilling.
scanMethod must add an extra fixup for conditional branches since, if preceded by a special selector send, there may be two fixups created, one for each target, the target of the jump and the fall-through after the non-inlined send (see e.g. the two ensureFixupAt: sends in genBinaryInlineComparison:opFalse:destReg:).
This gets execution as far as the send of #<= in the loop in Interval>>#collect: which ends up passing nil as the second argument. It maybe time to tackle inlining of special selector comparisons.
=============== Diff against VMMaker.oscog-eem.2005 ===============
Item was changed:
----- Method: StackToRegisterMappingCogit>>compileBlockFrameBuild: (in category 'compile abstract instructions') -----
compileBlockFrameBuild: blockStart
"Build a frame for a block activation. See CoInterpreter class>>initializeFrameIndices.
Override to push the register receiver and register arguments, if any, and to correctly
initialize the explicitly nilled/pushed temp entries (they are /not/ of type constant nil)."
super compileBlockFrameBuild: blockStart.
methodOrBlockNumTemps := blockStart numArgs + blockStart numCopied + blockStart numInitialNils.
self initSimStackForFramefulMethod: blockStart startpc.
blockStart numInitialNils > 0 ifTrue:
[blockStart numInitialNils > 1
ifTrue:
[self genMoveNilR: TempReg.
1 to: blockStart numInitialNils do:
[:ign| self PushR: TempReg]]
ifFalse:
+ [self genPushConstant: objectMemory nilObject]]!
- [self genPushConstant: objectMemory nilObject].
- methodOrBlockNumTemps := blockStart numArgs + blockStart numCopied]!
Item was changed:
----- Method: StackToRegisterMappingCogit>>scanMethod (in category 'compile abstract instructions') -----
scanMethod
"Scan the method (and all embedded blocks) to determine
- what the last bytecode is; extra bytes at the end of a method are used to encode things like source pointers or temp names
- if the method needs a frame or not
- what are the targets of any backward branches.
- how many blocks it creates
Answer the block count or on error a negative error code"
| latestContinuation nExts descriptor pc numBlocks distance targetPC framelessStackDelta seenInstVarStore |
<var: #descriptor type: #'BytecodeDescriptor *'>
needsFrame := useTwoPaths := seenInstVarStore := false.
LowcodeVM ifTrue: [ hasNativeFrame := false ].
self maybeInitNumFixups.
self maybeInitNumCounters.
prevBCDescriptor := nil.
NewspeakVM ifTrue:
[numIRCs := 0].
(primitiveIndex > 0
and: [coInterpreter isQuickPrimitiveIndex: primitiveIndex]) ifTrue:
[^0].
pc := latestContinuation := initialPC.
numBlocks := framelessStackDelta := nExts := extA := extB := 0.
[pc <= endPC] whileTrue:
[byte0 := (objectMemory fetchByte: pc ofObject: methodObj) + bytecodeSetOffset.
descriptor := self generatorAt: byte0.
descriptor isExtension ifTrue:
[descriptor opcode = Nop ifTrue: "unknown bytecode tag; see Cogit class>>#generatorTableFrom:"
[^EncounteredUnknownBytecode].
self loadSubsequentBytesForDescriptor: descriptor at: pc.
self perform: descriptor generator].
(descriptor isReturn
and: [pc >= latestContinuation]) ifTrue:
[endPC := pc].
needsFrame ifFalse:
[(descriptor needsFrameFunction isNil
or: [self perform: descriptor needsFrameFunction with: framelessStackDelta])
ifTrue:
["With immutability we win simply by avoiding a frame build if the receiver is young and not immutable."
self cppIf: IMMUTABILITY
ifTrue: [descriptor is1ByteInstVarStore
ifTrue: [useTwoPaths := true]
ifFalse: [needsFrame := true. useTwoPaths := false]]
ifFalse: [needsFrame := true. useTwoPaths := false]]
ifFalse:
[framelessStackDelta := framelessStackDelta + descriptor stackDelta.
"Without immutability we win if there are two or more stores and the receiver is new."
self cppIf: IMMUTABILITY
ifTrue: []
ifFalse:
[descriptor is1ByteInstVarStore ifTrue:
[seenInstVarStore
ifTrue: [useTwoPaths := true]
ifFalse: [seenInstVarStore := true]]]]].
descriptor isBranch ifTrue:
[distance := self spanFor: descriptor at: pc exts: nExts in: methodObj.
targetPC := pc + descriptor numBytes + distance.
(self isBackwardBranch: descriptor at: pc exts: nExts in: methodObj)
ifTrue: [self initializeFixupAt: targetPC - initialPC]
ifFalse:
[latestContinuation := latestContinuation max: targetPC.
+ (descriptor isBranchTrue or: [descriptor isBranchFalse]) ifTrue:
+ [self maybeCountFixup].
self maybeCountFixup.
self maybeCountCounter]].
descriptor isBlockCreation ifTrue:
[numBlocks := numBlocks + 1.
distance := self spanFor: descriptor at: pc exts: nExts in: methodObj.
targetPC := pc + descriptor numBytes + distance.
latestContinuation := latestContinuation max: targetPC.
self maybeCountFixup].
NewspeakVM ifTrue:
+ [descriptor hasIRC ifTrue: [numIRCs := numIRCs + 1]].
- [descriptor hasIRC ifTrue:
- [numIRCs := numIRCs + 1]].
pc := pc + descriptor numBytes.
+ nExts := descriptor isExtension ifTrue: [nExts + 1] ifFalse: [extA := extB := 0].
- descriptor isExtension
- ifTrue: [nExts := nExts + 1]
- ifFalse: [nExts := extA := extB := 0].
prevBCDescriptor := descriptor].
^numBlocks!
More information about the Vm-dev
mailing list