diff --git a/src/compiler/x86/macros.lisp b/src/compiler/x86/macros.lisp index 9d955f40e59c2151abd99f7ac8dd98abc84b826c..21b68e485f82017453d298aee53f1363092aa408 100644 --- a/src/compiler/x86/macros.lisp +++ b/src/compiler/x86/macros.lisp @@ -183,31 +183,20 @@ (defun not-inline-allocation (alloc-tn size) ;; C call to allocate via dispatch routines. Each destination has a ;; special entry point. The size may be a register or a constant. - (ecase (tn-offset alloc-tn) + (load-size alloc-tn alloc-tn size) + (case (tn-offset alloc-tn) (#.eax-offset - (load-size alloc-tn eax-tn size) - (inst call (make-fixup (extern-alien-name "alloc_to_eax") + (inst call (make-fixup (extern-alien-name #-sse2 "alloc_overflow_x87" + #+sse2 "alloc_overflow_sse2") :foreign))) - (#.ecx-offset - (load-size alloc-tn ecx-tn size) - (inst call (make-fixup (extern-alien-name "alloc_to_ecx") - :foreign))) - (#.edx-offset - (load-size alloc-tn edx-tn size) - (inst call (make-fixup (extern-alien-name "alloc_to_edx") - :foreign))) - (#.ebx-offset - (load-size alloc-tn ebx-tn size) - (inst call (make-fixup (extern-alien-name "alloc_to_ebx") - :foreign))) - (#.esi-offset - (load-size alloc-tn esi-tn size) - (inst call (make-fixup (extern-alien-name "alloc_to_esi") - :foreign))) - (#.edi-offset - (load-size alloc-tn edi-tn size) - (inst call (make-fixup (extern-alien-name "alloc_to_edi") - :foreign)))) + (t + (inst push eax-tn) ; Save any value in eax + (inst mov eax-tn alloc-tn) + (inst call (make-fixup (extern-alien-name #-sse2 "alloc_overflow_x87" + #+sse2 "alloc_overflow_sse2") + :foreign)) + (inst mov alloc-tn eax-tn) ; Save allocated address in alloc-tn + (inst pop eax-tn))) (values)) ;;; diff --git a/src/lisp/x86-assem.S b/src/lisp/x86-assem.S index 46640fad1637e1e380e0aa51dc8b091d8d2afc6e..9583e843ea1fd5e3b227997b499ae6c927439896 100644 --- a/src/lisp/x86-assem.S +++ b/src/lisp/x86-assem.S @@ -458,101 +458,6 @@ ENDFUNC(fastcopy16) #endif -/* - Allocate bytes and return the start of the allocated space - in the specified destination register. - - In the general case the size will be in the destination register. - - All registers must be preserved except the destination. - The C conventions will preserve ebx, esi, edi, and ebp. - So only eax, ecx, and edx need special care here. */ - -FUNCDEF(alloc_to_eax) - STACK_PROLOGUE(12) - movl %ecx, 8(%esp) # Save ecx and edx as C could destroy them. - movl %edx, 4(%esp) - movl %eax, (%esp) # Push the size - call GNAME(alloc) - movl 4(%esp), %edx # Restore ecx and edx. - movl 8(%esp), %ecx - STACK_EPILOGUE - ret -ENDFUNC(alloc_to_eax) - -FUNCDEF(alloc_to_ecx) - STACK_PROLOGUE(12) - movl %eax, 8(%esp) # Save eax and edx as C could destroy them. - movl %edx, 4(%esp) - movl %ecx, (%esp) # Push the size - call GNAME(alloc) - movl %eax,%ecx # setup the destination. - movl 4(%esp), %edx # Restore eax and edx. - movl 8(%esp), %eax - STACK_EPILOGUE - ret -ENDFUNC(alloc_to_ecx) - -FUNCDEF(alloc_to_edx) - STACK_PROLOGUE(12) - movl %eax, 8(%esp) # Save eax and ecx as C could destroy them. - movl %ecx, 4(%esp) - movl %edx, (%esp) # Push the size - call GNAME(alloc) - movl %eax,%edx # setup the destination. - movl 4(%esp), %ecx # Restore eax and ecx. - movl 8(%esp), %eax - STACK_EPILOGUE - ret -ENDFUNC(alloc_to_edx) - -FUNCDEF(alloc_to_ebx) - STACK_PROLOGUE(16) - movl %eax, 12(%esp) # Save eax, ecx, and edx as C could destroy them. - movl %ecx, 8(%esp) - movl %edx, 4(%esp) - movl %ebx, (%esp) # Push the size - call GNAME(alloc) - movl %eax,%ebx # setup the destination. - movl 4(%esp), %edx # Restore eax, ecx and edx. - movl 8(%esp), %ecx - movl 12(%esp), %eax - STACK_EPILOGUE - ret -ENDFUNC(alloc_to_ebx) - -FUNCDEF(alloc_to_esi) - STACK_PROLOGUE(16) - movl %eax, 12(%esp) # Save eax, ecx, and edx as C could destroy them. - movl %ecx, 8(%esp) - movl %edx, 4(%esp) - movl %esi, (%esp) # Push the size - call GNAME(alloc) - movl %eax,%esi # setup the destination. - movl 4(%esp), %edx # Restore eax, ecx and edx. - movl 8(%esp), %ecx - movl 12(%esp), %eax - STACK_EPILOGUE - ret -ENDFUNC(alloc_to_esi) - -FUNCDEF(alloc_to_edi) - STACK_PROLOGUE(16) - movl %eax, 12(%esp) # Save eax, ecx, and edx as C could destroy them. - movl %ecx, 8(%esp) - movl %edx, 4(%esp) - movl %edi, (%esp) # Push the size - call GNAME(alloc) - movl %eax,%edi # setup the destination. - movl 4(%esp), %edx # Restore eax, ecx and edx. - movl 8(%esp), %ecx - movl 12(%esp), %eax - STACK_EPILOGUE - ret -ENDFUNC(alloc_to_edi) - -#ifdef GENCGC - /* * alloc_overflow_x87 and alloc_overflow_sse2 must not be called from * C because it doesn't follow C conventions. @@ -595,8 +500,6 @@ FUNCDEF(alloc_overflow_sse2) ret ENDFUNC(alloc_overflow_sse2) -#endif /* GENCGC */ - #ifdef LINKAGE_TABLE /* Call into C code to resolve a linkage entry. The initial code in the