[Vm-dev] VM Maker: VMMaker.oscog-eem.1212.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Apr 18 01:10:04 UTC 2015
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1212.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1212
Author: eem
Time: 17 April 2015, 6:08:18.528 pm
UUID: 57841054-6567-44f4-9719-ab98551d8f2a
Ancestors: VMMaker.oscog-cb.1211
Fix C generation issues with recent changes.
=============== Diff against VMMaker.oscog-cb.1211 ===============
Item was changed:
----- Method: CogObjectRepresentation>>isUnannotatableConstant: (in category 'compile abstract instructions') -----
isUnannotatableConstant: simStackEntry
<inline: true>
+ <var: 'simStackEntry' type: #'CogSimStackEntry *'>
^ simStackEntry type = SSConstant
and: [(self shouldAnnotateObjectReference: simStackEntry constant) not ]!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genMoveConstant:R: (in category 'bytecode generator support') -----
+ genMoveConstant: constant R: reg
- genMoveConstant: constant R: register
<inline: true>
^ (objectRepresentation shouldAnnotateObjectReference: constant)
+ ifTrue: [ (self annotate: (self MoveCw: constant R: reg) objRef: constant) ]
+ ifFalse: [ self MoveCq: constant R: reg ]
- ifTrue: [ (self annotate: (self MoveCw: constant R: register) objRef: constant) ]
- ifFalse: [ self MoveCq: constant R: register ]
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genMoveFalseR: (in category 'bytecode generator support') -----
+ genMoveFalseR: reg
- genMoveFalseR: register
<inline: true>
+ ^ self genMoveConstant: objectMemory falseObject R: reg
- ^ self genMoveConstant: objectMemory falseObject R: register
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genMoveTrueR: (in category 'bytecode generator support') -----
+ genMoveTrueR: reg
- genMoveTrueR: register
<inline: true>
+ ^ self genMoveConstant: objectMemory trueObject R: reg
- ^ self genMoveConstant: objectMemory trueObject R: register
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genSpecialSelectorEqualsEqualsWithForwarders (in category 'bytecode generators') -----
genSpecialSelectorEqualsEqualsWithForwarders
| primDescriptor nextPC nExts branchDescriptor unforwardRcvr argReg targetBytecodePC
unforwardArg rcvrReg jumpNotEqual jumpEqual postBranchPC label fixup |
+ <var: #fixup type: #'BytecodeFixup *'>
<var: #jumpEqual type: #'AbstractInstruction *'>
<var: #jumpNotEqual type: #'AbstractInstruction *'>
<var: #primDescriptor type: #'BytecodeDescriptor *'>
<var: #branchDescriptor type: #'BytecodeDescriptor *'>
primDescriptor := self generatorAt: byte0.
nextPC := bytecodePC + primDescriptor numBytes.
nExts := 0.
[branchDescriptor := self generatorAt: (objectMemory fetchByte: nextPC ofObject: methodObj) + bytecodeSetOffset.
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 := (objectRepresentation isUnannotatableConstant: (self ssValue: 1)) not.
unforwardArg := (objectRepresentation isUnannotatableConstant: self ssTop) not.
"if the rcvr or the arg is an annotable constant, we need to push it to a register
else the forwarder check can't jump back to the comparison after unforwarding the constant"
unforwardArg
ifTrue:
[unforwardRcvr
ifTrue:
[self allocateTwoRegistersInto: [:rTop :rNext| argReg := rTop. rcvrReg := rNext].
self ssTop popToReg: argReg.
(self ssValue:1) popToReg: rcvrReg]
ifFalse:
[argReg := self allocateOneRegister.
self ssTop popToReg: argReg]]
ifFalse:
[self assert: unforwardRcvr.
rcvrReg := self allocateOneRegister.
(self ssValue:1) popToReg: rcvrReg].
label := self Label.
"Here we can use Cq because the constant does not need to be annotated"
self assert: (unforwardArg not or: [argReg notNil]).
self assert: (unforwardRcvr not or: [rcvrReg notNil]).
unforwardArg
ifFalse: [ self CmpCq: self ssTop constant R: rcvrReg ]
ifTrue: [ unforwardRcvr
ifFalse: [ self CmpCq: (self ssValue: 1) constant R: argReg ]
ifTrue: [ self CmpR: argReg R: rcvrReg ] ].
self ssPop: 2.
"If not followed by a branch, resolve to true or false."
(branchDescriptor isBranchTrue or: [branchDescriptor isBranchFalse]) ifFalse:
[jumpEqual := self JumpZero: 0.
unforwardArg ifTrue: [ objectRepresentation genEnsureOopInRegNotForwarded: argReg scratchReg: TempReg jumpBackTo: label ].
unforwardRcvr ifTrue: [ objectRepresentation genEnsureOopInRegNotForwarded: rcvrReg scratchReg: TempReg jumpBackTo: label ].
self genMoveFalseR: rcvrReg.
jumpNotEqual := self Jump: 0.
jumpEqual jmpTarget: (self genMoveTrueR: rcvrReg).
jumpNotEqual 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 assert: (unforwardArg or: [ unforwardRcvr ]).
branchDescriptor isBranchTrue ifTrue:
[ deadCode ifFalse: [ fixup := self ensureNonMergeFixupAt: postBranchPC - initialPC ].
self JumpZero: (self ensureNonMergeFixupAt: targetBytecodePC - initialPC) asUnsignedInteger.
unforwardArg ifTrue: [ (deadCode or: [ unforwardRcvr ])
ifTrue: [ objectRepresentation genEnsureOopInRegNotForwarded: argReg scratchReg: TempReg jumpBackTo: label ]
ifFalse: [ objectRepresentation
genEnsureOopInRegNotForwarded: argReg
scratchReg: TempReg
ifForwarder: label
ifNotForwarder: fixup ] ].
unforwardRcvr ifTrue: [ deadCode
ifTrue: [objectRepresentation genEnsureOopInRegNotForwarded: rcvrReg scratchReg: TempReg jumpBackTo: label ]
ifFalse: [objectRepresentation
genEnsureOopInRegNotForwarded: rcvrReg
scratchReg: TempReg
ifForwarder: label
ifNotForwarder: fixup ] ] ].
branchDescriptor isBranchFalse ifTrue:
[ fixup := (self ensureNonMergeFixupAt: targetBytecodePC - initialPC) asUnsignedInteger.
self JumpZero: (self ensureNonMergeFixupAt: postBranchPC - initialPC).
unforwardArg ifTrue: [ unforwardRcvr
ifFalse: [objectRepresentation
genEnsureOopInRegNotForwarded: argReg
scratchReg: TempReg
ifForwarder: label
ifNotForwarder: fixup ]
ifTrue: [ objectRepresentation genEnsureOopInRegNotForwarded: rcvrReg scratchReg: TempReg jumpBackTo: label ] ].
unforwardRcvr ifTrue:
[ objectRepresentation
genEnsureOopInRegNotForwarded: rcvrReg
scratchReg: TempReg
ifForwarder: label
ifNotForwarder: fixup ].
"Not reached"].
^0!
More information about the Vm-dev
mailing list