[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