[Vm-dev] VM Maker: VMMaker.oscog-eem.782.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Jun 26 23:42:02 UTC 2014
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.782.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.782
Author: eem
Time: 26 June 2014, 4:38:42.756 pm
UUID: 0f40ec66-356f-4b59-9b04-c5904c7e9da1
Ancestors: VMMaker.oscog-eem.781
The method abort trampolines shouldn't pop anything,
especially now we have the pushLinkreg: arg to manage the
LinkReg more easily.
=============== Diff against VMMaker.oscog-eem.781 ===============
Item was changed:
----- Method: Cogit>>genMethodAbortTrampoline (in category 'initialization') -----
genMethodAbortTrampoline
"Generate the abort for a method. This abort performs either a call of ceSICMiss:
to handle a single-in-line cache miss or a call of ceStackOverflow: to handle a
stack overflow. It distinguishes the two by testing ResultReceiverReg. If the
register is zero then this is a stack-overflow because a) the receiver has already
been pushed and so can be set to zero before calling the abort, and b) the
receiver must always contain an object (and hence be non-zero) on SIC miss."
| jumpSICMiss |
<var: #jumpSICMiss type: #'AbstractInstruction *'>
opcodeIndex := 0.
self CmpCq: 0 R: ReceiverResultReg.
jumpSICMiss := self JumpNonZero: 0.
- "on machines with a link register, pop the stack if the ReceiverResultReg = 0,
- i.e. if coming through the stack check abort; frame build has already pushed it."
- backEnd hasLinkRegister ifTrue:
- [self AddCq: BytesPerWord R: SPReg].
self compileTrampolineFor: #ceStackOverflow:
numArgs: 1
arg: SendNumArgsReg
arg: nil
arg: nil
arg: nil
saveRegs: false
pushLinkReg: true
resultReg: nil.
jumpSICMiss jmpTarget: self Label.
^self genTrampolineFor: #ceSICMiss:
called: 'ceMethodAbort'
numArgs: 1
arg: ReceiverResultReg
arg: nil
arg: nil
arg: nil
saveRegs: false
pushLinkReg: true
resultReg: nil
appendOpcodes: true!
Item was changed:
----- Method: StackToRegisterMappingCogit>>genMethodAbortTrampolineFor: (in category 'initialization') -----
genMethodAbortTrampolineFor: numArgs
"Generate the abort for a method. This abort performs either a call of ceSICMiss:
to handle a single-in-line cache miss or a call of ceStackOverflow: to handle a
stack overflow. It distinguishes the two by testing ResultReceiverReg. If the
register is zero then this is a stack-overflow because a) the receiver has already
been pushed and so can be set to zero before calling the abort, and b) the
receiver must always contain an object (and hence be non-zero) on SIC miss."
| jumpSICMiss |
<var: #jumpSICMiss type: #'AbstractInstruction *'>
opcodeIndex := 0.
self CmpCq: 0 R: ReceiverResultReg.
jumpSICMiss := self JumpNonZero: 0.
- "on machines with a link register, pop the stack if the ReceiverResultReg = 0,
- i.e. if coming through the stack check abort; frame build has already pushed it."
- backEnd hasLinkRegister ifTrue:
- [self AddCq: BytesPerWord R: SPReg].
self compileTrampolineFor: #ceStackOverflow:
numArgs: 1
arg: SendNumArgsReg
arg: nil
arg: nil
arg: nil
saveRegs: false
pushLinkReg: true
resultReg: nil.
jumpSICMiss jmpTarget: self Label.
backEnd genPushRegisterArgsForAbortMissNumArgs: numArgs.
^self genTrampolineFor: #ceSICMiss:
called: (self trampolineName: 'ceMethodAbort' numArgs: (numArgs <= self numRegArgs ifTrue: [numArgs] ifFalse: [-1]))
numArgs: 1
arg: ReceiverResultReg
arg: nil
arg: nil
arg: nil
saveRegs: false
pushLinkReg: true
resultReg: nil
appendOpcodes: true!
More information about the Vm-dev
mailing list