projects
/
sbcl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
1.0.22.15: 16 byte align assembly routines on x86 and x86-64
[sbcl.git]
/
src
/
runtime
/
x86-assem.S
diff --git
a/src/runtime/x86-assem.S
b/src/runtime/x86-assem.S
index
db4ee94
..
315643b
100644
(file)
--- a/
src/runtime/x86-assem.S
+++ b/
src/runtime/x86-assem.S
@@
-122,15
+122,12
@@
GNAME(call_into_c):
fstp %st(0)
fstp %st(0)
fstp %st(0)
fstp %st(0)
- cld # clear out DF: Darwin, Solaris and Win32 at
- # least need this, and it should not hurt others
-
call *%eax # normal callout using Lisp stack
movl %eax,%ecx # remember integer return value
/* Check for a return FP value. */
fxam
call *%eax # normal callout using Lisp stack
movl %eax,%ecx # remember integer return value
/* Check for a return FP value. */
fxam
- fnstsw %eax
+ fnstsw %ax
andl $0x4500,%eax
cmpl $0x4100,%eax
jne Lfp_rtn_value
andl $0x4500,%eax
cmpl $0x4100,%eax
jne Lfp_rtn_value
@@
-188,10
+185,8
@@
GNAME(call_into_lisp_first_time):
#ifndef LISP_FEATURE_WIN32
movl %esp,ALIEN_STACK + SYMBOL_VALUE_OFFSET
movl GNAME(all_threads),%eax
#ifndef LISP_FEATURE_WIN32
movl %esp,ALIEN_STACK + SYMBOL_VALUE_OFFSET
movl GNAME(all_threads),%eax
- movl THREAD_CONTROL_STACK_START_OFFSET(%eax) ,%esp
- /* don't think too hard about what happens if we get interrupted
- * here */
- addl $(THREAD_CONTROL_STACK_SIZE),%esp
+ /* pthread machinery takes care of this for other threads */
+ movl THREAD_CONTROL_STACK_END_OFFSET(%eax) ,%esp
#else
/* Win32 -really- doesn't like you switching stacks out from under it. */
movl GNAME(all_threads),%eax
#else
/* Win32 -really- doesn't like you switching stacks out from under it. */
movl GNAME(all_threads),%eax
@@
-340,7
+335,7
@@
GNAME(fpu_restore):
* the undefined-function trampoline
*/
.text
* the undefined-function trampoline
*/
.text
- .align align_4byte,0x90
+ .align align_16byte,0x90
.globl GNAME(undefined_tramp)
TYPE(GNAME(undefined_tramp))
.byte 0, 0, 0, SIMPLE_FUN_HEADER_WIDETAG
.globl GNAME(undefined_tramp)
TYPE(GNAME(undefined_tramp))
.byte 0, 0, 0, SIMPLE_FUN_HEADER_WIDETAG
@@
-357,7
+352,7
@@
GNAME(undefined_tramp):
* the closure trampoline
*/
.text
* the closure trampoline
*/
.text
- .align align_4byte,0x90
+ .align align_16byte,0x90
.globl GNAME(closure_tramp)
TYPE(GNAME(closure_tramp))
.byte 0, 0, 0, SIMPLE_FUN_HEADER_WIDETAG
.globl GNAME(closure_tramp)
TYPE(GNAME(closure_tramp))
.byte 0, 0, 0, SIMPLE_FUN_HEADER_WIDETAG
@@
-373,7
+368,7
@@
GNAME(closure_tramp):
SIZE(GNAME(closure_tramp))
.text
SIZE(GNAME(closure_tramp))
.text
- .align align_4byte,0x90
+ .align align_16byte,0x90
.globl GNAME(funcallable_instance_tramp)
TYPE(GNAME(funcallable_instance_tramp))
GNAME(funcallable_instance_tramp):
.globl GNAME(funcallable_instance_tramp)
TYPE(GNAME(funcallable_instance_tramp))
GNAME(funcallable_instance_tramp):
@@
-388,7
+383,7
@@
GNAME(funcallable_instance_tramp):
*/
.text
.globl GNAME(fun_end_breakpoint_guts)
*/
.text
.globl GNAME(fun_end_breakpoint_guts)
- .align align_4byte
+ .align align_16byte
GNAME(fun_end_breakpoint_guts):
/* Multiple Value return */
jc multiple_value_return
GNAME(fun_end_breakpoint_guts):
/* Multiple Value return */
jc multiple_value_return
@@
-415,7
+410,7
@@
GNAME(fun_end_breakpoint_end):
\f
.globl GNAME(do_pending_interrupt)
TYPE(GNAME(do_pending_interrupt))
\f
.globl GNAME(do_pending_interrupt)
TYPE(GNAME(do_pending_interrupt))
- .align align_4byte,0x90
+ .align align_16byte,0x90
GNAME(do_pending_interrupt):
TRAP
.byte trap_PendingInterrupt
GNAME(do_pending_interrupt):
TRAP
.byte trap_PendingInterrupt
@@
-440,17
+435,15
@@
GNAME(do_pending_interrupt):
#define ALLOC(size) \
pushl %ebp; /* Save EBP */ \
movl %esp,%ebp; /* Save ESP to EBP */ \
#define ALLOC(size) \
pushl %ebp; /* Save EBP */ \
movl %esp,%ebp; /* Save ESP to EBP */ \
- andl $0xfffffff0,%esp; /* Align stack */ \
- pushl $0; /* Padding */ \
- pushl size; /* Argument to alloc */ \
- cld; /* Clear DF */ \
+ pushl $0; /* Reserve space for arg */ \
+ andl $0xfffffff0,%esp; /* Align stack to 16bytes */ \
+ movl size, (%esp); /* Argument to alloc */ \
call GNAME(alloc); \
movl %ebp,%esp; /* Restore ESP from EBP */ \
popl %ebp; /* Restore EBP */
#else
#define ALLOC(size) \
pushl size; /* Argument to alloc */ \
call GNAME(alloc); \
movl %ebp,%esp; /* Restore ESP from EBP */ \
popl %ebp; /* Restore EBP */
#else
#define ALLOC(size) \
pushl size; /* Argument to alloc */ \
- cld; /* Clear DF */ \
call GNAME(alloc); \
addl $4,%esp; /* Pop argument */
#endif
call GNAME(alloc); \
addl $4,%esp; /* Pop argument */
#endif
@@
-458,7
+451,7
@@
GNAME(do_pending_interrupt):
#define DEFINE_ALLOC_TO_EAX(name,size) \
.globl GNAME(name); \
TYPE(GNAME(name)); \
#define DEFINE_ALLOC_TO_EAX(name,size) \
.globl GNAME(name); \
TYPE(GNAME(name)); \
- .align align_4byte,0x90; \
+ .align align_16byte,0x90; \
GNAME(name): \
pushl %ecx; /* Save ECX and EDX */ \
pushl %edx; \
GNAME(name): \
pushl %ecx; /* Save ECX and EDX */ \
pushl %edx; \
@@
-471,7
+464,7
@@
GNAME(name): \
#define DEFINE_ALLOC_TO_ECX(name,size) \
.globl GNAME(name); \
TYPE(GNAME(name)); \
#define DEFINE_ALLOC_TO_ECX(name,size) \
.globl GNAME(name); \
TYPE(GNAME(name)); \
- .align align_4byte,0x90; \
+ .align align_16byte,0x90; \
GNAME(name): \
pushl %eax; /* Save EAX and EDX */ \
pushl %edx; \
GNAME(name): \
pushl %eax; /* Save EAX and EDX */ \
pushl %edx; \
@@
-485,7
+478,7
@@
GNAME(name): \
#define DEFINE_ALLOC_TO_EDX(name,size) \
.globl GNAME(name); \
TYPE(GNAME(name)); \
#define DEFINE_ALLOC_TO_EDX(name,size) \
.globl GNAME(name); \
TYPE(GNAME(name)); \
- .align align_4byte,0x90; \
+ .align align_16byte,0x90; \
GNAME(name): \
pushl %eax; /* Save EAX and ECX */ \
pushl %ecx; \
GNAME(name): \
pushl %eax; /* Save EAX and ECX */ \
pushl %ecx; \
@@
-499,7
+492,7
@@
GNAME(name): \
#define DEFINE_ALLOC_TO_REG(name,reg,size) \
.globl GNAME(name); \
TYPE(GNAME(name)); \
#define DEFINE_ALLOC_TO_REG(name,reg,size) \
.globl GNAME(name); \
TYPE(GNAME(name)); \
- .align align_4byte,0x90; \
+ .align align_16byte,0x90; \
GNAME(name): \
pushl %eax; /* Save EAX, ECX, and EDX */ \
pushl %ecx; \
GNAME(name): \
pushl %eax; /* Save EAX, ECX, and EDX */ \
pushl %ecx; \
@@
-554,7
+547,7
@@
DEFINE_ALLOC_TO_REG(alloc_16_to_edi,%edi,$16)
/* This routine handles an overflow with eax=crfp+size. So the
size=eax-crfp. */
/* This routine handles an overflow with eax=crfp+size. So the
size=eax-crfp. */
- .align align_4byte
+ .align align_16byte
.globl GNAME(alloc_overflow_eax)
TYPE(GNAME(alloc_overflow_eax))
GNAME(alloc_overflow_eax):
.globl GNAME(alloc_overflow_eax)
TYPE(GNAME(alloc_overflow_eax))
GNAME(alloc_overflow_eax):
@@
-566,7
+559,7
@@
GNAME(alloc_overflow_eax):
ret
SIZE(GNAME(alloc_overflow_eax))
ret
SIZE(GNAME(alloc_overflow_eax))
- .align align_4byte
+ .align align_16byte
.globl GNAME(alloc_overflow_ecx)
TYPE(GNAME(alloc_overflow_ecx))
GNAME(alloc_overflow_ecx):
.globl GNAME(alloc_overflow_ecx)
TYPE(GNAME(alloc_overflow_ecx))
GNAME(alloc_overflow_ecx):
@@
-579,7
+572,7
@@
GNAME(alloc_overflow_ecx):
ret
SIZE(GNAME(alloc_overflow_ecx))
ret
SIZE(GNAME(alloc_overflow_ecx))
- .align align_4byte
+ .align align_16byte
.globl GNAME(alloc_overflow_edx)
TYPE(GNAME(alloc_overflow_edx))
GNAME(alloc_overflow_edx):
.globl GNAME(alloc_overflow_edx)
TYPE(GNAME(alloc_overflow_edx))
GNAME(alloc_overflow_edx):
@@
-594,7
+587,7
@@
GNAME(alloc_overflow_edx):
/* This routine handles an overflow with ebx=crfp+size. So the
size=ebx-crfp. */
/* This routine handles an overflow with ebx=crfp+size. So the
size=ebx-crfp. */
- .align align_4byte
+ .align align_16byte
.globl GNAME(alloc_overflow_ebx)
TYPE(GNAME(alloc_overflow_ebx))
GNAME(alloc_overflow_ebx):
.globl GNAME(alloc_overflow_ebx)
TYPE(GNAME(alloc_overflow_ebx))
GNAME(alloc_overflow_ebx):
@@
-611,7
+604,7
@@
GNAME(alloc_overflow_ebx):
/* This routine handles an overflow with esi=crfp+size. So the
size=esi-crfp. */
/* This routine handles an overflow with esi=crfp+size. So the
size=esi-crfp. */
- .align align_4byte
+ .align align_16byte
.globl GNAME(alloc_overflow_esi)
TYPE(GNAME(alloc_overflow_esi))
GNAME(alloc_overflow_esi):
.globl GNAME(alloc_overflow_esi)
TYPE(GNAME(alloc_overflow_esi))
GNAME(alloc_overflow_esi):
@@
-626,7
+619,7
@@
GNAME(alloc_overflow_esi):
ret
SIZE(GNAME(alloc_overflow_esi))
ret
SIZE(GNAME(alloc_overflow_esi))
- .align align_4byte
+ .align align_16byte
.globl GNAME(alloc_overflow_edi)
TYPE(GNAME(alloc_overflow_edi))
GNAME(alloc_overflow_edi):
.globl GNAME(alloc_overflow_edi)
TYPE(GNAME(alloc_overflow_edi))
GNAME(alloc_overflow_edi):
@@
-649,7
+642,7
@@
GNAME(alloc_overflow_edi):
* and EIP from the exception context and use it to fake
* up a stack frame which will skip over the system SEH
* code. */
* and EIP from the exception context and use it to fake
* up a stack frame which will skip over the system SEH
* code. */
- .align align_4byte
+ .align align_16byte
.globl GNAME(exception_handler_wrapper)
TYPE(GNAME(exception_handler_wrapper))
GNAME(exception_handler_wrapper):
.globl GNAME(exception_handler_wrapper)
TYPE(GNAME(exception_handler_wrapper))
GNAME(exception_handler_wrapper):
@@
-680,7
+673,7
@@
GNAME(exception_handler_wrapper):
#endif
#ifdef LISP_FEATURE_DARWIN
#endif
#ifdef LISP_FEATURE_DARWIN
- .align align_4byte
+ .align align_16byte
.globl GNAME(call_into_lisp_tramp)
TYPE(GNAME(call_into_lisp_tramp))
GNAME(call_into_lisp_tramp):
.globl GNAME(call_into_lisp_tramp)
TYPE(GNAME(call_into_lisp_tramp))
GNAME(call_into_lisp_tramp):
@@
-729,7
+722,7
@@
GNAME(call_into_lisp_tramp):
SIZE(call_into_lisp_tramp)
#endif
SIZE(call_into_lisp_tramp)
#endif
- .align align_4byte,0x90
+ .align align_16byte,0x90
.globl GNAME(post_signal_tramp)
TYPE(GNAME(post_signal_tramp))
GNAME(post_signal_tramp):
.globl GNAME(post_signal_tramp)
TYPE(GNAME(post_signal_tramp))
GNAME(post_signal_tramp):
@@
-754,7
+747,7
@@
GNAME(post_signal_tramp):
\f
.globl GNAME(fast_bzero_pointer)
.data
\f
.globl GNAME(fast_bzero_pointer)
.data
- .align align_4byte
+ .align align_16byte
GNAME(fast_bzero_pointer):
/* Variable containing a pointer to the bzero function to use.
* Initially points to a basic function. Change this variable
GNAME(fast_bzero_pointer):
/* Variable containing a pointer to the bzero function to use.
* Initially points to a basic function. Change this variable
@@
-762,7
+755,7
@@
GNAME(fast_bzero_pointer):
.long GNAME(fast_bzero_base)
\f
.text
.long GNAME(fast_bzero_base)
\f
.text
- .align align_8byte,0x90
+ .align align_16byte,0x90
.globl GNAME(fast_bzero)
TYPE(GNAME(fast_bzero))
GNAME(fast_bzero):
.globl GNAME(fast_bzero)
TYPE(GNAME(fast_bzero))
GNAME(fast_bzero):
@@
-772,7
+765,7
@@
GNAME(fast_bzero):
\f
.text
\f
.text
- .align align_8byte,0x90
+ .align align_16byte,0x90
.globl GNAME(fast_bzero_detect)
TYPE(GNAME(fast_bzero_detect))
GNAME(fast_bzero_detect):
.globl GNAME(fast_bzero_detect)
TYPE(GNAME(fast_bzero_detect))
GNAME(fast_bzero_detect):
@@
-810,7
+803,7
@@
Lrestore:
\f
.text
\f
.text
- .align align_8byte,0x90
+ .align align_16byte,0x90
.globl GNAME(fast_bzero_sse)
TYPE(GNAME(fast_bzero_sse))
.globl GNAME(fast_bzero_sse)
TYPE(GNAME(fast_bzero_sse))
@@
-856,7
+849,7
@@
Lend_sse:
\f
.text
\f
.text
- .align align_8byte,0x90
+ .align align_16byte,0x90
.globl GNAME(fast_bzero_base)
TYPE(GNAME(fast_bzero_base))
.globl GNAME(fast_bzero_base)
TYPE(GNAME(fast_bzero_base))
@@
-872,7
+865,6
@@
GNAME(fast_bzero_base):
xor %eax, %eax /* Zero EAX */
shr $2, %ecx /* Amount of 4-byte blocks to copy */
jz Lend_base
xor %eax, %eax /* Zero EAX */
shr $2, %ecx /* Amount of 4-byte blocks to copy */
jz Lend_base
- cld /* Set direction of STOSL to increment */
rep
stosl /* Store EAX to *EDI, ECX times, incrementing
rep
stosl /* Store EAX to *EDI, ECX times, incrementing
@@
-887,4
+879,3
@@
Lend_base:
\f
END()
\f
END()
-
\ No newline at end of file