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!
vm-dev@lists.squeakfoundation.org