Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: asmpart.S 7254 2007-01-29 21:38:54Z twisti $
-
*/
#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"
.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
.globl asm_compare_and_swap
.globl asm_memory_barrier
- .globl asm_criticalsections
- .globl asm_getclassvalues_atomic
-
.globl asm_get_cycle_count
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. */
push xptr /* pass exception pointer */
call builtin_throw_exception
add $4,sp
+asm_vm_call_method_end:
jmp L_asm_vm_call_method_return
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
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
*******************************************************************************/
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.
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