[Vm-dev] VM Maker: VMMaker.oscog-eem.757.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Jun 5 17:41:52 UTC 2014
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.757.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.757
Author: eem
Time: 5 June 2014, 10:38:06.398 am
UUID: c4908baa-712c-4cb6-a606-5bde992e9582
Ancestors: VMMaker.oscog-eem.756
Fix a stupid slip in genSpecialSelectorEqualsEquals.
The constant evaluation must remember to pop the simulation
stack before it pushes the boolean result.
=============== Diff against VMMaker.oscog-eem.756 ===============
Item was changed:
----- Method: StackToRegisterMappingCogit>>genSpecialSelectorEqualsEquals (in category 'bytecode generators') -----
genSpecialSelectorEqualsEquals
| nextPC postBranchPC targetBytecodePC primDescriptor branchDescriptor nExts
+ unforwardArg unforwardRcvr jumpEqual jumpNotEqual rcvrReg argReg result |
- unforwardArg unforwardRcvr jumpEqual jumpNotEqual rcvrReg argReg |
<var: #jumpEqual type: #'AbstractInstruction *'>
<var: #jumpNotEqual type: #'AbstractInstruction *'>
<var: #primDescriptor type: #'BytecodeDescriptor *'>
<var: #branchDescriptor type: #'BytecodeDescriptor *'>
primDescriptor := self generatorAt: byte0.
"forwarders have been followed in cog:selector:"
(self ssTop type = SSConstant
and: [(self ssValue: 1) type = SSConstant]) ifTrue:
[self assert: primDescriptor isMapped not.
+ result := self ssTop constant = (self ssValue: 1) constant
- ^self ssPushConstant: (self ssTop constant = (self ssValue: 1) constant
ifTrue: [objectMemory trueObject]
+ ifFalse: [objectMemory falseObject].
+ self ssPop: 2.
+ ^self ssPushConstant: result].
- ifFalse: [objectMemory falseObject])].
nextPC := bytecodePC + primDescriptor numBytes.
nExts := 0.
[branchDescriptor := self generatorAt: (objectMemory fetchByte: nextPC ofObject: methodObj) + (byte0 bitAnd: 256).
branchDescriptor isExtension] whileTrue:
[nExts := nExts + 1.
nextPC := nextPC + branchDescriptor numBytes].
"If branching the stack must be flushed for the merge"
(branchDescriptor isBranchTrue or: [branchDescriptor isBranchFalse]) ifTrue:
[self ssFlushTo: simStackPtr - 2].
unforwardRcvr := (self ssValue: 1) type ~= SSConstant
or: [objectRepresentation shouldAnnotateObjectReference: (self ssValue: 1) constant].
unforwardArg := self ssTop type ~= SSConstant
or: [objectRepresentation shouldAnnotateObjectReference: self ssTop constant].
"Don't use ReceiverResultReg for receiver to keep ReceiverResultReg live.
Optimize e.g. rcvr == nil, the common case for ifNil: et al."
needsFrame
ifTrue:
[unforwardArg ifTrue:
[self ssAllocateRequiredReg: (argReg := Arg0Reg) upThrough: simStackPtr - 1].
self ssAllocateRequiredReg: (rcvrReg := Arg1Reg) upThrough: simStackPtr - 2]
ifFalse:
[unforwardArg ifTrue:
[argReg := self ssAllocatePreferredReg: ClassReg].
rcvrReg := self ssAllocatePreferredReg: SendNumArgsReg].
unforwardArg
ifTrue:
[self ssTop popToReg: argReg.
objectRepresentation genEnsureOopInRegNotForwarded: argReg scratchReg: TempReg.
(self ssValue: 1) popToReg: rcvrReg.
unforwardRcvr ifTrue:
[objectRepresentation genEnsureOopInRegNotForwarded: rcvrReg scratchReg: TempReg].
self CmpR: argReg R: rcvrReg]
ifFalse:
[(self ssValue: 1) popToReg: rcvrReg.
unforwardRcvr ifTrue:
[objectRepresentation genEnsureOopInRegNotForwarded: rcvrReg scratchReg: TempReg].
self CmpCq: self ssTop constant R: rcvrReg].
self ssPop: 2.
"If not followed by a branch, resolve to true or false."
(branchDescriptor isBranchTrue or: [branchDescriptor isBranchFalse]) ifFalse:
[jumpNotEqual := self JumpNonZero: 0.
self annotate: (self MoveCw: objectMemory trueObject R: rcvrReg)
objRef: objectMemory trueObject.
jumpEqual := self Jump: 0.
jumpNotEqual jmpTarget: (self annotate: (self MoveCw: objectMemory falseObject R: rcvrReg)
objRef: objectMemory falseObject).
jumpEqual jmpTarget: self Label.
self ssPushRegister: rcvrReg.
^0].
"Further since there is a following conditional jump bytecode, define
non-merge fixups and leave the cond bytecode to set the mergeness."
targetBytecodePC := nextPC
+ branchDescriptor numBytes
+ (self spanFor: branchDescriptor at: nextPC exts: nExts in: methodObj).
postBranchPC := nextPC + branchDescriptor numBytes.
(self fixupAt: nextPC - initialPC) targetInstruction = 0
ifTrue: "The next instruction is dead. we can skip it."
[deadCode := true.
self ensureFixupAt: targetBytecodePC - initialPC.
self ensureFixupAt: postBranchPC - initialPC]
ifFalse:
[self ssPushConstant: objectMemory trueObject]. "dummy value"
self gen: (branchDescriptor isBranchTrue ifTrue: [JumpZero] ifFalse: [JumpNonZero])
operand: (self ensureNonMergeFixupAt: targetBytecodePC - initialPC) asUnsignedInteger.
self Jump: (self ensureNonMergeFixupAt: postBranchPC - initialPC).
^0!
More information about the Vm-dev
mailing list