/* src/vm/jit/x86_64/asmpart.S - Java-C interface functions for x86_64
- Copyright (C) 1996-2005 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 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
This file is part of CACAO.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
- Contact: cacao@complang.tuwien.ac.at
+ Contact: cacao@cacaojvm.org
Authors: Andreas Krall
Reinhard Grafl
Changes:
- $Id: asmpart.S 3891 2005-12-05 22:54:42Z twisti $
+ $Id: asmpart.S 4357 2006-01-22 23:33:38Z twisti $
*/
#include "md-abi.h"
#include "md-asm.h"
+#include "vm/jit/abi.h"
#include "vm/jit/x86_64/arch.h"
#include "vm/jit/x86_64/offsets.h"
* *
*******************************************************************************/
-call_name:
.align 8
- .quad 0 /* catch type all */
- .quad calljava_xhandler /* handler pc */
- .quad calljava_xhandler /* end pc */
- .quad asm_calljavafunction /* start pc */
- .long 1 /* extable size */
- .long 0
- .quad 0 /* line number table start */
- .quad 0 /* line number table size */
- .long 0
- .long 0 /* fltsave */
- .long 0 /* intsave */
- .long 0 /* isleaf */
- .long 0 /* IsSync */
- .long 8 /* frame size */
- .quad 0 /* method pointer (pointer to name) */
+ .quad 0 /* catch type all */
+ .quad calljava_xhandler /* handler pc */
+ .quad calljava_xhandler /* end pc */
+ .quad asm_calljavafunction /* start pc */
+ .long 1 /* extable size */
+ .long 0
+ .quad 0 /* line number table start */
+ .quad 0 /* line number table size */
+ .long 0
+ .long 0 /* fltsave */
+ .long 0 /* intsave */
+ .long 0 /* isleaf */
+ .long 0 /* IsSync */
+ .long 8 /* frame size */
+ .quad 0 /* method pointer (pointer to name) */
asm_calljavafunction:
asm_calljavafunction_int:
- sub $(3*8),%rsp /* keep stack 16-byte aligned */
- mov %rbp,0*8(%rsp)
- mov %rbx,1*8(%rsp) /* %rbx is not a callee saved in cacao */
- mov %rdi,%rax /* move function pointer to %rax */
- /* compilerstub uses this */
-
- mov %rsi,%rdi /* pass remaining parameters */
- mov %rdx,%rsi
- mov %rcx,%rdx
- mov %r8,%rcx
-
- lea asm_call_jit_compiler,%r11
- call *%r11 /* call JIT compiler */
-
- mov 0*8(%rsp),%rbp
- mov 1*8(%rsp),%rbx
- add $(3*8),%rsp /* free stack space */
+ sub $(3*8),sp /* keep stack 16-byte aligned */
+ mov bp,0*8(sp)
+ mov %rbx,1*8(sp) /* %rbx is not a callee saved in CACAO*/
+ mov a0,itmp1 /* move function pointer to itmp1 */
+ /* compilerstub uses this */
+
+ mov a1,a0 /* pass remaining parameters */
+ mov a2,a1
+ mov a3,a2
+ mov a4,a3
+
+ lea asm_call_jit_compiler,itmp3
+ call *itmp3 /* call JIT compiler */
+
+L_asm_calljavafunction_return:
+ mov 0*8(sp),bp
+ mov 1*8(sp),%rbx /* %rbx is not a callee saved in CACAO*/
+ add $(3*8),sp /* free stack space */
ret
calljava_xhandler:
- mov %rax,%rdi /* pass exception pointer */
+ mov xptr,a0 /* pass exception pointer */
call builtin_throw_exception
- mov 0*8(%rsp),%rbp
- mov 1*8(%rsp),%rbx
- add $(3*8),%rsp
- xor %rax,%rax /* return NULL */
- ret
+ xor v0,v0 /* return NULL */
+ jmp L_asm_calljavafunction_return
/********************* function asm_calljavafunction ***************************
* *
*******************************************************************************/
-call_name2:
.align 8
- .quad 0 /* catch type all */
- .quad calljava_xhandler2 /* handler pc */
- .quad calljava_xhandler2 /* end pc */
- .quad asm_calljavafunction2 /* start pc */
- .long 1 /* extable size */
- .long 0
- .quad 0 /* line number table start */
- .quad 0 /* line number table size */
- .long 0
- .long 0 /* fltsave */
- .long 0 /* intsave */
- .long 0 /* isleaf */
- .long 0 /* IsSync */
- .long 24 /* frame size */
- .quad 0 /* method pointer (pointer to name) */
+ .quad 0 /* catch type all */
+ .quad calljava_xhandler2 /* handler pc */
+ .quad calljava_xhandler2 /* end pc */
+ .quad asm_calljavafunction2 /* start pc */
+ .long 1 /* extable size */
+ .long 0
+ .quad 0 /* line number table start */
+ .quad 0 /* line number table size */
+ .long 0
+ .long 0 /* fltsave */
+ .long 0 /* intsave */
+ .long 0 /* isleaf */
+ .long 0 /* IsSync */
+ .long 24 /* frame size */
+ .quad 0 /* method pointer (pointer to name) */
asm_calljavafunction2:
asm_calljavafunction2int:
asm_calljavafunction2long:
asm_calljavafunction2float:
asm_calljavafunction2double:
- sub $(7*8),%rsp /* keep stack 16-byte aligned */
- mov %rbx,0*8(%rsp) /* %rbx is not a callee saved in cacao */
- mov %rbp,1*8(%rsp)
- mov %r12,2*8(%rsp)
- mov %r13,3*8(%rsp)
- mov %r14,4*8(%rsp)
- mov %r15,5*8(%rsp)
-
- mov %rdi,%rax /* move method pointer for compiler */
- xor %rbp,%rbp /* set argument stack frame to zero */
-
- test %rsi,%rsi /* maybe we have no args... */
+ sub $(7*8),sp /* keep stack 16-byte aligned */
+ mov %rbx,0*8(sp) /* %rbx is not a callee saved in cacao*/
+ mov s0,1*8(sp)
+ mov s1,2*8(sp)
+ mov s2,3*8(sp)
+ mov s3,4*8(sp)
+ mov s4,5*8(sp)
+
+ mov a0,itmp1 /* move method pointer for compiler */
+ xor %rbp,%rbp /* set argument stack frame to zero */
+
+ test a1,a1 /* maybe we have no args... */
jle L_copy_done
- mov %rsi,itmp3 /* arg count */
- mov %rcx,itmp2 /* pointer to arg block */
+ mov a1,itmp3 /* arg count */
+ mov a3,itmp2 /* pointer to arg block */
- mov itmp2,%r14 /* save argument block pointer */
- mov itmp3,%r15 /* save argument count */
+ mov itmp2,%r14 /* save argument block pointer */
+ mov itmp3,%r15 /* save argument count */
- sub $sizejniblock,itmp2 /* initialize pointer (smaller code) */
- add $1,itmp3 /* initialize argument count */
- xor %r12,%r12 /* initialize integer argument counter */
- xor %r13,%r13 /* initialize float argument counter */
+ sub $sizejniblock,itmp2 /* initialize pointer (smaller code) */
+ add $1,itmp3 /* initialize argument count */
+ xor %r12,%r12 /* initialize integer argument counter*/
+ xor %r13,%r13 /* initialize float argument counter */
L_register_copy:
add $sizejniblock,itmp2 /* goto next argument block */
and $0xfffffffffffffffe,%rbp /* keep stack 16-byte aligned */
shl $3,%rbp /* calculate stack size */
- sub %rbp,%rsp /* stack frame for arguments */
- mov %rsp,%rbx /* use %rbx as temp sp */
+ sub %rbp,sp /* stack frame for arguments */
+ mov sp,%rbx /* use %rbx as temp sp */
sub $sizejniblock,%r14 /* initialize pointer (smaller code) */
add $1,%r15 /* initialize argument count */
jmp L_stack_copy_loop
L_copy_done:
- lea asm_call_jit_compiler,%r11/* %rax still contains method pointer */
- call *%r11 /* call JIT compiler */
-
- add %rbp,%rsp /* remove argument stack frame if any */
-
- mov 5*8(%rsp),%r15 /* restore callee saved registers */
- mov 4*8(%rsp),%r14
- mov 3*8(%rsp),%r13
- mov 2*8(%rsp),%r12
- mov 1*8(%rsp),%rbp
- mov 0*8(%rsp),%rbx
- add $(7*8),%rsp /* free stack space */
+ lea asm_call_jit_compiler,itmp3 /* %rax still contains method pointer */
+ call *itmp3 /* call JIT compiler */
+
+ add bp,sp /* remove argument stack frame if any */
+
+L_asm_calljavafunction2_return:
+ mov 0*8(sp),%rbx /* restore callee saved registers */
+ mov 1*8(sp),s0
+ mov 2*8(sp),s1
+ mov 3*8(sp),s2
+ mov 4*8(sp),s3
+ mov 5*8(sp),s4
+ add $(7*8),sp /* free stack space */
ret
calljava_xhandler2:
- mov %rax,%rdi /* pass exception pointer */
+ mov xptr,a0 /* pass exception pointer */
call builtin_throw_exception
-
- mov 5*8(%rsp),%r15 /* restore callee saved registers */
- mov 4*8(%rsp),%r14
- mov 3*8(%rsp),%r13
- mov 2*8(%rsp),%r12
- mov 1*8(%rsp),%rbp
- mov 0*8(%rsp),%rbx
- add $(7*8),%rsp /* free stack space */
- xor %rax,%rax /* return NULL */
- ret
+ xor v0,v0 /* return NULL */
+ jmp L_asm_calljavafunction2_return
jumptable_integer:
*******************************************************************************/
asm_call_jit_compiler:
- sub $((3+24)*8+sizestackframeinfo),sp /* keep stack 16-byte aligned */
+ /* keep stack 16-byte aligned */
+ sub $((3+ARG_CNT)*8+sizestackframeinfo),sp
- mov %rbx,0*8(%rsp) /* save register */
+ mov t0,0*8(sp) /* save register */
- mov (3+24)*8+sizestackframeinfo(%rsp),itmp3 /* get return address */
+ mov (3+ARG_CNT)*8+sizestackframeinfo(sp),itmp3 /* get return address */
mov -1(itmp3),%bl /* get function code */
cmp $0xd2,%bl /* called with `call *REG_ITMP2'? */
jne L_not_static_special
jmp L_call_jit_compile
L_not_static_special:
- cmp $0xd0,%bl /* called with `call *REG_ITMP1' (%rax) */
+ cmp $0xd0,%bl /* called with `call *REG_ITMP1' */
jne L_not_virtual_interface
- sub $7,itmp3 /* calculate address of offset */
- mov (itmp3),itmp3l /* get offset (32-bit) */
- add itmp2,itmp3 /* add base address to get method address */
+ sub $7,itmp3 /* calculate address of offset */
+ mov (itmp3),itmp3l /* get offset (32-bit) */
+ add itmp2,itmp3 /* add base address to get method addr*/
jmp L_call_jit_compile
-L_not_virtual_interface: /* a call from asm_calljavamethod */
+L_not_virtual_interface: /* a call from asm_calljavamethod */
xor itmp3,itmp3
L_call_jit_compile:
- mov 0*8(sp),%rbx /* restore register */
+ mov 0*8(sp),t0 /* restore register */
mov itmp3,0*8(sp) /* save address for method pointer */
mov itmp1,1*8(sp) /* save method pointer */
- SAVE_ARGUMENT_REGISTERS(2)
+ SAVE_ARGUMENT_REGISTERS(3)
mov sp,a0 /* create stackframe info */
- add $((3+24)*8),a0 /* pass sfi */
+ add $((3+ARG_CNT)*8),a0 /* pass sfi */
xor a1,a1 /* if pv is NULL, use findmethod */
mov sp,a2 /* pass java sp */
- add $((1+3+24)*8+sizestackframeinfo),a2
- mov ((3+24)*8+sizestackframeinfo)(sp),a3 /* pass ra to java function */
+ add $((1+3+ARG_CNT)*8+sizestackframeinfo),a2
+ /* pass ra to java function */
+ mov ((3+ARG_CNT)*8+sizestackframeinfo)(sp),a3
mov a3,a4 /* xpc is equal to ra */
call stacktrace_create_extern_stackframeinfo
mov v0,1*8(sp) /* save return value */
mov sp,a0 /* remove stackframe info */
- add $((3+24)*8),a0 /* pass sfi */
+ add $((3+ARG_CNT)*8),a0 /* pass sfi */
call stacktrace_remove_stackframeinfo
mov 0*8(sp),itmp3 /* restore address for method pointer */
mov 1*8(sp),v0 /* restore return value */
- RESTORE_ARGUMENT_REGISTERS(2)
+ RESTORE_ARGUMENT_REGISTERS(3)
- add $((3+24)*8+sizestackframeinfo),sp /* remove stack frame */
+ add $((3+ARG_CNT)*8+sizestackframeinfo),sp /* remove stack frame */
test v0,v0 /* check for exception */
je L_asm_call_jit_compiler_exception
- test %r11,%r11 /* is address == 0 (asm_calljavamethod*/
+ test itmp3,itmp3 /* is address == 0 (asm_calljavamethod*/
je L_call_method
- mov %rax,(%r11) /* and now save the new pointer */
+ mov v0,(itmp3) /* and now save the new pointer */
L_call_method:
- jmp *%rax /* ...and now call the new method */
+ jmp *v0 /* ...and now call the new method */
L_asm_call_jit_compiler_exception:
#if defined(USE_THREADS) && defined(NATIVE_THREADS)
jmp asm_handle_exception
-/********************* function asm_handle_exception ***************************
+/* asm_handle_exception ********************************************************
* *
* This function handles an exception. It does not use the usual calling *
* conventions. The exception pointer is passed in REG_ITMP1 and the *
* the local exception table for a handler. If no one is found, it unwinds *
* stacks and continues searching the callers. *
* *
-* void asm_handle_exception (exceptionptr, exceptionpc); *
-* *
*******************************************************************************/
asm_handle_nat_exception:
- add $8,%rsp /* clear return address of native stub*/
+ add $8,sp /* clear return address of native stub*/
asm_handle_exception:
- sub $(4*8),%rsp
- mov xptr,0*8(%rsp) /* save exception pointer */
- mov xpc,1*8(%rsp) /* save exception pc */
-
- mov xpc,%rdi /* exception pc */
- call codegen_findmethod
- mov %rax,itmp3
- mov %rax,2*8(%rsp) /* save data segment pointer */
-
- mov 0*8(%rsp),%rax /* restore exception pointer */
- mov 1*8(%rsp),%r10 /* restore exception pc */
+ sub $((ARG_CNT+TMP_CNT)*8),sp /* create maybe-leaf stackframe */
- xor a3,a3 /* clear indent flag (only first time)*/
+ SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */
+ SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */
-ex_stack_loop:
+ mov $((ARG_CNT+TMP_CNT)*8),a3 /* prepare a3 for handle_exception */
+ mov $1,t0 /* set maybe-leaf flag */
+
+L_asm_handle_exception_stack_loop:
+ sub $(6*8),sp
+ mov xptr,0*8(sp) /* save exception pointer */
+ mov xpc,1*8(sp) /* save exception pc */
+ add sp,a3 /* calculate Java sp into a3... */
+ add $(6*8),a3
+ mov a3,3*8(sp) /* ...and save it */
+ mov t0,4*8(sp) /* save maybe-leaf flag */
+
+ mov xpc,a0 /* exception pc */
+ call codegen_findmethod
+ mov v0,2*8(sp) /* save data segment pointer */
+
mov 0*8(sp),a0 /* pass exception pointer */
mov 1*8(sp),a1 /* pass exception pc */
- mov 2*8(sp),a2 /* pass data segment pointer */
+ mov v0,a2 /* pass data segment pointer */
+ mov 3*8(sp),a3 /* pass Java stack pointer */
call exceptions_handle_exception
test v0,v0
jz L_asm_handle_exception_not_catched
mov v0,xpc /* move handlerpc into xpc */
- mov 0*8(sp),%rax /* restore exception pointer */
- add $(4*8),sp /* free stack frame */
+ mov 0*8(sp),xptr /* restore exception pointer */
+ mov 4*8(sp),t0 /* get maybe-leaf flag */
+ add $(6*8),sp /* free stack frame */
+
+ test t0,t0 /* test for maybe-leaf flag */
+ jz L_asm_handle_exception_no_leaf
+ RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */
+ RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */
+
+ add $((ARG_CNT+TMP_CNT)*8),sp /* remove maybe-leaf stackframe */
+
+L_asm_handle_exception_no_leaf:
jmp *xpc /* jump to the handler */
L_asm_handle_exception_not_catched:
- mov 0*8(%rsp),%rax /* restore exception pointer */
- mov 1*8(%rsp),%r10 /* restore exception pc */
- mov 2*8(%rsp),%r11 /* restore data segment pointer */
- add $(4*8),%rsp
-
- mov %rax,%rcx /* save exception pointer */
-
-ex_already_cleared:
- movl IsSync(%r11),%eax /* %rax = SyncOffset */
- test %rax,%rax /* if zero no monitorexit */
- je no_monitor_exit
-
-#if defined(USE_THREADS)
- add %rsp,%rax
- mov -8(%rax),%rdi /* get monitor object from stack */
-
- sub $(4*8),%rsp
- mov %rcx,0*8(%rsp)
- mov %r10,1*8(%rsp)
- mov %r11,2*8(%rsp)
-
- call builtin_monitorexit
-
- mov 0*8(%rsp),%rcx
- mov 1*8(%rsp),%r10
- mov 2*8(%rsp),%r11
- add $(4*8),%rsp
-#endif
+ mov 0*8(sp),xptr /* restore exception pointer */
+ mov 2*8(sp),itmp3 /* restore data segment pointer */
+ mov 4*8(sp),t0 /* get maybe-leaf flag */
+ add $(6*8),sp
+
+ test t0,t0
+ jz L_asm_handle_exception_no_leaf_stack
+
+ add $((ARG_CNT+TMP_CNT)*8),sp /* remove maybe-leaf stackframe */
+ xor t0,t0 /* clear the isleaf flags */
-no_monitor_exit:
- mov FrameSize(%r11),%eax /* %eax = frame size */
- add %rax,%rsp /* unwind stack */
- mov %rsp,%rax /* %rax = pointer to save area */
+L_asm_handle_exception_no_leaf_stack:
+ mov FrameSize(itmp3),itmp2l /* get frame size */
+ add sp,itmp2 /* pointer to save area */
- mov IntSave(%r11),%edx /* %edx = saved int register count */
- test %edx,%edx
+ mov IntSave(itmp3),a0l /* a0l = saved int register count */
+ test a0l,a0l
je noint
- cmp $1,%edx
+ cmp $1,a0l
je int1
- cmp $2,%edx
+ cmp $2,a0l
je int2
- cmp $3,%edx
+ cmp $3,a0l
je int3
- cmp $4,%edx
+ cmp $4,a0l
je int4
- cmp $5,%edx
- je int5
- mov -48(%rax),%rbx
-int5:
- mov -40(%rax),%rbp
+ mov -5*8(itmp2),s0
int4:
- mov -32(%rax),%r12
+ mov -4*8(itmp2),s1
int3:
- mov -24(%rax),%r13
+ mov -3*8(itmp2),s2
int2:
- mov -16(%rax),%r14
+ mov -2*8(itmp2),s3
int1:
- mov -8(%rax),%r15
+ mov -1*8(itmp2),s4
- shl $3,%edx /* multiply by 8 bytes */
- sub %rdx,%rax
+ shl $3,a0l /* multiply by 8 bytes */
+ sub a0,itmp2
noint:
- mov FltSave(%r11),%edx /* %edx = saved flt register count */
- test %edx,%edx
+#if 0
+ mov FltSave(itmp3),a0l /* a0l = saved flt register count */
+ test a0l,a0l
je noflt
- cmpl $1,%edx
+ cmpl $1,a0l
je flt1
- cmpl $2,%edx
+ cmpl $2,a0l
je flt2
- cmpl $3,%edx
+ cmpl $3,a0l
je flt3
- cmpl $4,%edx
+ cmpl $4,a0l
je flt4
- cmpl $5,%edx
- je flt5
- cmpl $6,%edx
- je flt7
- cmpl $7,%edx
- je flt7
-
- movq -64(%rax),%xmm8
-flt7:
- movq -56(%rax),%xmm9
-flt6:
- movq -48(%rax),%xmm10
-flt5:
- movq -40(%rax),%xmm11
+
+ movq -5*8(itmp2),%xmm11
flt4:
- movq -32(%rax),%xmm12
+ movq -4*8(itmp2),%xmm12
flt3:
- movq -24(%rax),%xmm13
+ movq -3*8(itmp2),%xmm13
flt2:
- movq -16(%rax),%xmm14
+ movq -2*8(itmp2),%xmm14
flt1:
- movq -8(%rax),%xmm15
+ movq -1*8(itmp2),%xmm15
-noflt:
- pop %r10 /* the new xpc is return address */
- sub $3,%r10 /* subtract 3 bytes for call */
-
- sub $(2*8),%rsp
- mov %rcx,0*8(%rsp)
- mov %r10,1*8(%rsp)
-
- mov %r10,%rdi
- call codegen_findmethod /* get the new data segment ptr */
- mov %rax,%r11
-
- mov 0*8(%rsp),%rcx
- mov 1*8(%rsp),%r10
- add $(2*8),%rsp
-
- mov %rcx,%rax /* restore saved exception pointer */
+noflt:
+#endif
+ mov FrameSize(itmp3),itmp2l /* get frame size */
+ add itmp2,sp /* unwind stack */
- sub $(4*8),%rsp
-
- mov %rax,0*8(%rsp) /* save exception pointer */
- mov %r10,1*8(%rsp) /* save exception pc */
- mov %r11,2*8(%rsp) /* save data segment pointer */
-
- mov $1,a3 /* set indent flag */
+ /* exception pointer is still set */
+ pop xpc /* the new xpc is return address */
+ sub $3,xpc /* subtract 3 bytes for call */
+
+ xor a3,a3 /* prepare a3 for handle_exception */
- jmp ex_stack_loop
+ jmp L_asm_handle_exception_stack_loop
/* asm_wrapper_patcher *********************************************************
asm_wrapper_patcher:
push bp /* save base pointer */
mov sp,bp /* move actual sp to bp */
- sub $(18*8+sizestackframeinfo),sp /* stack frame (16-byte aligned) */
+ sub $((3+ARG_CNT+TMP_CNT)*8+sizestackframeinfo),sp
and $0xfffffffffffffff0,sp /* align sp to 16-byte (this is for */
/* leaf functions) */
- SAVE_ARGUMENT_REGISTERS(0)
- SAVE_TEMPORARY_REGISTERS(14)
+ SAVE_ARGUMENT_REGISTERS(3)
+ SAVE_TEMPORARY_REGISTERS(3+ARG_CNT)
- mov itmp1,15*8(sp) /* save itmp1 and itmp2 */
- mov itmp2,16*8(sp) /* can be used by some instructions */
+ mov itmp1,0*8(sp) /* save itmp1 and itmp2 */
+ mov itmp2,1*8(sp) /* can be used by some instructions */
mov sp,a0 /* create stackframe info */
- add $(18*8),a0
+ add $((3+ARG_CNT+TMP_CNT)*8),a0
xor a1,a1 /* if pv is NULL, use findmethod */
mov bp,a2 /* pass java sp */
add $((6+1)*8),a2
add $((1+1)*8),a0 /* skip function pointer */
mov 1*8(bp),itmp3 /* get function pointer */
call *itmp3 /* call the patcher function */
- mov v0,17*8(sp) /* save return value */
+ mov v0,2*8(sp) /* save return value */
mov sp,a0 /* remove stackframe info */
- add $(18*8),a0
+ add $((3+ARG_CNT+TMP_CNT)*8),a0
call stacktrace_remove_stackframeinfo
- RESTORE_ARGUMENT_REGISTERS(0)
- RESTORE_TEMPORARY_REGISTERS(14)
+ RESTORE_ARGUMENT_REGISTERS(3)
+ RESTORE_TEMPORARY_REGISTERS(3+ARG_CNT)
- mov 15*8(sp),itmp1 /* restore itmp1 and itmp2 */
- mov 16*8(sp),itmp2 /* can be used by some instructions */
- mov 17*8(sp),itmp3 /* restore return value */
+ mov 0*8(sp),itmp1 /* restore itmp1 and itmp2 */
+ mov 1*8(sp),itmp2 /* can be used by some instructions */
+ mov 2*8(sp),itmp3 /* restore return value */
mov bp,sp /* restore original sp */
pop bp /* restore bp */
*******************************************************************************/
asm_builtin_f2i:
- sub $(14*8),%rsp
+ sub $(ARG_CNT*8),sp
SAVE_ARGUMENT_REGISTERS(0)
- movq %xmm8,%xmm0
+ movq ftmp1,fa0
call builtin_f2i
RESTORE_ARGUMENT_REGISTERS(0)
- add $(14*8),%rsp
+ add $(ARG_CNT*8),sp
ret
asm_builtin_f2l:
- sub $(14*8),%rsp
+ sub $(ARG_CNT*8),sp
SAVE_ARGUMENT_REGISTERS(0)
- movq %xmm8,%xmm0
+ movq ftmp1,fa0
call builtin_f2l
RESTORE_ARGUMENT_REGISTERS(0)
- add $(14*8),%rsp
+ add $(ARG_CNT*8),sp
ret
asm_builtin_d2i:
- sub $(14*8),%rsp
+ sub $(ARG_CNT*8),sp
SAVE_ARGUMENT_REGISTERS(0)
- movq %xmm8,%xmm0
+ movq ftmp1,fa0
call builtin_d2i
RESTORE_ARGUMENT_REGISTERS(0)
- add $(14*8),%rsp
+ add $(ARG_CNT*8),sp
ret
asm_builtin_d2l:
- sub $(14*8),%rsp
+ sub $(ARG_CNT*8),sp
SAVE_ARGUMENT_REGISTERS(0)
- movq %xmm8,%xmm0
+ movq ftmp1,fa0
call builtin_d2l
RESTORE_ARGUMENT_REGISTERS(0)
- add $(14*8),%rsp
+ add $(ARG_CNT*8),sp
ret
asm_getclassvalues_atomic:
-_crit_restart2:
-_crit_begin2:
+_crit_restart:
+_crit_begin:
movl offbaseval(a0),itmp1l
movl offdiffval(a0),itmp2l
movl offbaseval(a1),itmp3l
-_crit_end2:
+_crit_end:
movl itmp1l,offcast_super_baseval(a2)
movl itmp2l,offcast_super_diffval(a2)
movl itmp3l,offcast_sub_baseval(a2)
asm_criticalsections:
#if defined(USE_THREADS) && defined(NATIVE_THREADS)
-#if 0
- .quad _crit_begin1
- .quad _crit_end1
- .quad _crit_restart1
-#endif
- .quad _crit_begin2
- .quad _crit_end2
- .quad _crit_restart2
+ .quad _crit_begin
+ .quad _crit_end
+ .quad _crit_restart
#endif
.quad 0