* src/vm/jit/i386/asmpart.S: Made position independent.
[cacao.git] / src / vm / jit / i386 / asmpart.S
index a2c27e00754fd506a4e0e3f319243380bc538e96..e182ddeeccf9d2e3490309361508a0e57e534c0b 100644 (file)
@@ -1,9 +1,7 @@
 /* src/vm/jit/i386/asmpart.S - Java-C interface functions for i386
 
-   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
-   C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
-   E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
-   J. Wenninger, Institut f. Computersprachen - TU Wien
+   Copyright (C) 1996-2005, 2006, 2007, 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
 
    This file is part of CACAO.
 
@@ -64,7 +62,9 @@
        .globl asm_compare_and_swap
        .globl asm_memory_barrier
 
-       .globl asm_get_cycle_count
+#if defined(ENABLE_ESCAPE_CHECK)
+       .globl asm_escape_check
+#endif
 
 
 /* asm_md_init *****************************************************************
@@ -122,7 +122,7 @@ asm_vm_call_method_long:
 asm_vm_call_method_float:
 asm_vm_call_method_double:
        push    bp
-       mov     sp,bp                       /* save stackptr                      */
+       mov     sp,bp                       /* save stack pointer                 */
        sub     $(4*4),sp                   /* create stackframe                  */
        and     $0xfffffff0,sp              /* align stack to 16-byte             */
 
@@ -177,8 +177,20 @@ L_asm_vm_call_method_return:
        ret
 
 asm_vm_call_method_exception_handler:
+#if defined(ENABLE_PIC_ASM)
+       sub     $12, %esp
+       push    %ebx
+#endif
        push    xptr                        /* pass exception pointer             */
+#if defined(ENABLE_PIC_ASM)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    builtin_throw_exception@PLT
+       pop     %ebx
+       add     $12, %esp
+#else
        call    builtin_throw_exception
+#endif
        add     $4,sp
 asm_vm_call_method_end:
        jmp     L_asm_vm_call_method_return
@@ -217,7 +229,13 @@ L_asm_handle_exception_stack_loop:
        mov     t0,8*4(sp)                  /* save maybe-leaf flag               */
 
        mov     xpc,0*4(sp)                 /* pass exception pc                  */
-       call    codegen_get_pv_from_pc
+#if defined(ENABLE_PIC_ASM)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    methodtree_find@PLT
+#else
+       call    methodtree_find
+#endif
        mov     v0,6*4(sp)                  /* save data segment pointer          */
 
        mov     4*4(sp),itmp3               /* pass exception pointer             */
@@ -227,7 +245,12 @@ L_asm_handle_exception_stack_loop:
        mov     v0,2*4(sp)                  /* pass data segment pointer          */
        mov     7*4(sp),itmp3               /* pass Java stack pointer            */
        mov     itmp3,3*4(sp)
+#if defined(ENABLE_PIC_ASM)
+       /* GOT still in %ebx */
+       call    exceptions_handle_exception@PLT
+#else
        call    exceptions_handle_exception
+#endif
 
        test    v0,v0
        jz      L_asm_handle_exception_not_catched
@@ -275,11 +298,11 @@ L_asm_handle_exception_no_leaf_stack:
        cmp     $2,itmp1
        je      int2
 
-       mov     -3*8(itmp2),s0
+       mov     -4-3*8(itmp2),s0
 int2:  
-       mov     -2*8(itmp2),s1
+       mov     -4-2*8(itmp2),s1
 int1:  
-       mov     -1*8(itmp2),s2
+       mov     -4-1*8(itmp2),s2
 
        shl     $2,itmp1                    /* multiply by 4 bytes                */
        sub     itmp1,itmp2
@@ -337,7 +360,13 @@ asm_abstractmethoderror:
        mov     3*4(sp),itmp2               /* pass exception address             */
        sub     $2,itmp2
        mov     itmp2,1*4(sp)
+#if defined(ENABLE_PIC_ASM)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    exceptions_asm_new_abstractmethoderror@PLT
+#else
        call    exceptions_asm_new_abstractmethoderror
+#endif
                                            /* exception pointer is return value  */
        add     $(3*4),sp                   /* remove stack frame                 */
 
@@ -352,31 +381,81 @@ asm_abstractmethoderror:
 *                                                                              *
 *******************************************************************************/
 
+#if defined(ENABLE_PIC_ASM)
+.GETPC:
+       mov     (%esp), %ebx
+       ret
+#endif
+
 asm_builtin_f2i:
        sub     $(3*4),%esp
+#if defined(ENABLE_PIC_ASM)
+       sub     $12, %esp
+       push    %ebx
+       fsts    (%esp)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    builtin_f2i@PLT
+       pop     %ebx
+       add     $12, %esp
+#else
        fsts    (%esp)
        call    builtin_f2i
+#endif
        add     $(3*4),%esp
        ret
 
 asm_builtin_d2i:
        sub     $(3*4),%esp
+#if defined(ENABLE_PIC_ASM)
+       sub     $12, %esp
+       push    %ebx
+       fstl    (%esp)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    builtin_d2i@PLT
+       pop     %ebx
+       add     $12, %esp
+#else
        fstl    (%esp)
        call    builtin_d2i
+#endif
        add     $(3*4),%esp
        ret
 
 asm_builtin_f2l:
        sub     $(3*4),%esp
+#if defined(ENABLE_PIC_ASM)
+       sub     $12, %esp
+       push    %ebx
+       fsts    (%esp)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    builtin_f2l@PLT
+       pop     %ebx
+       add     $12, %esp
+#else
        fsts    (%esp)
        call    builtin_f2l
+#endif
        add     $(3*4),%esp
        ret
 
 asm_builtin_d2l:
        sub     $(3*4),%esp
+#if defined(ENABLE_PIC_ASM)
+       sub     $12, %esp
+       push    %ebx
+       fstl    (%esp)
+       call    .GETPC
+       add     $_GLOBAL_OFFSET_TABLE_, %ebx
+       call    builtin_d2l@PLT
+       pop     %ebx
+       add     $12, %esp
+#else
        fstl    (%esp)
        call    builtin_d2l
+#endif
        add     $(3*4),%esp
        ret
 
@@ -414,16 +493,29 @@ asm_memory_barrier:
        lock; add $0,0(sp)
        ret
 
-               
-/* asm_get_cycle_count *********************************************************
 
-   Get the current time-stamp counter from the CPU.
+#if defined(ENABLE_ESCAPE_CHECK)
+asm_escape_check:
+       sub     $24,%esp
 
-*******************************************************************************/
+       mov     t0, 4(%esp)
+       mov     itmp1, 8(%esp)
+       mov     itmp2, 12(%esp)
+       mov     itmp3, 16(%esp)
+
+       mov     28(%esp), itmp1
+       mov     itmp1, (%esp)
+
+       call    escape_analysis_escape_check
 
-asm_get_cycle_count:
-       rdtsc
+       mov     4(%esp), t0
+       mov     8(%esp), itmp1
+       mov     12(%esp), itmp2
+       mov     16(%esp), itmp3
+
+       add     $24,sp
        ret
+#endif
 
 
 /* disable exec-stacks ********************************************************/
@@ -432,7 +524,6 @@ asm_get_cycle_count:
        .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