X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-assem.S;h=b85639eb14e0f267e5baa0ea954ecbea5be3e5f9;hb=37d3828773e2f847bb1ed7522b0af4fb8e736fc8;hp=6b1f760647c307d9f24c2505ee291010d42b917e;hpb=f93e3064ca572904ee399b77642ba52f2edfce3e;p=sbcl.git diff --git a/src/runtime/x86-64-assem.S b/src/runtime/x86-64-assem.S index 6b1f760..b85639e 100644 --- a/src/runtime/x86-64-assem.S +++ b/src/runtime/x86-64-assem.S @@ -25,7 +25,7 @@ #include "genesis/thread.h" /* Minimize conditionalization for different OS naming schemes. */ -#if defined __linux__ || defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ || defined __sun +#if defined __linux__ || defined __FreeBSD__ || defined __OpenBSD__ || defined __NetBSD__ || defined __sun || defined _WIN64 #define GNAME(var) var #else #define GNAME(var) _##var @@ -33,7 +33,7 @@ /* Get the right type of alignment. Linux, FreeBSD and OpenBSD * want alignment in bytes. */ -#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined __NetBSD__ || defined(__sun) +#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined __NetBSD__ || defined(__sun) || defined _WIN64 #define align_4byte 4 #define align_8byte 8 #define align_16byte 16 @@ -156,12 +156,23 @@ GNAME(call_into_lisp_first_time): * return values in rax rdx * callee saves rbp rbx r12-15 if it uses them */ - +#ifdef LISP_FEATURE_WIN32 +# define SUPPORT_FOMIT_FRAME_POINTER +#endif .align align_16byte,0x90 GNAME(call_into_lisp): +#ifdef SUPPORT_FOMIT_FRAME_POINTER + mov %rbp,%rax +#endif push %rbp # Save old frame pointer. mov %rsp,%rbp # Establish new frame. Lstack: +#ifdef SUPPORT_FOMIT_FRAME_POINTER + /* If called through call_into_lisp_first_time, %r15 becomes invalid + * here, but we will not return in that case. */ + push %r15 + mov %rax,%r15 +#endif /* FIXME x86 saves FPU state here */ push %rbx # these regs are callee-saved according to C push %r12 # so must be preserved and restored when @@ -176,6 +187,13 @@ Lstack: push %rsi # push %rdx # #ifdef LISP_FEATURE_SB_THREAD +# ifdef SUPPORT_FOMIT_FRAME_POINTER + mov (%rbp),%rcx + sub $32,%rsp + call GNAME(carry_frame_pointer) + add $32,%rsp + mov %rax,(%rbp) +# endif #ifdef LISP_FEATURE_GCC_TLS movq %fs:0, %rax movq GNAME(current_thread)@TPOFF(%rax), %r12 @@ -238,7 +256,13 @@ LsingleValue: /* FIXME Restore the NPX state. */ mov %rdx,%rax # c-val +#ifdef SUPPORT_FOMIT_FRAME_POINTER + mov %r15,%rbp # orig rbp + pop %r15 # orig r15 + add $8,%rsp # no need for saved (overridden) rbp +#else leave +#endif ret SIZE(GNAME(call_into_lisp)) @@ -363,7 +387,7 @@ GNAME(closure_tramp): .align align_16byte,0x90 .globl GNAME(funcallable_instance_tramp) #if !defined(LISP_FEATURE_DARWIN) - .type GNAME(funcallable_instance_tramp),@function + TYPE(GNAME(funcallable_instance_tramp)) #endif GNAME(funcallable_instance_tramp): mov FUNCALLABLE_INSTANCE_FUNCTION_OFFSET(%rax),%rax @@ -371,7 +395,7 @@ GNAME(closure_tramp): * now, the first word of it contains the address to jump to. */ jmp *CLOSURE_FUN_OFFSET(%rax) #if !defined(LISP_FEATURE_DARWIN) - .size GNAME(funcallable_instance_tramp), .-GNAME(funcallable_instance_tramp) + SIZE(GNAME(funcallable_instance_tramp)) #endif /* * fun-end breakpoint magic