[Openmcl-cvs-notifications] r8608 - /trunk/source/lisp-kernel/x86-spentry64.s
andreas at clozure.com
andreas at clozure.com
Wed Feb 27 12:20:56 EST 2008
Author: andreas
Date: Wed Feb 27 12:20:56 2008
New Revision: 8608
Log:
Windows support for ffcall and ffcall_return_registers: care about =
differences in C ABI, save TCR pointer. No exception handling yet.
Modified:
trunk/source/lisp-kernel/x86-spentry64.s
Modified: trunk/source/lisp-kernel/x86-spentry64.s
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- trunk/source/lisp-kernel/x86-spentry64.s (original)
+++ trunk/source/lisp-kernel/x86-spentry64.s Wed Feb 27 12:20:56 2008
@@ -3950,7 +3950,9 @@
__(push %save0)
__(push %save1)
__(push %save2)
- __(push %save3) /* 10 registers pushed after %rbp */
+ __ifndef([WINDOWS])
+ __(push %save3) /* 11 registers pushed after %rbp */
+ __endif
__(movq %rsp,rcontext(tcr.save_vsp))
__(movq %rbp,rcontext(tcr.save_rbp))
__(movq $TCR_STATE_FOREIGN,rcontext(tcr.valence))
@@ -3978,15 +3980,23 @@
__(movq %save1,%imm1)
__(movq %save2,%imm0)
__endif
+ __ifdef([WINDOWS])
+ /* Preserve TCR pointer */
+ __(movq %rcontext_reg, %save0)
+ __endif
LocalLabelPrefix[]ffcall_setup: =
__(addq $2*node_size,%rsp)
__(movq %imm1,%r11)
- __(pop %rdi)
- __(pop %rsi)
- __(pop %rdx)
- __(pop %rcx)
- __(pop %r8)
- __(pop %r9)
+ __(pop %carg0)
+ __(pop %carg1)
+ __(pop %carg2)
+ __(pop %carg3)
+ __ifdef([WINDOWS])
+ __(sub $20, %rsp) /* Make room for arg register spill */
+ __else
+ __(pop %carg4)
+ __(pop %carg5)
+ __endif
LocalLabelPrefix[]ffcall_setup_end: =
LocalLabelPrefix[]ffcall_call:
__(call *%r11)
@@ -4001,8 +4011,13 @@
__(movq %save1,%rax)
__(movq %save2,%rdx)
__endif
- __(movq %rsp,rcontext(tcr.foreign_sp)) =
+ __ifdef([WINDOWS])
+ __(movq %save0, %rcontext_reg)
+ __endif
+ __(movq %rsp,rcontext(tcr.foreign_sp))
+ __ifndef([WINDOWS])
__(clr %save3)
+ __endif
__(clr %save2)
__(clr %save1)
__(clr %save0)
@@ -4024,7 +4039,9 @@
__(movq rcontext(tcr.save_vsp),%rsp)
__(movq rcontext(tcr.save_rbp),%rbp)
__(movq $TCR_STATE_LISP,rcontext(tcr.valence))
+ __ifndef([WINDOWS])
__(pop %save3)
+ __endif
__(pop %save2)
__(pop %save1)
__(pop %save0)
@@ -4146,7 +4163,9 @@
__(push %save0)
__(push %save1)
__(push %save2)
+ __ifndef([WINDOWS])
__(push %save3)
+ __endif
__(movq macptr.address(%arg_y),%rbx) /* %rbx non-volatile */
__(push %fn)
__(movq %rsp,rcontext(tcr.save_vsp))
@@ -4176,15 +4195,23 @@
__(movq %save1,%imm0)
__(movq %save2,%imm1)
__endif
+ __ifdef([WINDOWS])
+ /* Preserve TCR pointer */
+ __(movq %rcontext_reg, %save0)
+ __endif
__(movq %imm1,%r11)
LocalLabelPrefix[]ffcall_return_registers_setup: =
__(addq $2*node_size,%rsp)
- __(pop %rdi)
- __(pop %rsi)
- __(pop %rdx)
- __(pop %rcx)
- __(pop %r8)
- __(pop %r9)
+ __(pop %carg0)
+ __(pop %carg1)
+ __(pop %carg2)
+ __(pop %carg3)
+ __ifdef([WINDOWS])
+ __(sub $20, %rsp) /* Make room for arg register spill */
+ __else
+ __(pop %carg4)
+ __(pop %carg5)
+ __endif
LocalLabelPrefix[]ffcall_return_registers_setup_end: =
LocalLabelPrefix[]ffcall_return_registers_call:
__(call *%r11)
@@ -4203,8 +4230,13 @@
__(movsd 16(%save2),%xmm0)
__(movsd 24(%save2),%xmm1)
__endif
+ __ifdef([WINDOWS])
+ __(movq %save0, %rcontext_reg)
+ __endif
__(movq %rsp,rcontext(tcr.foreign_sp)) =
+ __ifndef([WINDOWS])
__(clr %save3)
+ __endif
__(clr %save2)
__(clr %save1)
__(clr %save0)
@@ -4227,7 +4259,9 @@
__(movq rcontext(tcr.save_rbp),%rbp)
__(movq $TCR_STATE_LISP,rcontext(tcr.valence))
__(pop %fn)
+ __ifndef([WINDOWS])
__(pop %save3)
+ __endif
__(pop %save2)
__(pop %save1)
__(pop %save0)
More information about the Openmcl-cvs-notifications
mailing list