[Vm-dev] VM Maker: VMMaker.oscog-eem.1609.mcz
Tudor Girba
tudor at tudorgirba.com
Sun Dec 20 11:01:23 UTC 2015
Merry Christmas to you, too :)!
Doru
> On Dec 17, 2015, at 8:12 PM, Eliot Miranda <eliot.miranda at gmail.com> wrote:
>
> Hi All,
>
> the real Cog 64-bit Spur x64 VM just evaluated 3+4 correctly on Mac OS X:
>
> <Screen Shot 2015-12-17 at 11.10.14.png>
>
>
> Early days yet. This is a debug VM. The optimised VM does not yet display the prompt. But we can be confident that a 64-bit JIT for Spur will be available some time in January.
>
>
> On Thu, Dec 17, 2015 at 10:42 AM, <commits at source.squeak.org> wrote:
>
> Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
> http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1609.mcz
>
> ==================== Summary ====================
>
> Name: VMMaker.oscog-eem.1609
> Author: eem
> Time: 17 December 2015, 10:41:49.192 am
> UUID: 771cdc25-5d27-4818-8943-2ba5c0e31791
> Ancestors: VMMaker.oscog-eem.1608
>
> Cogit: Fix the (arguably bogus) register save/restore code for safe trampolines, including the ceScheduleScavenge call.
>
> =============== Diff against VMMaker.oscog-eem.1608 ===============
>
> Item was added:
> + ----- Method: CogARMCompiler>>genSaveRegForCCall (in category 'abi') -----
> + genSaveRegForCCall
> + "Save the general purpose registers for a call into the C run-time from a trampoline."
> + "Save none, because the ARM ABI only defines callee saved registers, no caller-saved regs."
> + "cogit gen: STMFD operand: 16r7F"!
>
> Item was removed:
> - ----- Method: CogARMCompiler>>genSaveRegisters (in category 'abi') -----
> - genSaveRegisters
> - "Save the general purpose registers for a trampoline call."
> - "Save none, because the ARM ABI only defines callee saved registers, no caller-saved regs."
> - "cogit gen: STMFD operand: 16r7F"!
>
> Item was added:
> + ----- Method: CogARMCompiler>>genSaveRegsForCCall (in category 'abi') -----
> + genSaveRegsForCCall
> + "Save the general purpose registers for a trampoline call."
> + "Save none, because the ARM ABI only defines callee saved registers, no caller-saved regs."
> + "cogit gen: STMFD operand: 16r7F"
> + self flag: 'this will change with Sista when we hope to be able to allocate arbitrary registers'!
>
> Item was removed:
> - ----- Method: CogAbstractInstruction>>genSaveRegisters (in category 'abi') -----
> - genSaveRegisters
> - "Save the general purpose registers for a trampoline call."
> - self subclassResponsibility!
>
> Item was changed:
> ----- Method: CogIA32Compiler>>genRestoreRegsExcept: (in category 'abi') -----
> genRestoreRegsExcept: abstractReg
> | realReg |
> realReg := self concreteRegister: abstractReg.
> self assert: (EDI > EAX and: [EDI - EAX + 1 = 6]).
> EAX to: EDI do:
> [:reg|
> + (reg between: ESP and: EBP) ifFalse:
> + [realReg = reg
> + ifTrue: [cogit AddCq: 4 R: ESP]
> + ifFalse: [cogit PopR: reg]]].
> - realReg = reg ifTrue: [cogit AddCq: 4 R: ESP] ifFalse: [cogit PopR: reg]].
> ^0!
>
> Item was removed:
> - ----- Method: CogIA32Compiler>>genSaveRegisters (in category 'abi') -----
> - genSaveRegisters
> - "Save the general purpose registers for a trampoline call."
> -
> - self assert: (EDI > EAX and: [EDI - EAX + 1 = 8]).
> - EDI to: EAX by: -1 do:
> - [:reg|
> - (reg between: ESP and: EBP) ifFalse:
> - [cogit PushR: reg]].
> - ^0!
>
> Item was added:
> + ----- Method: CogIA32Compiler>>genSaveRegsForCCall (in category 'abi') -----
> + genSaveRegsForCCall
> + "Save the general purpose registers for a call into the C run-time from a trampoline."
> +
> + self assert: (EDI > EAX and: [EDI - EAX + 1 = 8]).
> + EDI to: EAX by: -1 do:
> + [:reg|
> + (reg between: ESP and: EBP) ifFalse:
> + [cogit PushR: reg]].
> + ^0!
>
> Item was removed:
> - ----- Method: CogMIPSELCompiler>>genSaveRegisters (in category 'abi') -----
> - genSaveRegisters
> - "This method is poorly named. Is this for a Smalltalk -> C call or C -> Smalltalk call?
> - If the former we don't need to do anything because all of the abstract registers are
> - allocated to C preserved registers."
> - self flag: #bogus.!
>
> Item was added:
> + ----- Method: CogMIPSELCompiler>>genSaveRegsForCCall (in category 'abi') -----
> + genSaveRegsForCCall
> + "Save the general purpose registers for a call into the C run-time from a trampoline.
> + We don't need to do anything because all of the abstract registers are
> + allocated to C preserved registers."
> + self flag: 'this will change with Sista when we hope to be able to allocate arbitrary registers'!
>
> Item was changed:
> ----- Method: CogX64Compiler>>genRestoreRegs (in category 'abi') -----
> genRestoreRegs
> "Restore the general purpose registers for a trampoline call.
> c.f. genSaveRegisters"
> + RAX to: R15 do:
> + [:reg|
> + (reg between: RSP and: RBP) ifFalse:
> + [cogit PopR: reg]].
> - cogit
> - PopR: RAX;
> - PopR: RBX;
> - PopR: RCX;
> - PopR: RDX;
> - PopR: RSI;
> - PopR: RDI;
> - PopR: R8;
> - PopR: R9;
> - PopR: R10;
> - PopR: R11;
> - PopR: R12;
> - PopR: R13;
> - PopR: R14;
> - PopR: R15.
> ^0!
>
> Item was changed:
> ----- Method: CogX64Compiler>>genRestoreRegsExcept: (in category 'abi') -----
> genRestoreRegsExcept: abstractReg
> | realReg |
> realReg := self concreteRegister: abstractReg.
> self assert: (R15 > RAX and: [R15 - RAX + 1 = 16]).
> RAX to: R15 do:
> [:reg|
> + (reg between: RSP and: RBP) ifFalse:
> + [realReg = reg
> + ifTrue: [cogit AddCq: 8 R: RSP]
> + ifFalse: [cogit PopR: reg]]].
> - realReg = reg ifTrue: [cogit AddCq: 4 R: RSP] ifFalse: [cogit PopR: reg]].
> ^0!
>
> Item was removed:
> - ----- Method: CogX64Compiler>>genSaveRegisters (in category 'abi') -----
> - genSaveRegisters
> - "Save the general purpose registers for a trampoline call."
> -
> - self assert: (R15 > RAX and: [R15 - RAX + 1 = 16]).
> - R15 to: RAX by: -1 do: [:reg| cogit PushR: reg].
> - ^0!
>
> Item was added:
> + ----- Method: CogX64Compiler>>genSaveRegsForCCall (in category 'abi') -----
> + genSaveRegsForCCall
> + "Save the general purpose registers for a trampoline call."
> +
> + self assert: (R15 > RAX and: [R15 - RAX + 1 = 16]).
> + R15 to: RAX by: -1 do:
> + [:reg|
> + (reg between: RSP and: RBP) ifFalse:
> + [cogit PushR: reg]].
> + ^0!
>
> Item was changed:
> ----- Method: Cogit>>compileCallFor:numArgs:arg:arg:arg:arg:resultReg:saveRegs: (in category 'initialization') -----
> compileCallFor: aRoutine numArgs: numArgs arg: regOrConst0 arg: regOrConst1 arg: regOrConst2 arg: regOrConst3 resultReg: resultRegOrNone saveRegs: saveRegs
> "Generate a call to aRoutine with up to 4 arguments. If resultRegOrNone is not
> NoReg assign the C result to resultRegOrNone. If saveRegs, save all registers.
> Hack: a negative arg value indicates an abstract register, a non-negative value
> indicates a constant."
> <var: #aRoutine type: #'void *'>
> <inline: false>
> cStackAlignment > objectMemory wordSize ifTrue:
> [backEnd
> genAlignCStackSavingRegisters: saveRegs
> numArgs: numArgs
> wordAlignment: cStackAlignment / objectMemory wordSize].
> saveRegs ifTrue:
> + [backEnd genSaveRegsForCCall].
> - [backEnd genSaveRegisters].
> backEnd genMarshallNArgs: numArgs arg: regOrConst0 arg: regOrConst1 arg: regOrConst2 arg: regOrConst3.
> self CallFullRT: (self cCode: [aRoutine asUnsignedInteger]
> inSmalltalk: [self simulatedTrampolineFor: aRoutine]).
> resultRegOrNone ~= NoReg ifTrue:
> [backEnd genWriteCResultIntoReg: resultRegOrNone].
> saveRegs ifTrue:
> [numArgs > 0 ifTrue:
> [backEnd genRemoveNArgsFromStack: numArgs].
> resultRegOrNone ~= NoReg
> ifTrue: [backEnd genRestoreRegsExcept: resultRegOrNone]
> ifFalse: [backEnd genRestoreRegs]]!
>
>
>
>
> --
> _,,,^..^,,,_
> best, Eliot
--
www.tudorgirba.com
www.feenk.com
"We cannot reach the flow of things unless we let go."
More information about the Vm-dev
mailing list