/* 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_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 *****************************************************************
.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 */
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 */
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 *
mov t0,8*4(sp) /* save maybe-leaf flag */
mov xpc,0*4(sp) /* pass exception pc */
- call codegen_get_pv_from_pc
+ call methodtree_find
mov v0,6*4(sp) /* save data segment pointer */
mov 4*4(sp),itmp3 /* pass exception pointer */
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
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 ********************************************************/
.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