X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fx86-64-assem.S;h=85d5238583f98eb0537f6ecacdd28dfe15c10f77;hb=aa0ed5a420ea5295d586b3f323b5375d3b506860;hp=d0cc742db775381eb476012203f4ae394bdf804a;hpb=0f234877047c56ca945fe54e9e77a9cc2c8141cb;p=sbcl.git diff --git a/src/runtime/x86-64-assem.S b/src/runtime/x86-64-assem.S index d0cc742..85d5238 100644 --- a/src/runtime/x86-64-assem.S +++ b/src/runtime/x86-64-assem.S @@ -105,9 +105,6 @@ .globl GNAME(call_into_c) TYPE(GNAME(call_into_c)) GNAME(call_into_c): - /* ABI requires that the direction flag be clear on function - * entry and exit. */ - cld push %rbp # Save old frame pointer. mov %rsp,%rbp # Establish new frame. @@ -141,11 +138,12 @@ GNAME(call_into_lisp_first_time): push %rbp # Save old frame pointer. mov %rsp,%rbp # Establish new frame. mov %rsp,ALIEN_STACK + SYMBOL_VALUE_OFFSET +#if defined(LISP_FEATURE_DARWIN) movq GSYM(GNAME(all_threads)),%rax - mov THREAD_CONTROL_STACK_START_OFFSET(%rax) ,%rsp - /* don't think too hard about what happens if we get interrupted - * here */ - add $(THREAD_CONTROL_STACK_SIZE)-16,%rsp +#else + movq GNAME(all_threads),%rax +#endif + mov THREAD_CONTROL_STACK_END_OFFSET(%rax) ,%rsp jmp Lstack .text @@ -178,10 +176,19 @@ Lstack: push %rsi # push %rdx # #ifdef LISP_FEATURE_SB_THREAD +#ifdef LISP_FEATURE_GCC_TLS + movq %fs:0, %rax + movq GNAME(current_thread)@TPOFF(%rax), %r12 +#else +#ifdef LISP_FEATURE_DARWIN + mov GSYM(GNAME(specials)),%rdi +#else mov specials,%rdi - call pthread_getspecific +#endif + call GNAME(pthread_getspecific) mov %rax,%r12 #endif +#endif pop %rcx # num args pop %rbx # arg vector pop %rax # function ptr/lexenv @@ -228,10 +235,6 @@ LsingleValue: pop %r12 pop %rbx - /* ABI requires that the direction flag be clear on function - * entry and exit. */ - cld - /* FIXME Restore the NPX state. */ /* return value is already in rax where lisp expects it */ @@ -243,19 +246,17 @@ LsingleValue: .text .globl GNAME(fpu_save) TYPE(GNAME(fpu_save)) - .align 2,0x90 + .align align_16byte,0x90 GNAME(fpu_save): - mov 4(%rsp),%rax - fnsave (%rax) # Save the NPX state. (resets NPX) + fnsave (%rdi) # Save the NPX state. (resets NPX) ret SIZE(GNAME(fpu_save)) .globl GNAME(fpu_restore) TYPE(GNAME(fpu_restore)) - .align 2,0x90 + .align align_16byte,0x90 GNAME(fpu_restore): - mov 4(%rsp),%rax - frstor (%rax) # Restore the NPX state. + frstor (%rdi) # Restore the NPX state. ret SIZE(GNAME(fpu_restore)) @@ -263,7 +264,7 @@ GNAME(fpu_restore): * the undefined-function trampoline */ .text - .align align_8byte,0x90 + .align align_16byte,0x90 .globl GNAME(undefined_tramp) TYPE(GNAME(undefined_tramp)) GNAME(undefined_tramp): @@ -277,7 +278,7 @@ GNAME(undefined_tramp): .text - .align align_8byte,0x90 + .align align_16byte,0x90 .globl GNAME(alloc_tramp) TYPE(GNAME(alloc_tramp)) GNAME(alloc_tramp): @@ -313,7 +314,7 @@ GNAME(alloc_tramp): * the closure trampoline */ .text - .align align_8byte,0x90 + .align align_16byte,0x90 .globl GNAME(closure_tramp) TYPE(GNAME(closure_tramp)) GNAME(closure_tramp): @@ -328,7 +329,7 @@ GNAME(closure_tramp): SIZE(GNAME(closure_tramp)) .text - .align align_8byte,0x90 + .align align_16byte,0x90 .globl GNAME(funcallable_instance_tramp) #if !defined(LISP_FEATURE_DARWIN) .type GNAME(funcallable_instance_tramp),@function @@ -346,7 +347,7 @@ GNAME(closure_tramp): */ .text .globl GNAME(fun_end_breakpoint_guts) - .align align_8byte + .align align_16byte GNAME(fun_end_breakpoint_guts): /* Multiple Value return */ jc multiple_value_return @@ -366,6 +367,7 @@ GNAME(fun_end_breakpoint_guts): multiple_value_return: .globl GNAME(fun_end_breakpoint_trap) + .align align_16byte,0x90 GNAME(fun_end_breakpoint_trap): TRAP .byte trap_FunEndBreakpoint @@ -377,7 +379,7 @@ GNAME(fun_end_breakpoint_end): .globl GNAME(do_pending_interrupt) TYPE(GNAME(do_pending_interrupt)) - .align align_8byte,0x90 + .align align_16byte,0x90 GNAME(do_pending_interrupt): TRAP .byte trap_PendingInterrupt @@ -386,7 +388,7 @@ GNAME(do_pending_interrupt): .globl GNAME(post_signal_tramp) TYPE(GNAME(post_signal_tramp)) - .align align_8byte,0x90 + .align align_16byte,0x90 GNAME(post_signal_tramp): /* this is notionally the second half of a function whose first half * doesn't exist. This is where call_into_lisp returns when called @@ -412,7 +414,7 @@ GNAME(post_signal_tramp): SIZE(GNAME(post_signal_tramp)) .text - .align align_8byte,0x90 + .align align_16byte,0x90 .globl GNAME(fast_bzero) TYPE(GNAME(fast_bzero))