* Removed all Id tags.
[cacao.git] / src / vm / jit / i386 / asmpart.S
index 24b5edb6ddad250320e96f8e1f7cdec39f9e06a2..179fbd038c0022f442e095b5d74c6d12cdd2aa02 100644 (file)
@@ -22,8 +22,6 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: asmpart.S 7254 2007-01-29 21:38:54Z twisti $
-
 */
 
 
@@ -33,7 +31,6 @@
 
 #include "vm/jit/i386/arch.h"
 #include "vm/jit/i386/md-abi.h"
-#include "vm/jit/i386/offsets.h"
 
 #include "vm/jit/abi-asm.h"
 #include "vm/jit/methodheader.h"
@@ -52,6 +49,7 @@
        .globl asm_vm_call_method_float
        .globl asm_vm_call_method_double
        .globl asm_vm_call_method_exception_handler
+       .globl asm_vm_call_method_end
 
        .globl asm_call_jit_compiler
        .globl asm_handle_nat_exception
@@ -74,9 +72,6 @@
        .globl asm_compare_and_swap
        .globl asm_memory_barrier
 
-       .globl asm_criticalsections
-       .globl asm_getclassvalues_atomic
-
        .globl asm_get_cycle_count
 
 
@@ -151,65 +146,36 @@ asm_vm_call_method_double:
        mov     s1,1*4(sp)
        mov     s2,2*4(sp)
 
-       mov     4*4(bp),itmp1               /* pointer to arg block (4(push)+4(return)+4+4)*/
-       mov     3*4(bp),itmp2               /* arg count            (4(push)+4(return)+4 */
-
-       mov     sp,s1                       /* save the stackpointer              */
-
-       test    itmp2,itmp2                 /* maybe we have no args              */
-       jle     L_asm_vm_call_method_copy_done
-
-       mov     itmp2,itmp3                 /* calculate stack size               */
-       mov     itmp1,%edi                  /* save pointer to arg block          */
-
-calljava_calcstacksize:
-       mov     offvmargtype(itmp1),t0
-       test    $1,t0                       /* two word type?                     */
-       jz      calljava_onewordtype
-
-       sub     $4,sp                       /* add 1 slot to stackframe size      */
+       mov     sp,s1                       /* save stack pointer                 */
 
-calljava_onewordtype:
-       sub     $4,sp                       /* add 1 slot to stackframe size      */
-       sub     $1,itmp3
-       test    itmp3,itmp3                 /* any args left?                     */
-       jz      calljava_setstack
+       mov     3*4(bp),t0                  /* address of data structure          */
+       mov     4*4(bp),itmp1               /* number of stack arguments          */
 
-       add     $sizevmarg,itmp1            /* goto next argument block           */
-       jmp     calljava_calcstacksize
-               
-calljava_setstack:                             
-       mov     %edi,itmp1                  /* restore pointer to arg block       */
-       and     $0xfffffff0,sp              /* align stack to 16-byte             */
-       mov     sp,itmp3                    /* initialize pointer for copying     */
-
-calljava_copyloop:
-       mov     offvmargdata(itmp1),t0      /* get 4-bytes of argument            */
-       mov     t0,(itmp3)                  /* and store them on the stack        */
-       add     $4,itmp3                    /* increase sp to next argument       */
-
-       mov     offvmargtype(itmp1),t0      /* get the argument type              */
-       test    $1,t0                       /* two word type?                     */
-       jz      calljava_copynext
+       cmp     $0,itmp1
+       je      L_asm_vm_call_method_stack_copy_done
 
-       mov     offvmargdata+4(itmp1),t0    /* get upper 4-bytes of 2 word type   */
-       mov     t0,(itmp3)                      
-       add     $4,itmp3                    /* increase sp to next argument       */
+       mov     itmp1,itmp2
+       add     $1,itmp2                    /* keep stack 16-byte aligned         */
+       and     $0xfffffffe,itmp2
+       shl     $3,itmp2                    /* calculate stack size               */
+       sub     itmp2,sp                    /* create stack frame                 */
+       mov     sp,itmp2                    /* temporary stack pointer            */
 
