Changeset 8615


Ignore:
Timestamp:
Feb 28, 2008, 12:12:09 PM (12 years ago)
Author:
andreas
Message:

Port of SPffcall and SPcallback to different calling conventions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/win64/lisp-kernel/x86-spentry64.s

    r8608 r8615  
    39743974            foreign code has never been safe (unless it's
    39753975            a fixnum */
    3976          __(save_tcr_linear(%save0))
    3977          __(movq %imm1,%save1)
    3978          __(movq %imm0,%save2)
     3976         __(save_tcr_linear(%csave0))
     3977         __(movq %imm1,%csave1)
     3978         __(movq %imm0,%csave2)
    39793979         __(set_foreign_gs_base())
    3980          __(movq %save1,%imm1)
    3981          __(movq %save2,%imm0)
     3980         __(movq %csave1,%imm1)
     3981         __(movq %csave2,%imm0)
    39823982        __endif
    39833983        __ifdef([WINDOWS])
    39843984        /* Preserve TCR pointer */
    3985         __(movq %rcontext_reg, %save0)
     3985        __(movq %rcontext_reg, %csave0)
    39863986        __endif
    39873987LocalLabelPrefix[]ffcall_setup:
     
    39933993        __(pop %carg3)
    39943994        __ifdef([WINDOWS])
    3995         __(sub $20, %rsp) /* Make room for arg register spill */
     3995        __(sub $0x20, %rsp) /* Make room for arg register spill */
    39963996        __else
    39973997        __(pop %carg4)
     
    40024002        __(call *%r11)
    40034003LocalLabelPrefix[]ffcall_call_end:               
     4004        __ifdef([WINDOWS])
     4005        __(add $0x20, %rsp)
     4006        __endif
    40044007        __(movq %rbp,%rsp)
    40054008        __ifdef([DARWIN_GS_HACK])
    4006          /* %rax/%rdx contains the return value (maybe), %save0 still
     4009         /* %rax/%rdx contains the return value (maybe), %csave1 still
    40074010            contains the linear tcr address.  Preserve %rax/%rdx here. */
    4008          __(movq %rax,%save1)
    4009          __(movq %rdx,%save2)
    4010          __(set_gs_base(%save0))
    4011          __(movq %save1,%rax)
    4012          __(movq %save2,%rdx)
     4011         __(movq %rax,%csave1)
     4012         __(movq %rdx,%csave2)
     4013         __(set_gs_base(%csave0))
     4014         __(movq %csave1,%rax)
     4015         __(movq %csave2,%rdx)
    40134016        __endif
    40144017        __ifdef([WINDOWS])
    4015         __(movq %save0, %rcontext_reg)
     4018        __(movq %csave0, %rcontext_reg)
    40164019        __endif
    40174020        __(movq %rsp,rcontext(tcr.foreign_sp))
     
    41674170        __(push %save3)
    41684171        __endif
    4169         __(movq macptr.address(%arg_y),%rbx)  /* %rbx non-volatile */
     4172        __(movq macptr.address(%arg_y),%csave0)  /* %rbx non-volatile */
    41704173        __(push %fn)
    41714174        __(movq %rsp,rcontext(tcr.save_vsp))
     
    41834186            all saved, and the foreign arguments are
    41844187            on the foreign stack (about to be popped
    4185             off).  Save the linear TCR address in %save0/%r15
     4188            off).  Save the linear TCR address in %csave1/%r12
    41864189            so that we can restore it later, and preserve
    41874190            the entrypoint somewhere where C won't bash it.
     
    41894192            foreign code has never been safe (unless it's
    41904193            a fixnum */
    4191          __(save_tcr_linear(%save0))
    4192          __(movq %imm0,%save1)
    4193          __(movq %imm1,%save2)
     4194         __(save_tcr_linear(%csave1))
     4195         __(movq %imm0,%csave2)
     4196         __(movq %imm1,%csave3)
    41944197         __(set_foreign_gs_base())
    4195          __(movq %save1,%imm0)
    4196          __(movq %save2,%imm1)
     4198         __(movq %csave2,%imm0)
     4199         __(movq %csave3,%imm1)
    41974200        __endif
    41984201        __ifdef([WINDOWS])
    41994202        /* Preserve TCR pointer */
    4200         __(movq %rcontext_reg, %save0)
     4203        __(movq %rcontext_reg, %csave1)
    42014204        __endif
    42024205        __(movq %imm1,%r11)
     
    42084211        __(pop %carg3)
    42094212        __ifdef([WINDOWS])
    4210         __(sub $20, %rsp) /* Make room for arg register spill */
     4213        __(sub $0x20, %rsp) /* Make room for arg register spill */
    42114214        __else
    42124215        __(pop %carg4)
     
    42164219LocalLabelPrefix[]ffcall_return_registers_call:
    42174220        __(call *%r11)
    4218 LocalLabelPrefix[]ffcall_return_registers_call_end:               
    4219         __(movq %rax,(%rbx))
    4220         __(movq %rdx,8(%rbx))
    4221         __(movsd %xmm0,16(%rbx))
    4222         __(movsd %xmm1,24(%rbx))
     4221LocalLabelPrefix[]ffcall_return_registers_call_end:
     4222        __ifdef([WINDOWS])
     4223        __(add $0x20, %rsp)
     4224        __endif
     4225        __(movq %rax,(%csave0))
     4226        __(movq %rdx,8(%csave0))
     4227        __(movsd %xmm0,16(%csave0))
     4228        __(movsd %xmm1,24(%csave0))
    42234229        __(movq %rbp,%rsp)
    42244230        __ifdef([DARWIN_GS_HACK])
    42254231         /* %rax/%rdx contains the return value (maybe), %save0 still
    42264232            contains the linear tcr address.  Preserve %rax/%rdx here. */
    4227          __(set_gs_base(%save0))
    4228          __(movq (%save2),%rax)
    4229          __(movq 8(%save2),%rdx)
    4230          __(movsd 16(%save2),%xmm0)
    4231          __(movsd 24(%save2),%xmm1)
     4233         __(set_gs_base(%csave1))
     4234         __(movq (%csave3),%rax)
     4235         __(movq 8(%csave3),%rdx)
     4236         __(movsd 16(%csave3),%xmm0)
     4237         __(movsd 24(%csave3),%xmm1)
    42324238        __endif
    42334239        __ifdef([WINDOWS])
    4234         __(movq %save0, %rcontext_reg)
     4240        __(movq %csave1, %rcontext_reg)
    42354241        __endif
    42364242        __(movq %rsp,rcontext(tcr.foreign_sp))       
     
    45024508
    45034509
    4504 /* Callback index in %r11         */
     4510/* Callback index in %r11 */
    45054511_spentry(callback)
    45064512        __(push %rbp)
    45074513        __(movq %rsp,%rbp)
    45084514        /* C scalar args   */
    4509         __(push %rdi)   /* -8(%rbp)   */
    4510         __(push %rsi)
    4511         __(push %rdx)
    4512         __(push %rcx)
    4513         __(push %r8)
    4514         __(push %r9)
     4515        __(push %carg0) /* -8(%rbp)   */
     4516        __(push %carg1)
     4517        __(push %carg2)
     4518        __(push %carg3)
     4519        __ifndef([WINDOWS])
     4520        __(push %carg4)
     4521        __(push %carg5)
     4522        __endif
    45154523        /* FP arg regs   */
     4524        __ifdef([WINDOWS])
     4525        __(subq $4*8,%rsp)
     4526        __else
    45164527        __(subq $8*8,%rsp)
    4517         __(movq %xmm0,7*8(%rsp))        /* -56(%rbp)   */
     4528        __endif
     4529        __(movq %xmm0,7*8(%rsp))        /* -56(%rbp), -72(%rbp) on Windows   */
    45184530        __(movq %xmm1,6*8(%rsp))
    45194531        __(movq %xmm2,5*8(%rsp))
    45204532        __(movq %xmm3,4*8(%rsp))
     4533        __ifndef([WINDOWS])
    45214534        __(movq %xmm4,3*8(%rsp))
    45224535        __(movq %xmm5,2*8(%rsp))
    45234536        __(movq %xmm6,1*8(%rsp))
    45244537        __(movq %xmm7,0*8(%rsp))
     4538        __endif
    45254539        /* C NVRs   */
    4526         __(push %r12)
    4527         __(push %r13)
    4528         __(push %r14)
    4529         __(push %r15)
    4530         __(push %rbx)
     4540        __(push %csave0)
     4541        __(push %csave1)
     4542        __(push %csave2)
     4543        __(push %csave3)
     4544        __(push %csave4)
     4545        __ifdef([WINDOWS])
     4546        __(push %csave5)
     4547        __(push %csave6)
     4548        __endif
    45314549        __(push %rbp)
     4550        __(movq %r11,%csave0)
    45324551        __ifdef([HAVE_TLS])
    45334552         /* TCR initialized for lisp ?   */
    45344553         __ifndef([WINDOWS]) /* FIXME */
    45354554         __(movq %fs:current_tcr@TPOFF+tcr.linear,%rax)
    4536          __endif
    45374555         __(testq %rax,%rax)
    45384556         __(jne 1f)
     4557         __endif
    45394558        __endif
    4540         __(movq %r11,%r12)
    45414559        __(ref_global(get_tcr,%rax))
    4542         __(movq $1,%rdi)
     4560        __(movq $1,%carg0)
     4561        __ifdef([WINDOWS])
     4562        __(sub $0x20, %rsp)
     4563        __endif
    45434564        __(call *%rax)
     4565        __ifdef([WINDOWS])
     4566        __(add $0x20, %rsp)
     4567        __(movq %rax, %rcontext_reg)
     4568        __endif
    45444569        __ifdef([DARWIN_GS_HACK])
    45454570         /* linear TCR address in now in %rax; callback index was
     
    45474572         __(set_gs_base(%rax))
    45484573        __endif
    4549         __(movq %r12,%r11)
    455045741:      /* Align foreign stack for lisp   */
    45514575        __(pushq rcontext(tcr.save_rbp)) /* mark cstack frame's "owner" */
    45524576        __(pushq rcontext(tcr.foreign_sp))
    45534577        /* init lisp registers   */
    4554         __(movq %r11,%rax)
     4578        __(movq %csave0,%rax)
    45554579        __(movq %rsp,rcontext(tcr.foreign_sp))
     4580        __ifndef([WINDOWS])
    45564581        __(clr %save3)
     4582        __endif
    45574583        __(clr %save2)
    45584584        __(clr %save1)
     
    45984624        __endif
    45994625        __(pop %rbp)
    4600         __(pop %rbx)
    4601         __(pop %r15)
    4602         __(pop %r14)
    4603         __(pop %r13)
    4604         __(pop %r12)
     4626        __ifdef([WINDOWS])
     4627        __(pop %csave6)
     4628        __(pop %csave5)
     4629        __endif
     4630        __(pop %csave4)
     4631        __(pop %csave3)
     4632        __(pop %csave2)
     4633        __(pop %csave1)
     4634        __(pop %csave0)
    46054635        __(movq -8(%rbp),%rax)
    46064636        __(movq -16(%rbp),%rdx)
Note: See TracChangeset for help on using the changeset viewer.