* src/vm/jit/i386/asmpart.S: Made position independent.
[cacao.git] / src / vm / jit / i386 / asmpart.S
index 179fbd038c0022f442e095b5d74c6d12cdd2aa02..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.
 
        .globl asm_vm_call_method_exception_handler
        .globl asm_vm_call_method_end
 
-       .globl asm_call_jit_compiler
        .globl asm_handle_nat_exception
        .globl asm_handle_exception
 
        .globl asm_abstractmethoderror
 
-       .globl asm_patcher_wrapper
-
-#if defined(ENABLE_REPLACEMENT)
-       .globl asm_replacement_out
-       .globl asm_replacement_in
-#endif
-
        .globl asm_builtin_f2i
        .globl asm_builtin_f2l
        .globl asm_builtin_d2i
@@ -72,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 *****************************************************************
@@ -118,17 +110,9 @@ asm_md_init:
 
        .align  8
 
-       .long   0                           /* catch type all                     */
-       .long   0                           /* handler pc                         */
-       .long   0                           /* end pc                             */
-       .long   0                           /* start pc                           */
-       .long   1                           /* extable size                       */
-       .long   0                           /* line number table start            */
-       .long   0                           /* line number table size             */
        .long   0                           /* fltsave                            */
        .long   0                           /* intsave                            */
        .long   0                           /* isleaf                             */
-       .long   0                           /* IsSync                             */
        .long   0                           /* frame size                         */
        .long   0                           /* codeinfo pointer                   */
 
@@ -138,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             */
 
@@ -193,68 +177,25 @@ 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
 
 
-/* asm_call_jit_compiler *******************************************************
-
-   Invokes the compiler for untranslated JavaVM methods.
-
-   Register R0 contains a pointer to the method info structure (prepared
-   by createcompilerstub). Using the return address in R26 and the
-   offset in the LDA instruction or using the value in methodptr R28 the
-   patching address for storing the method address can be computed:
-
-   Method address was either loaded using
-
-   i386_mov_imm_reg(a, REG_ITMP2)                ; invokestatic/special
-   i386_call_reg(REG_ITMP2)
-
-   or
-
-   i386_mov_membase_reg(REG_SP, 0, REG_ITMP1)    ; invokevirtual/interface
-   i386_mov_membase_reg(REG_ITMP1, OFFSET(, vftbl), REG_ITMP2)
-   i386_mov_membase_reg(REG_ITMP2, OFFSET(vftbl, table[0]) + \
-       sizeof(methodptr) * m->vftblindex, REG_ITMP1)
-   i386_call_reg(REG_ITMP1)
-
-   In the static case the method pointer can be computed using the
-   return address and the lda function following the jmp instruction.
-
-*******************************************************************************/
-
-asm_call_jit_compiler:
-L_asm_call_jit_compiler:                /* required for PIC code              */
-       sub     $(4*4),sp                   /* keep stack 16-byte aligned         */
-
-       mov     itmp1,0*4(sp)               /* pass methodinfo pointer            */
-       mov     mptr,1*4(sp)                /* pass method pointer                */
-       mov     sp,itmp2                    /* pass java sp                       */
-       add     $((1+4)*4),itmp2
-       mov     itmp2,2*4(sp)
-       mov     4*4(sp),itmp3               /* pass java ra                       */
-       mov     itmp3,3*4(sp)
-       call    jit_asm_compile
-
-       add     $(4*4),sp                   /* remove stack frame                 */
-
-       test    v0,v0                       /* check for exception                */
-       je      L_asm_call_jit_compiler_exception
-
-       jmp             *v0                         /* ...and now call the new method     */
-
-L_asm_call_jit_compiler_exception:
-       call    exceptions_get_and_clear_exception
-                                           /* v0 == xptr                         */
-       pop     xpc                         /* get return address                 */
-       sub     $2,xpc                      /* faulting address is ra - 2         */
-       jmp     L_asm_handle_exception
-
-
 /* asm_handle_exception ********************************************************
 *                                                                              *
 *   This function handles an exception. It does not use the usual calling      *
@@ -288,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             */
@@ -298,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
@@ -346,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
@@ -408,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                 */
 
@@ -417,191 +375,87 @@ asm_abstractmethoderror:
        jmp     L_asm_handle_exception
 
 
-/* asm_patcher_wrapper *********************************************************
-
-   XXX
-
-   Stack layout:
-     24   return address
-     20   REG_ITMP3
-     16   pointer to virtual java_objectheader
-     12   last byte of machine code (xmcode)
-      8   machine code (which is patched back later)
-      4   unresolved field reference
-      0   patcher function pointer to call
-
-*******************************************************************************/
-
-asm_patcher_wrapper:
-       sub     $((1+4+4)*4),sp             /* keep stack 16-byte aligned         */
-
-       mov     itmp1,(0+4)*4(sp)           /* save itmp1 and itmp2               */
-       mov     itmp2,(1+4)*4(sp)
-
-       mov     sp,itmp1                    /* pass SP of patcher stub            */
-       add     $((1+4+4)*4),itmp1
-       mov     itmp1,0*4(sp)
-       movl    $0,1*4(sp)                  /* pass PV (if NULL, use findmethod)  */
-       movl    $0,2*4(sp)                  /* pass RA (it's on the stack)        */
-       call    patcher_wrapper
-       mov     v0,itmp3                    /* save return value                  */
-
-       mov     (0+4)*4(sp),itmp1           /* restore itmp1 and itmp2            */
-       mov     (1+4)*4(sp),itmp2
-
-       test    itmp3,itmp3                 /* exception thrown?                  */
-       jne     L_asm_patcher_wrapper_exception
-
-       mov     (5+1+4+4)*4(sp),itmp3       /* restore itmp3                      */
-       add     $((6+1+4+4)*4),sp           /* remove stack frame, keep RA        */
-
-       ret                                 /* jump to new patched code           */
-
-L_asm_patcher_wrapper_exception:
-       add     $((6+1+4+4)*4),sp           /* remove stack frame, keep RA        */
-       mov     itmp3,xptr                  /* get exception                      */
-       pop     xpc                         /* get and remove return address      */
-       jmp     L_asm_handle_exception
-
-#if defined(ENABLE_REPLACEMENT)
-
-/* asm_replacement_out *********************************************************
-
-   This code is jumped to from the replacement-out stubs that are executed
-   when a thread reaches an activated replacement point.
-
-   The purpose of asm_replacement_out is to read out the parts of the
-   execution state that cannot be accessed from C code, store this state,
-   and then call the C function replace_me.
-
-   Stack layout:
-      4                 start of stack inside method to replace
-      0   rplpoint *    info on the replacement point that was reached
-
-*******************************************************************************/
-
-/* some room to accomodate changes of the stack frame size during replacement */
-       /* XXX we should find a cleaner solution here */
-#define REPLACEMENT_ROOM  512
-
-asm_replacement_out:
-    /* create stack frame */
-       sub     $(sizeexecutionstate + REPLACEMENT_ROOM),sp
-
-       /* save registers in execution state */
-       mov     %eax,(EAX*4+offes_intregs)(sp)
-       mov     %ebx,(EBX*4+offes_intregs)(sp)
-       mov     %ecx,(ECX*4+offes_intregs)(sp)
-       mov     %edx,(EDX*4+offes_intregs)(sp)
-       mov     %esi,(ESI*4+offes_intregs)(sp)
-       mov     %edi,(EDI*4+offes_intregs)(sp)
-       mov     %ebp,(EBP*4+offes_intregs)(sp)
-       movl    $0  ,(ESP*4+offes_intregs)(sp) /* not used */
-
-       /* calculate sp of method */
-       mov     sp,itmp1
-       add     $(sizeexecutionstate + REPLACEMENT_ROOM + 4),itmp1
-       mov     itmp1,(offes_sp)(sp)
-
-       /* pv must be looked up via AVL tree */
-       movl    $0,(offes_pv)(sp)
-
-       /* call replace_me */
-       mov     -4(itmp1),itmp1             /* rplpoint *                         */
-    push    sp                          /* arg1: execution state              */
-    push    itmp1                       /* arg0: replacement point            */
-    call    replace_me                  /* call C function replace_me         */
-
-
-/* asm_replacement_in **********************************************************
-
-   This code writes the given execution state and jumps to the replacement
-   code.
-
-   This function never returns!
-
-   C prototype:
-      void asm_replacement_in(executionstate *es, replace_safestack_t *st);
-
-*******************************************************************************/
-
-asm_replacement_in:
-       /* get arguments */
-       mov     8(sp),%esi                  /* replace_safestack_t *st            */
-       mov     4(sp),%ebp                  /* executionstate *es == safe stack   */
-
-       /* switch to the safe stack and build a stack frame */
-       mov     %ebp,sp
-       sub             $(1*4),sp
-
-       /* call replace_build_execution_state(st) */
-       mov             %esi,(0*4)(sp)
-       call    replace_build_execution_state
-
-       /* set new sp */
-       mov     (offes_sp)(%ebp),sp
-
-       /* push address of new code */
-       push    (offes_pc)(%ebp)
-
-       /* allocate an executionstate_t on the stack */
-       sub             $(sizeexecutionstate),sp
-
-       /* call replace_free_safestack(st,& of allocated executionstate_t) */
-       push    sp   /* tmpes */
-       push    %esi /* st    */
-       call    replace_free_safestack
-       add     $(2*4),sp
-
-       /* copy registers from execution state */
-       mov     (EAX*4+offes_intregs)(sp),%eax
-       mov     (EBX*4+offes_intregs)(sp),%ebx
-       mov     (ECX*4+offes_intregs)(sp),%ecx
-       mov     (EDX*4+offes_intregs)(sp),%edx
-       mov     (ESI*4+offes_intregs)(sp),%esi
-       mov     (EDI*4+offes_intregs)(sp),%edi
-       mov     (EBP*4+offes_intregs)(sp),%ebp
-
-       /* pop the execution state off the stack */
-       add             $(sizeexecutionstate),sp
-
-       /* jump to new code, hold your thumbs! ;) */
-       ret
-
-#endif /* defined(ENABLE_REPLACEMENT) */
-
-
 /************************ function asm_builtin_x2x *****************************
 *                                                                              *
 *   Wrapper functions for corner cases                                         *
 *                                                                              *
 *******************************************************************************/
 
+#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
 
@@ -639,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)
 
-asm_get_cycle_count:
-       rdtsc
+       mov     28(%esp), itmp1
+       mov     itmp1, (%esp)
+
+       call    escape_analysis_escape_check
+
+       mov     4(%esp), t0
+       mov     8(%esp), itmp1
+       mov     12(%esp), itmp2
+       mov     16(%esp), itmp3
+
+       add     $24,sp
        ret
+#endif
 
 
 /* disable exec-stacks ********************************************************/
@@ -657,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