gencgc: More precise conservatism for pointers to boxed pages.
[sbcl.git] / src / runtime / x86-64-assem.S
index 6b1f760..d808476 100644 (file)
@@ -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))
 \f
@@ -277,6 +301,24 @@ GNAME(undefined_tramp):
        ret
        SIZE(GNAME(undefined_tramp))
 
+       .text
+       .align  align_16byte,0x90
+       .globl  GNAME(undefined_alien_function)
+       TYPE(GNAME(undefined_alien_function))
+GNAME(undefined_alien_function):
+       pop     8(%rbp)         # Save return PC for backtrace.
+       TRAP
+       .byte   trap_Error
+        .byte   4
+        .byte   UNDEFINED_ALIEN_FUN_ERROR
+        /* Encode RBX
+           FIXME: make independt of the encoding changes. */
+        .byte   0xFE 
+        .byte   0x9F
+        .byte   0x01
+       ret
+       SIZE(GNAME(undefined_alien_function))
+
 /* KLUDGE: FIND-ESCAPED-FRAME (SYS:SRC;CODE;DEBUG-INT.LISP) needs
  * to know the name of the function immediately following the
  * undefined-function trampoline. */
@@ -363,7 +405,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 +413,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