-calljava_copynext:             
-       sub     $1,itmp2                    /* are there any args left?           */
-       test    itmp2,itmp2
-       jle     L_asm_vm_call_method_copy_done
+L_asm_vm_call_method_stack_copy_loop:
+       mov     0(t0),itmp3                 /* load argument                      */
+       mov     itmp3,0(itmp2)              /* store argument on stack            */
+       mov     4(t0),itmp3
+       mov     itmp3,4(itmp2)
 
-       add     $sizevmarg,itmp1            /* goto next argument block           */
-       jmp     calljava_copyloop
+       sub     $1,itmp1                    /* subtract 1 argument                */
+       add     $8,t0                       /* set address of next argument       */
+       add     $8,itmp2                    /* increase SP                        */
 
-L_asm_vm_call_method_copy_done:
-       mov     2*4(bp),itmp1               /* move function pointer to itmp1     */
+       cmp     $0,itmp1
+       jg      L_asm_vm_call_method_stack_copy_loop
 
-       lea     L_asm_call_jit_compiler,mptr
-       mov     mptr,3*4(s1)
-       lea     (3*4-256)(s1),mptr          /* We subtract 256 to force the next  */
+L_asm_vm_call_method_stack_copy_done:
+       lea     (2*4-256)(bp),mptr          /* We subtract 256 to force the next  */
                                            /* move instruction to have a 32-bit  */
                                            /* offset.                            */
 
@@ -230,6 +196,7 @@ asm_vm_call_method_exception_handler:
        push    xptr                        /* pass exception pointer             */
        call    builtin_throw_exception
        add     $4,sp
+asm_vm_call_method_end:
        jmp     L_asm_vm_call_method_return
 
 
@@ -379,11 +346,11 @@ L_asm_handle_exception_no_leaf_stack:
        cmp     $2,itmp1
        je      int2
 
-       mov     -3*4(itmp2),s0
+       mov     -3*8(itmp2),s0
 int2:  
-       mov     -2*4(itmp2),s1
+       mov     -2*8(itmp2),s1
 int1:  
-       mov     -1*4(itmp2),s2
+       mov     -1*8(itmp2),s2
 
        shl     $2,itmp1                    /* multiply by 4 bytes                */
        sub     itmp1,itmp2
@@ -658,7 +625,7 @@ asm_compare_and_swap:
        mov     1*4(sp),%ecx            /* load p into a register                 */
        mov     2*4(sp),%eax            /* load oldval into return register       */
        mov     3*4(sp),%edx            /* load newval into a register            */
-       lock cmpxchgl %edx,0(%ecx)
+       lock; cmpxchgl %edx,0(%ecx)
        ret
 
 
@@ -669,50 +636,10 @@ asm_compare_and_swap:
 *******************************************************************************/
 
 asm_memory_barrier:
-       lock add $0,0(sp)
+       lock; add $0,0(sp)
        ret
 
                
-asm_getclassvalues_atomic:
-_crit_restart2:
-       mov     4(%esp),%ecx        /* super */
-       mov     8(%esp),%edx        /* sub */
-_crit_begin2:
-       mov     offbaseval(%ecx),%eax
-       mov     offdiffval(%ecx),%ecx
-       mov     offbaseval(%edx),%edx
-_crit_end2:
-       push    %ebx
-       mov     16(%esp),%ebx      /* out */
-       mov     %eax,offcast_super_baseval(%ebx)
-       mov     %ecx,offcast_super_diffval(%ebx)
-       mov     %edx,offcast_sub_baseval(%ebx)
-       pop     %ebx
-       ret
-
-       .data
-
-asm_criticalsections:
-#if defined(ENABLE_THREADS)
-#if 0
-       .long   _crit_begin1
-       .long   _crit_end1
-       .long   _crit_restart1
-#endif
-       .long   _crit_begin2
-       .long   _crit_end2
-       .long   _crit_restart2
-#endif
-       .long 0
-
-
-/* Disable exec-stacks, required for Gentoo ***********************************/
-
-#if defined(__GCC__) && defined(__ELF__)
-       .section .note.GNU-stack,"",@progbits
-#endif
-
-
 /* asm_get_cycle_count *********************************************************
 
    Get the current time-stamp counter from the CPU.
@@ -724,6 +651,13 @@ asm_get_cycle_count:
        ret
 
 
+/* disable exec-stacks ********************************************************/
+
+#if defined(__linux__) && defined(__ELF__)
+       .section .note.GNU-stack,"",%progbits
+#endif
+
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where