[prev in list] [next in list] [prev in thread] [next in thread] 

List:       squeak-vm-dev
Subject:    Re: [Vm-dev] VM Maker: VMMaker.oscog-eem.1609.mcz
From:       Tudor Girba <tudor () tudorgirba ! com>
Date:       2015-12-20 11:01:23
Message-ID: BA3B2BD3-5BC0-42BB-8872-0B2800FF9473 () tudorgirba ! com
[Download RAW message or body]


Merry Christmas to you, too :)!

Doru


> On Dec 17, 2015, at 8:12 PM, Eliot Miranda <eliot.miranda@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@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."


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic