X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fi386%2Fasmpart.S;h=e182ddeeccf9d2e3490309361508a0e57e534c0b;hb=31aa73fd8b935293a07d983f92fdeabe67fefc2a;hp=179fbd038c0022f442e095b5d74c6d12cdd2aa02;hpb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;p=cacao.git diff --git a/src/vm/jit/i386/asmpart.S b/src/vm/jit/i386/asmpart.S index 179fbd038..e182ddeec 100644 --- a/src/vm/jit/i386/asmpart.S +++ b/src/vm/jit/i386/asmpart.S @@ -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. @@ -51,19 +49,11 @@ .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