[Vm-dev] VM Maker: VMMaker.oscog-eem.1102.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Mar 19 20:45:08 UTC 2015
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1102.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1102
Author: eem
Time: 19 March 2015, 1:43:07.647 pm
UUID: ba19f395-e6a0-4a6a-9949-b3ee0c06a28f
Ancestors: VMMaker.oscog-eem.1101
Trampolines should not pop the link register unless they push them.
Correct shortcutTrampoline:to: for ARM.
Generate the actual tracing trampolines when simulating so one can grok them.
=============== Diff against VMMaker.oscog-eem.1101 ===============
Item was added:
+ ----- Method: CogARMCompiler>>genRemoveNArgsFromStack: (in category 'abi') -----
+ genRemoveNArgsFromStack: n
+ "This is a no-op on ARM since the ABI passes up to 4 args in registers and trampolines currently observe that limit."
+ self assert: n <= 4.
+ ^0!
Item was changed:
----- Method: Cogit>>compileTrampolineFor:numArgs:arg:arg:arg:arg:saveRegs:pushLinkReg:resultReg: (in category 'initialization') -----
compileTrampolineFor: aRoutine numArgs: numArgs arg: regOrConst0 arg: regOrConst1 arg: regOrConst2 arg: regOrConst3 saveRegs: saveRegs pushLinkReg: pushLinkReg resultReg: resultRegOrNil
"Generate a trampoline with up to four arguments. Generate either a call or a jump to aRoutine
as requested by callJumpBar. If generating a call and resultRegOrNil is non-zero pass the C result
back in resultRegOrNil.
Hack: a negative value indicates an abstract register, a non-negative value indicates a constant."
<var: #aRoutine type: #'void *'>
<inline: false>
"If on a RISC processor, the return address needs to be pushed to the
stack so that the interpreter sees the same stack layout as on CISC."
(pushLinkReg and: [backEnd hasLinkRegister]) ifTrue:
[self PushR: LinkReg].
self genSmalltalkToCStackSwitch.
self
compileCallFor: aRoutine
numArgs: numArgs
arg: regOrConst0
arg: regOrConst1
arg: regOrConst2
arg: regOrConst3
resultReg: resultRegOrNil
saveRegs: saveRegs.
backEnd genLoadStackPointers.
+ (pushLinkReg and: [backEnd hasLinkRegister]) ifTrue:
- backEnd hasLinkRegister ifTrue:
[self PopR: LinkReg].
self RetN: 0!
Item was changed:
----- Method: Cogit>>shortcutTrampoline:to: (in category 'simulation only') -----
shortcutTrampoline: aProcessorSimulationTrap to: aBlock
<doNotGenerate>
+ backEnd hasLinkRegister ifTrue:
+ [processor pushWord: processor lr in: coInterpreter memory].
- coInterpreter printFrameAtEachStep ifTrue:
- [coInterpreter
- printFrame: processor fp
- WithSP: processor sp].
processor
simulateLeafCallOf: aProcessorSimulationTrap address
nextpc: aProcessorSimulationTrap nextpc
memory: coInterpreter memory.
coInterpreter
stackPointer: processor sp;
framePointer: processor fp.
processor
sp: self getCStackPointer;
fp: self getCFramePointer.
aBlock value.
processor
sp: coInterpreter stackPointer;
fp: coInterpreter framePointer;
simulateLeafReturnIn: coInterpreter memory.
+ backEnd hasLinkRegister ifTrue:
+ [processor lr: (processor popWordIn: coInterpreter memory)]!
- coInterpreter printFrameAtEachStep ifTrue:
- [coInterpreter
- printFrame: processor fp
- WithSP: processor sp]!
Item was changed:
----- Method: SimpleStackBasedCogit>>generateTracingTrampolines (in category 'initialization') -----
generateTracingTrampolines
"Generate trampolines for tracing. In the simulator we can save a lot of time
and avoid noise instructions in the lastNInstructions log by short-cutting these
trampolines, but we need them in the real vm."
+ ceTraceLinkedSendTrampoline :=
+ self genSafeTrampolineFor: #ceTraceLinkedSend:
+ called: 'ceTraceLinkedSendTrampoline'
+ arg: ReceiverResultReg.
+ ceTraceBlockActivationTrampoline :=
+ self genTrampolineFor: #ceTraceBlockActivation
+ called: 'ceTraceBlockActivationTrampoline'.
+ ceTraceStoreTrampoline :=
+ self genSafeTrampolineFor: #ceTraceStoreOf:into:
+ called: 'ceTraceStoreTrampoline'
+ arg: ClassReg
+ arg: ReceiverResultReg.
+ self cCode: [] inSmalltalk:
+ [ceTraceLinkedSendTrampoline := self simulatedTrampolineFor: #ceShortCutTraceLinkedSend:.
+ ceTraceBlockActivationTrampoline := self simulatedTrampolineFor: #ceShortCutTraceBlockActivation:.
+ ceTraceStoreTrampoline := self simulatedTrampolineFor: #ceShortCutTraceStore:]!
- ceTraceLinkedSendTrampoline
- := self cCode:
- [self genSafeTrampolineFor: #ceTraceLinkedSend:
- called: 'ceTraceLinkedSendTrampoline'
- arg: ReceiverResultReg]
- inSmalltalk:
- [| a |
- simulatedTrampolines
- at: (a := self simulatedAddressFor: #ceShortCutTraceLinkedSend:)
- put: #ceShortCutTraceLinkedSend:.
- a].
- ceTraceBlockActivationTrampoline
- := self cCode:
- [self genTrampolineFor: #ceTraceBlockActivation
- called: 'ceTraceBlockActivationTrampoline']
- inSmalltalk:
- [| a |
- simulatedTrampolines
- at: (a := self simulatedAddressFor: #ceShortCutTraceBlockActivation:)
- put: #ceShortCutTraceBlockActivation:.
- a].
- ceTraceStoreTrampoline
- := self cCode:
- [self genSafeTrampolineFor: #ceTraceStoreOf:into:
- called: 'ceTraceStoreTrampoline'
- arg: ClassReg
- arg: ReceiverResultReg]
- inSmalltalk:
- [| a |
- simulatedTrampolines
- at: (a := self simulatedAddressFor: #ceShortCutTraceStore:)
- put: #ceShortCutTraceStore:.
- a]!
Item was changed:
----- Method: StackToRegisterMappingCogit>>generateTracingTrampolines (in category 'initialization') -----
generateTracingTrampolines
"Generate trampolines for tracing. In the simulator we can save a lot of time
and avoid noise instructions in the lastNInstructions log by short-cutting these
trampolines, but we need them in the real vm."
+ ceTraceLinkedSendTrampoline :=
+ self genSafeTrampolineFor: #ceTraceLinkedSend:
+ called: 'ceTraceLinkedSendTrampoline'
+ arg: ReceiverResultReg.
+ ceTraceBlockActivationTrampoline :=
+ self genTrampolineFor: #ceTraceBlockActivation
+ called: 'ceTraceBlockActivationTrampoline'.
+ ceTraceStoreTrampoline :=
+ self genSafeTrampolineFor: #ceTraceStoreOf:into:
+ called: 'ceTraceStoreTrampoline'
+ arg: TempReg
+ arg: ReceiverResultReg.
+ self cCode: [] inSmalltalk:
+ [ceTraceLinkedSendTrampoline := self simulatedTrampolineFor: #ceShortCutTraceLinkedSend:.
+ ceTraceBlockActivationTrampoline := self simulatedTrampolineFor: #ceShortCutTraceBlockActivation:.
+ ceTraceStoreTrampoline := self simulatedTrampolineFor: #ceShortCutTraceStore:]!
- ceTraceLinkedSendTrampoline
- := self cCode:
- [self genSafeTrampolineFor: #ceTraceLinkedSend:
- called: 'ceTraceLinkedSendTrampoline'
- arg: ReceiverResultReg]
- inSmalltalk:
- [self simulatedTrampolineFor: #ceShortCutTraceLinkedSend:].
- ceTraceBlockActivationTrampoline
- := self cCode:
- [self genTrampolineFor: #ceTraceBlockActivation
- called: 'ceTraceBlockActivationTrampoline']
- inSmalltalk:
- [self simulatedTrampolineFor: #ceShortCutTraceBlockActivation:].
- ceTraceStoreTrampoline
- := self cCode:
- [self genSafeTrampolineFor: #ceTraceStoreOf:into:
- called: 'ceTraceStoreTrampoline'
- arg: TempReg
- arg: ReceiverResultReg]
- inSmalltalk:
- [self simulatedTrampolineFor: #ceShortCutTraceStore:]!
More information about the Vm-dev
mailing list