-/* jit/x86_64/asmpart.S - Java-C interface functions for x86_64
+/* vm/jit/x86_64/asmpart.S - Java-C interface functions for x86_64
- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
- Institut f. Computersprachen, TU Wien
- R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
- S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
- J. Wenninger
+ 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
This file is part of CACAO.
Reinhard Grafl
Christian Thalinger
- $Id: asmpart.S 950 2004-03-07 23:52:44Z twisti $
+ $Id: asmpart.S 1735 2004-12-07 14:33:27Z twisti $
*/
-#include "offsets.h"
+#include "config.h"
+#include "vm/jit/x86_64/arch.h"
+#include "vm/jit/x86_64/offsets.h"
+#include "vm/jit/x86_64/asmoffsets.h"
+
+
+/* define it like the risc way */
+
+#define v0 %rax
+
+#define a0 %rdi
+#define a1 %rsi
+#define a2 %rdx
+#define a3 %rcx
+#define a4 %r8
+#define a5 %r9
+
+#define fa0 %xmm0
+#define fa1 %xmm1
+#define fa2 %xmm2
+#define fa3 %xmm3
+#define fa4 %xmm4
+#define fa5 %xmm5
+#define fa6 %xmm6
+#define fa7 %xmm7
+
+#define itmp1 %rax
+#define itmp2 %r10
+#define itmp3 %r11
+
+#define itmp1l %eax
+#define itmp2l %r10d
+#define itmp3l %r11d
+
+#define itmp1b %al
+#define itmp2b %r10b
+#define itmp3b %r11b
+
+#define xptr itmp1
+#define xpc itmp2
+
.text
/********************* exported functions and variables ***********************/
.globl asm_calljavafunction
+ .globl calljava_xhandler
.globl asm_calljavafunction2
.globl asm_calljavafunction2long
.globl asm_calljavafunction2double
+ .globl calljava_xhandler2
.globl asm_call_jit_compiler
- .globl asm_dumpregistersandcall
.globl asm_handle_exception
.globl asm_handle_nat_exception
.globl asm_check_clinit
- .globl asm_builtin_checkcast
.globl asm_builtin_checkarraycast
.globl asm_builtin_anewarray
.globl asm_builtin_newarray_array
.globl asm_builtin_aastore
.globl asm_builtin_monitorenter
.globl asm_builtin_monitorexit
- .globl asm_builtin_f2i
- .globl asm_builtin_f2l
- .globl asm_builtin_d2i
- .globl asm_builtin_d2l
+ .globl asm_builtin_f2i
+ .globl asm_builtin_f2l
+ .globl asm_builtin_d2i
+ .globl asm_builtin_d2l
.globl asm_builtin_arrayinstanceof
.globl asm_perform_threadswitch
.globl asm_initialize_thread_stack
.globl asm_switchstackandcall
- .globl asm_getcallingmethod
- .globl asm_builtin_trace
- .globl asm_builtin_exittrace
-
+ .globl asm_criticalsections
+ .globl asm_getclassvalues_atomic
+
+
/*************************** imported functions *******************************/
.globl jit_compile
.globl builtin_monitorexit
.globl builtin_throw_exception
.globl builtin_trace_exception
- .globl findmethod
-
+ .globl codegen_findmethod
-#define MethodPointer -8
-#define FrameSize -12
-#define IsSync -16
-#define IsLeaf -20
-#define IntSave -24
-#define FltSave -28
-#define ExTableSize -32
-#define ExTableStart -32
-
-#define ExEntrySize -32
-#define ExStartPC -8
-#define ExEndPC -16
-#define ExHandlerPC -24
-#define ExCatchType -32
-
-
/********************* function asm_calljavafunction ***************************
* *
* This function calls a Java-method (which possibly needs compilation) *
*******************************************************************************/
call_name:
- .ascii "calljavafunction\0\0"
-
.align 8
+
.quad 0 /* catch type all */
.quad calljava_xhandler /* handler pc */
.quad calljava_xhandler /* end pc */
.quad 0 /* method pointer (pointer to name) */
asm_calljavafunction:
- 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 */
+ 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
-calljava_jit:
-calljava_return:
-calljava_ret:
- mov 0*8(%rsp),%rbp
- mov 1*8(%rsp),%rbx
- add $(3*8),%rsp /* free stack space */
- ret
+ 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 */
+ ret
calljava_xhandler:
- mov %rax,%rdi /* pass exception pointer */
- call builtin_throw_exception
- mov 0*8(%rsp),%rbp
- mov 1*8(%rsp),%rbx
- add $(3*8),%rsp
- ret
-
+ mov %rax,%rdi /* pass exception pointer */
+ call builtin_throw_exception
+ mov 0*8(%rsp),%rbp
+ mov 1*8(%rsp),%rbx
+ add $(3*8),%rsp
+ ret
+
/********************* function asm_calljavafunction ***************************
* *
*******************************************************************************/
call_name2:
- .ascii "calljavafunction2\0\0"
-
.align 8
+
.quad 0 /* catch type all */
.quad calljava_xhandler2 /* handler pc */
.quad calljava_xhandler2 /* end pc */
.long 0 /* intsave */
.long 0 /* isleaf */
.long 0 /* IsSync */
- .long 8 /* frame size */
+ .long 24 /* frame size */
.quad 0 /* method pointer (pointer to name) */
asm_calljavafunction2:
asm_calljavafunction2double:
asm_calljavafunction2long:
- sub $8,%rsp /* keep stack 16-byte aligned */
-
- mov %rdi,%rax /* save method pointer for compiler */
- mov %rcx,%r10 /* pointer to arg block */
-
- mov offjniitem(%r10),%rdi /* move args into registers */
- mov offjniitem + sizejniblock * 1(%r10),%rsi
- mov offjniitem + sizejniblock * 2(%r10),%rdx
- mov offjniitem + sizejniblock * 3(%r10),%rcx
-
- lea asm_call_jit_compiler,%r11
- call *%r11 /* call JIT compiler */
+ 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 */
+
+ mov %rsi,itmp3 /* arg count */
+ mov %rcx,itmp2 /* pointer to arg block */
+
+ test itmp3,itmp3 /* maybe we have no args... */
+ jle L_copy_done
+
+ 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 */
+
+L_register_copy:
+ add $sizejniblock,itmp2 /* goto next argument block */
+ dec itmp3 /* argument count - 1 */
+ jz L_register_copy_done
+ andb $0x02,offjniitemtype(itmp2) /* is this a float/double type? */
+ jnz L_register_handle_float /* yes, handle it */
+
+ cmp $(INT_ARG_CNT - 1),%r12 /* are we out of integer argument */
+ je L_register_copy /* register? yes, next loop */
+
+ lea jumptable_integer,%rbp
+ mov 0(%rbp,%r12,8),%rbx
+ inc %r12 /* integer argument counter + 1 */
+ jmp *%rbx
+
+L_register_handle_float:
+ cmp $(FLT_ARG_CNT - 1),%r13 /* are we out of float argument */
+ je L_register_copy /* register? yes, next loop */
+
+ lea jumptable_float,%rbp
+ mov 0(%rbp,%r13,8),%rbx
+ inc %r13 /* float argument counter + 1 */
+ jmp *%rbx
-calljava_jit2:
-calljava_return2:
-calljava_ret2:
- add $8,%rsp /* free stack space */
- ret
-
+L_register_copy_done:
+ mov %r15,itmp3 /* calculate remaining arguments after */
+ sub %r12,itmp3 /* register copy */
+ sub %r13,itmp3
+ jle L_copy_done /* are all assigned to registers? */
+
+ shl $3,itmp3 /* calculate stack size */
+ sub itmp3,%rsp /* stack frame for arguments */
+ mov %rsp,%rbx /* use %rbx as temp sp */
+
+ sub $sizejniblock,itmp2 /* initialize pointer (smaller code) */
+ add $1,%r15 /* initialize argument count */
+
+L_stack_copy_loop:
+ add $sizejniblock,itmp2 /* goto next argument block */
+ dec %r15 /* are there any arguments left? */
+ jz L_copy_done /* no test needed after dec */
+
+ andb $0x02,offjniitemtype(itmp2) /* is this a float/double type? */
+ jnz L_stack_handle_float
+ dec %r12 /* arguments assigned to registers */
+ jge L_stack_copy_loop
+ jmp L_stack_copy
+
+L_stack_handle_float:
+ dec %r13 /* arguments assigned to registers */
+ jge L_stack_copy_loop
+
+L_stack_copy:
+ mov offjniitem(itmp2),itmp3 /* copy s8 argument onto stack */
+ mov itmp3,0(%rbx)
+ add $8,%rbx /* increase sp to next argument */
+ jmp L_stack_copy_loop
+
+L_copy_done:
+ lea asm_call_jit_compiler,%r11/* %rax still contains method pointer */
+ call *%r11 /* call JIT compiler */
+
+ 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 */
+ ret
+
calljava_xhandler2:
- mov %rax,%rdi /* pass exception pointer */
- call builtin_throw_exception
- add $8,%rsp
- ret
-
+ mov %rax,%rdi /* 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 */
+ ret
+
+
+jumptable_integer:
+ .quad handle_a0
+ .quad handle_a1
+ .quad handle_a2
+ .quad handle_a3
+ .quad handle_a4
+ .quad handle_a5
+
+handle_a0:
+ mov offjniitem(itmp2),a0
+ jmp L_register_copy
+handle_a1:
+ mov offjniitem(itmp2),a1
+ jmp L_register_copy
+handle_a2:
+ mov offjniitem(itmp2),a2
+ jmp L_register_copy
+handle_a3:
+ mov offjniitem(itmp2),a3
+ jmp L_register_copy
+handle_a4:
+ mov offjniitem(itmp2),a4
+ jmp L_register_copy
+handle_a5:
+ mov offjniitem(itmp2),a5
+ jmp L_register_copy
+
+
+jumptable_float:
+ .quad handle_fa0
+ .quad handle_fa1
+ .quad handle_fa2
+ .quad handle_fa3
+ .quad handle_fa4
+ .quad handle_fa5
+ .quad handle_fa6
+ .quad handle_fa7
+
+handle_fa0:
+ movq offjniitem(itmp2),fa0
+ jmp L_register_copy
+handle_fa1:
+ movq offjniitem(itmp2),fa1
+ jmp L_register_copy
+handle_fa2:
+ movq offjniitem(itmp2),fa2
+ jmp L_register_copy
+handle_fa3:
+ movq offjniitem(itmp2),fa3
+ jmp L_register_copy
+handle_fa4:
+ movq offjniitem(itmp2),fa4
+ jmp L_register_copy
+handle_fa5:
+ movq offjniitem(itmp2),fa5
+ jmp L_register_copy
+handle_fa6:
+ movq offjniitem(itmp2),fa6
+ jmp L_register_copy
+handle_fa7:
+ movq offjniitem(itmp2),fa7
+ jmp L_register_copy
+
/****************** function asm_call_jit_compiler *****************************
* *
jmp *%rax /* ...and now call the new method */
-
-/****************** function asm_dumpregistersandcall **************************
-* *
-* This funtion saves all callee saved registers and calls the function *
-* which is passed as parameter. *
-* *
-* This function is needed by the garbage collector, which needs to access *
-* all registers which are stored on the stack. Unused registers are *
-* cleared to avoid interferances with the GC. *
-* *
-* void asm_dumpregistersandcall (functionptr f); *
-* *
-*******************************************************************************/
-
-asm_dumpregistersandcall:
- sub $(7*8),%rsp /* allocate stack space */
-
- mov %rbx,0*8(%rsp) /* save all callee saved registers */
- mov %rsp,1*8(%rsp)
- mov %rbp,2*8(%rsp)
- mov %r12,3*8(%rsp)
- mov %r13,4*8(%rsp)
- mov %r14,5*8(%rsp)
- mov %r15,6*8(%rsp)
-
- xor %rax,%rax /* intialize the remaining registers */
- xor %rcx,%rcx
- xor %rdx,%rdx
- xor %rsi,%rsi
- xor %r8,%r8
- xor %r9,%r9
- xor %r10,%r10
- xor %r11,%r11
-
- call *%rdi /* call function */
-
- mov 0*8(%rsp),%rbx
- mov 1*8(%rsp),%rsp
- mov 2*8(%rsp),%rbp
- mov 3*8(%rsp),%r12
- mov 4*8(%rsp),%r13
- mov 5*8(%rsp),%r14
- mov 6*8(%rsp),%r15
-
- add $(7*8),%rsp
- ret
-
-
/********************* function asm_handle_exception ***************************
* *
* This function handles an exception. It does not use the usual calling *
*******************************************************************************/
asm_handle_nat_exception:
- add $8,%rsp /* clear return address of native stub */
+ add $8,%rsp /* clear return address of native stub*/
asm_handle_exception:
- sub $(4*8),%rsp
- mov %rax,0*8(%rsp) /* save exception pointer */
- mov %r10,1*8(%rsp) /* save exception pc */
+ sub $(4*8),%rsp
+ mov xptr,0*8(%rsp) /* save exception pointer */
+ mov xpc,1*8(%rsp) /* save exception pc */
- mov %r10,%rdi /* exception pc */
- call findmethod
- mov %rax,%r11
- mov %rax,2*8(%rsp) /* save data segment pointer */
+ 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 */
+ mov 0*8(%rsp),%rax /* restore exception pointer */
+ mov 1*8(%rsp),%r10 /* restore exception pc */
ex_stack_loop:
- mov %rax,%rdi /* exception pointer */
- mov MethodPointer(%r11),%rsi /* method pointer */
- mov %r10,%rdx /* exception pc */
- mov $1,%rcx /* set noindent flag */
- call builtin_trace_exception
-
- mov 2*8(%rsp),%r11 /* %r11 = data segment pointer */
- mov ExTableSize(%r11),%rcx /* %rcx = exception table size */
- test %rcx,%rcx /* if empty table skip */
- je empty_table
-
- lea ExTableStart(%r11),%rdi /* %rdi = start of exception table*/
- mov 0*8(%rsp),%rax /* get xptr */
+ mov %rax,%rdi /* exception pointer */
+ mov MethodPointer(itmp3),%rsi /* method pointer */
+ mov xpc,%rdx /* exception pc */
+ mov $0,%rcx
+ mov $1,%r8 /* set noindent flag */
+ call builtin_trace_exception
+
+ mov 2*8(%rsp),itmp3 /* %r11 = data segment pointer */
+ mov ExTableSize(itmp3),%rcx /* %rcx = exception table size */
+ test %rcx,%rcx /* if empty table skip */
+ je empty_table
+
+ lea ExTableStart(itmp3),%rdi /* %rdi = start of exception table */
+ mov 0*8(%rsp),xptr /* get xptr */
ex_table_loop:
- mov 1*8(%rsp),%r10 /* get xpc */
+ mov 1*8(%rsp),xpc /* get xpc */
- mov ExStartPC(%rdi),%rdx /* %rdx = exception start pc */
- cmp %r10,%rdx /* %rdx = (startpc <= xpc) */
- jg ex_table_cont /* if (false) continue */
- mov ExEndPC(%rdi),%rdx /* %rdx = exception end pc */
- cmp %rdx,%r10 /* %rdx = (xpc < endpc) */
- jge ex_table_cont /* if (false) continue */
- mov ExCatchType(%rdi),%rdx /* %rdx = exception catch type */
- test %rdx,%rdx /* NULL catches everything */
- je ex_handle_it
-
- mov offobjvftbl(%rax),%rsi /* %rsi = vftblptr(xptr) */
- mov offclassvftbl(%rdx),%rdx /* %rdx = vftblptr(catchtype) class (not obj) */
- mov offbaseval(%rsi),%esi /* %esi = baseval(xptr) */
- mov offbaseval(%rdx),%r10d /* %r10d = baseval(catchtype) */
- mov offdiffval(%rdx),%edx /* %edx = diffval(catchtype) */
- sub %r10d,%esi /* %esi = baseval(xptr) - baseval(catchtype) */
- cmp %edx,%esi /* xptr is instanceof catchtype */
- ja ex_table_cont
+ mov ExStartPC(%rdi),%rdx /* %rdx = exception start pc */
+ cmp xpc,%rdx /* %rdx = (startpc <= xpc) */
+ jg ex_table_cont /* if (false) continue */
+ mov ExEndPC(%rdi),%rdx /* %rdx = exception end pc */
+ cmp %rdx,xpc /* %rdx = (xpc < endpc) */
+ jge ex_table_cont /* if (false) continue */
+ mov ExCatchType(%rdi),%rdx /* %rdx = exception catch type */
+ test %rdx,%rdx /* NULL catches everything */
+ je ex_handle_it
+
+ cmpl $0,offclassloaded(%rdx) /* check if class is loaded */
+ jne L_class_loaded
+
+ sub $(4*8),%rsp
+ mov %rax,0*8(%rsp)
+ mov %rcx,1*8(%rsp)
+ mov %rdx,2*8(%rsp)
+ mov %rdi,3*8(%rsp)
+
+ mov %rdx,%rdi
+ call class_load
+
+ mov 0*8(%rsp),%rax
+ mov 1*8(%rsp),%rcx
+ mov 2*8(%rsp),%rdx
+ mov 3*8(%rsp),%rdi
+ add $(4*8),%rsp
+
+L_class_loaded:
+ cmpl $0,offclasslinked(%rdx) /* check if class is linked */
+ jne L_class_linked
+
+ sub $(4*8),%rsp
+ mov %rax,0*8(%rsp)
+ mov %rcx,1*8(%rsp)
+ mov %rdx,2*8(%rsp)
+ mov %rdi,3*8(%rsp)
+
+ mov %rdx,%rdi
+ call class_link
+
+ mov 0*8(%rsp),%rax
+ mov 1*8(%rsp),%rcx
+ mov 2*8(%rsp),%rdx
+ mov 3*8(%rsp),%rdi
+ add $(4*8),%rsp
+
+L_class_linked:
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+ push %rdx
+
+_crit_restart1:
+ mov 0(%rsp),%rdx
+#endif
+
+_crit_begin1:
+ mov offobjvftbl(%rax),%rsi /* %rsi = vftblptr(xptr) */
+ mov offclassvftbl(%rdx),%rdx /* %rdx = vftblptr(catchtype) class (not obj) */
+ mov offbaseval(%rsi),%esi /* %esi = baseval(xptr) */
+ mov offbaseval(%rdx),%r10d /* %r10d = baseval(catchtype) */
+ mov offdiffval(%rdx),%edx /* %edx = diffval(catchtype) */
+_crit_end1:
+ sub %r10d,%esi /* %esi = baseval(xptr) - baseval(catchtype) */
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+ add $8,%rsp
+#endif
+
+ cmp %edx,%esi /* xptr is instanceof catchtype */
+ ja ex_table_cont
ex_handle_it:
- mov ExHandlerPC(%rdi),%r10 /* xpc = exception handler pc */
+ mov ExHandlerPC(%rdi),xpc /* xpc = exception handler pc */
mov 0*8(%rsp),%rax /* restore exception pointer */
add $(4*8),%rsp /* free stack frame */
- jmp *%r10 /* jump to the handler */
+ jmp *xpc /* jump to the handler */
ex_table_cont:
lea ExEntrySize(%rdi),%rdi /* next exception table entry */
mov %r10,1*8(%rsp)
mov %r10,%rdi
- call findmethod /* get the new data segment ptr */
+ call codegen_findmethod /* get the new data segment ptr */
mov %rax,%r11
mov 0*8(%rsp),%rcx
jmp ex_stack_loop
-/********************* function asm_check_clinit *******************************
-* *
-* Does null check and calls monitorenter or throws an exception *
-* *
+/* asm_check_clinit ************************************************************
+
+ DOCUMENT ME!!!
+
+ Stack layout:
+
+ 32 ra ; return address of patched call in java machine code
+ 24 xmcode ; additional machine code (only for i386 and x86_64)
+ 16 mcode ; machine code to patch back in
+ 8 class ; pointer to class
+ 0 sp ; stack pointer of java stack frame + return address
+
*******************************************************************************/
asm_check_clinit:
- mov offclassinit(%rax),%r10d /* get initialized flag (int) */
- test %r10,%r10
- jnz L_is_initialized
-
- sub $(7*8),%rsp /* keep stack 16-byte aligned */
- mov %rdi,0*8(%rsp) /* save argument registers */
- mov %rsi,1*8(%rsp)
- mov %rdx,2*8(%rsp)
- mov %rcx,3*8(%rsp)
- mov %r8,4*8(%rsp)
- mov %r9,5*8(%rsp)
-
- mov %rax,%rdi /* pass classinfo pointer */
- call class_init /* call class_init function */
-
- mov 0*8(%rsp),%rdi /* restore argument registers */
- mov 1*8(%rsp),%rsi
- mov 2*8(%rsp),%rdx
- mov 3*8(%rsp),%rcx
- mov 4*8(%rsp),%r8
- mov 5*8(%rsp),%r9
- add $(7*8),%rsp
+ mov 8(%rsp),itmp1
+ mov offclassinit(itmp1),itmp1l /* get initialized flag (int) */
+ test itmp1,itmp1
+ jnz L_is_initialized
+
+ sub $(15*8),%rsp /* keep stack 16-byte aligned */
+
+ mov %rdi,0*8(%rsp) /* save argument registers */
+ mov %rsi,1*8(%rsp)
+ mov %rdx,2*8(%rsp)
+ mov %rcx,3*8(%rsp)
+ mov %r8,4*8(%rsp)
+ mov %r9,5*8(%rsp)
+
+ movq %xmm0,6*8(%rsp) /* maybe cacao does not use all 8 */
+ movq %xmm1,7*8(%rsp) /* argument register, but who knows */
+ movq %xmm2,8*8(%rsp)
+ movq %xmm3,9*8(%rsp)
+ movq %xmm4,10*8(%rsp)
+ movq %xmm5,11*8(%rsp)
+ movq %xmm6,12*8(%rsp)
+ movq %xmm7,13*8(%rsp)
+
+ mov 8+15*8(%rsp),%rdi /* pass classinfo pointer */
+ call class_init /* call class_init function */
+
+ mov 0*8(%rsp),%rdi /* restore argument registers */
+ mov 1*8(%rsp),%rsi
+ mov 2*8(%rsp),%rdx
+ mov 3*8(%rsp),%rcx
+ mov 4*8(%rsp),%r8
+ mov 5*8(%rsp),%r9
+
+ movq 6*8(%rsp),%xmm0
+ movq 7*8(%rsp),%xmm1
+ movq 8*8(%rsp),%xmm2
+ movq 9*8(%rsp),%xmm3
+ movq 10*8(%rsp),%xmm4
+ movq 11*8(%rsp),%xmm5
+ movq 12*8(%rsp),%xmm6
+ movq 13*8(%rsp),%xmm7
+
+ add $(15*8),%rsp
+
+ test v0,v0 /* we had an exception */
+ je L_initializererror
L_is_initialized:
- mov (%rsp),%rax /* get return address */
- sub $23,%rax /* asm_putstatic call code size */
- movb $0xeb,(%rax) /* jmp rel8 */
- movb $21,1(%rax) /* 8-bit offset */
- ret
+ mov 32(%rsp),itmp1 /* get return address */
+ sub $5,itmp1 /* remove size of `call rel32' */
+
+ mov 24(%rsp),itmp2 /* get xmcode machine code */
+ movb itmp2b,(itmp1) /* patch back in 1 byte */
+ mov 16(%rsp),itmp2 /* get mcode machine code */
+ movl itmp2l,1(itmp1) /* patch back in 4 bytes */
+
+ add $(5*8),%rsp /* remove stub stack frame incl. ra */
+ jmp *itmp1 /* jump to patched code an execute it */
+
+L_initializererror:
+ add $(4*8),%rsp /* remove stub stack frame */
+
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+ call builtin_asm_get_exceptionptrptr
+ mov %rax,itmp2
+ mov (itmp2),xptr /* get the exception pointer */
+ movl $0,(itmp2) /* clear the exception pointer */
+#else
+ lea _exceptionptr,itmp2
+ mov (itmp2),xptr /* get the exception pointer */
+ movl $0,(itmp2) /* clear the exception pointer */
+#endif
+
+ pop xpc /* delete return address */
+ sub $5,xpc /* faulting address is ra - 5 */
+
+ jmp asm_handle_exception
+
/********************* function asm_builtin_monitorenter ***********************
* *
*******************************************************************************/
asm_builtin_monitorenter:
- test %rdi,%rdi
- je nb_monitorenter /* if (null) throw exception */
- jmp builtin_monitorenter /* else call builtin_monitorenter */
+ test %rdi,%rdi
+ je nb_monitorenter /* if (null) throw exception */
+ jmp builtin_monitorenter /* else call builtin_monitorenter */
nb_monitorenter:
- mov string_java_lang_NullPointerException,%rdi
- call new_exception
-
- pop %r10 /* delete return address */
- sub $3,%r10 /* faulting address is return adress - 3 */
- jmp asm_handle_exception
+ call new_nullpointerexception
+ pop %r10 /* delete return address */
+ sub $3,%r10 /* faulting address is return adress - 3 */
+ jmp asm_handle_exception
/********************* function asm_builtin_monitorexit ************************
*******************************************************************************/
asm_builtin_monitorexit:
- test %rdi,%rdi
- je nb_monitorexit /* if (null) throw exception */
- jmp builtin_monitorexit /* else call builtin_monitorenter */
+ test %rdi,%rdi
+ je nb_monitorexit /* if (null) throw exception */
+ jmp builtin_monitorexit /* else call builtin_monitorenter */
nb_monitorexit:
- mov string_java_lang_NullPointerException,%rdi
- call new_exception
-
- pop %r10 /* delete return address */
- sub $3,%r10 /* faulting address is return adress - 3 */
- jmp asm_handle_exception
+ call new_nullpointerexception
+ pop %r10 /* delete return address */
+ sub $3,%r10 /* faulting address is return adress - 3 */
+ jmp asm_handle_exception
/********************* function asm_builtin_x2x ********************************
*******************************************************************************/
asm_builtin_f2i:
- sub $(14*8),%rsp
-
- mov %rdi,0*8(%rsp)
- mov %rsi,1*8(%rsp)
- mov %rdx,2*8(%rsp)
- mov %rcx,3*8(%rsp)
- mov %r8,4*8(%rsp)
- mov %r9,5*8(%rsp)
-
- movq %xmm0,6*8(%rsp)
- movq %xmm1,7*8(%rsp)
- movq %xmm2,8*8(%rsp)
- movq %xmm3,9*8(%rsp)
- movq %xmm4,10*8(%rsp)
- movq %xmm5,11*8(%rsp)
- movq %xmm6,12*8(%rsp)
- movq %xmm7,13*8(%rsp)
-
- movq %xmm8,%xmm0
- call builtin_f2i
-
- mov 0*8(%rsp),%rdi
- mov 1*8(%rsp),%rsi
- mov 2*8(%rsp),%rdx
- mov 3*8(%rsp),%rcx
- mov 4*8(%rsp),%r8
- mov 5*8(%rsp),%r9
-
- movq 6*8(%rsp),%xmm0
- movq 7*8(%rsp),%xmm1
- movq 8*8(%rsp),%xmm2
- movq 9*8(%rsp),%xmm3
- movq 10*8(%rsp),%xmm4
- movq 11*8(%rsp),%xmm5
- movq 12*8(%rsp),%xmm6
- movq 13*8(%rsp),%xmm7
-
- add $(14*8),%rsp
- ret
+ sub $(14*8),%rsp
+
+ mov %rdi,0*8(%rsp)
+ mov %rsi,1*8(%rsp)
+ mov %rdx,2*8(%rsp)
+ mov %rcx,3*8(%rsp)
+ mov %r8,4*8(%rsp)
+ mov %r9,5*8(%rsp)
+
+ movq %xmm0,6*8(%rsp)
+ movq %xmm1,7*8(%rsp)
+ movq %xmm2,8*8(%rsp)
+ movq %xmm3,9*8(%rsp)
+ movq %xmm4,10*8(%rsp)
+ movq %xmm5,11*8(%rsp)
+ movq %xmm6,12*8(%rsp)
+ movq %xmm7,13*8(%rsp)
+
+ movq %xmm8,%xmm0
+ call builtin_f2i
+
+ mov 0*8(%rsp),%rdi
+ mov 1*8(%rsp),%rsi
+ mov 2*8(%rsp),%rdx
+ mov 3*8(%rsp),%rcx
+ mov 4*8(%rsp),%r8
+ mov 5*8(%rsp),%r9
+
+ movq 6*8(%rsp),%xmm0
+ movq 7*8(%rsp),%xmm1
+ movq 8*8(%rsp),%xmm2
+ movq 9*8(%rsp),%xmm3
+ movq 10*8(%rsp),%xmm4
+ movq 11*8(%rsp),%xmm5
+ movq 12*8(%rsp),%xmm6
+ movq 13*8(%rsp),%xmm7
+
+ add $(14*8),%rsp
+ ret
+
asm_builtin_f2l:
- sub $(14*8),%rsp
-
- mov %rdi,0*8(%rsp)
- mov %rsi,1*8(%rsp)
- mov %rdx,2*8(%rsp)
- mov %rcx,3*8(%rsp)
- mov %r8,4*8(%rsp)
- mov %r9,5*8(%rsp)
-
- movq %xmm0,6*8(%rsp)
- movq %xmm1,7*8(%rsp)
- movq %xmm2,8*8(%rsp)
- movq %xmm3,9*8(%rsp)
- movq %xmm4,10*8(%rsp)
- movq %xmm5,11*8(%rsp)
- movq %xmm6,12*8(%rsp)
- movq %xmm7,13*8(%rsp)
-
- movq %xmm8,%xmm0
- call builtin_f2l
-
- mov 0*8(%rsp),%rdi
- mov 1*8(%rsp),%rsi
- mov 2*8(%rsp),%rdx
- mov 3*8(%rsp),%rcx
- mov 4*8(%rsp),%r8
- mov 5*8(%rsp),%r9
-
- movq 6*8(%rsp),%xmm0
- movq 7*8(%rsp),%xmm1
- movq 8*8(%rsp),%xmm2
- movq 9*8(%rsp),%xmm3
- movq 10*8(%rsp),%xmm4
- movq 11*8(%rsp),%xmm5
- movq 12*8(%rsp),%xmm6
- movq 13*8(%rsp),%xmm7
-
- add $(14*8),%rsp
- ret
+ sub $(14*8),%rsp
+
+ mov %rdi,0*8(%rsp)
+ mov %rsi,1*8(%rsp)
+ mov %rdx,2*8(%rsp)
+ mov %rcx,3*8(%rsp)
+ mov %r8,4*8(%rsp)
+ mov %r9,5*8(%rsp)
+
+ movq %xmm0,6*8(%rsp)
+ movq %xmm1,7*8(%rsp)
+ movq %xmm2,8*8(%rsp)
+ movq %xmm3,9*8(%rsp)
+ movq %xmm4,10*8(%rsp)
+ movq %xmm5,11*8(%rsp)
+ movq %xmm6,12*8(%rsp)
+ movq %xmm7,13*8(%rsp)
+
+ movq %xmm8,%xmm0
+ call builtin_f2l
+
+ mov 0*8(%rsp),%rdi
+ mov 1*8(%rsp),%rsi
+ mov 2*8(%rsp),%rdx
+ mov 3*8(%rsp),%rcx
+ mov 4*8(%rsp),%r8
+ mov 5*8(%rsp),%r9
+
+ movq 6*8(%rsp),%xmm0
+ movq 7*8(%rsp),%xmm1
+ movq 8*8(%rsp),%xmm2
+ movq 9*8(%rsp),%xmm3
+ movq 10*8(%rsp),%xmm4
+ movq 11*8(%rsp),%xmm5
+ movq 12*8(%rsp),%xmm6
+ movq 13*8(%rsp),%xmm7
+
+ add $(14*8),%rsp
+ ret
+
-
asm_builtin_d2i:
- sub $(14*8),%rsp
-
- mov %rdi,0*8(%rsp)
- mov %rsi,1*8(%rsp)
- mov %rdx,2*8(%rsp)
- mov %rcx,3*8(%rsp)
- mov %r8,4*8(%rsp)
- mov %r9,5*8(%rsp)
-
- movq %xmm0,6*8(%rsp)
- movq %xmm1,7*8(%rsp)
- movq %xmm2,8*8(%rsp)
- movq %xmm3,9*8(%rsp)
- movq %xmm4,10*8(%rsp)
- movq %xmm5,11*8(%rsp)
- movq %xmm6,12*8(%rsp)
- movq %xmm7,13*8(%rsp)
-
- movq %xmm8,%xmm0
- call builtin_d2i
-
- mov 0*8(%rsp),%rdi
- mov 1*8(%rsp),%rsi
- mov 2*8(%rsp),%rdx
- mov 3*8(%rsp),%rcx
- mov 4*8(%rsp),%r8
- mov 5*8(%rsp),%r9
-
- movq 6*8(%rsp),%xmm0
- movq 7*8(%rsp),%xmm1
- movq 8*8(%rsp),%xmm2
- movq 9*8(%rsp),%xmm3
- movq 10*8(%rsp),%xmm4
- movq 11*8(%rsp),%xmm5
- movq 12*8(%rsp),%xmm6
- movq 13*8(%rsp),%xmm7
-
- add $(14*8),%rsp
- ret
+ sub $(14*8),%rsp
+
+ mov %rdi,0*8(%rsp)
+ mov %rsi,1*8(%rsp)
+ mov %rdx,2*8(%rsp)
+ mov %rcx,3*8(%rsp)
+ mov %r8,4*8(%rsp)
+ mov %r9,5*8(%rsp)
+
+ movq %xmm0,6*8(%rsp)
+ movq %xmm1,7*8(%rsp)
+ movq %xmm2,8*8(%rsp)
+ movq %xmm3,9*8(%rsp)
+ movq %xmm4,10*8(%rsp)
+ movq %xmm5,11*8(%rsp)
+ movq %xmm6,12*8(%rsp)
+ movq %xmm7,13*8(%rsp)
+
+ movq %xmm8,%xmm0
+ call builtin_d2i
+
+ mov 0*8(%rsp),%rdi
+ mov 1*8(%rsp),%rsi
+ mov 2*8(%rsp),%rdx
+ mov 3*8(%rsp),%rcx
+ mov 4*8(%rsp),%r8
+ mov 5*8(%rsp),%r9
+
+ movq 6*8(%rsp),%xmm0
+ movq 7*8(%rsp),%xmm1
+ movq 8*8(%rsp),%xmm2
+ movq 9*8(%rsp),%xmm3
+ movq 10*8(%rsp),%xmm4
+ movq 11*8(%rsp),%xmm5
+ movq 12*8(%rsp),%xmm6
+ movq 13*8(%rsp),%xmm7
+
+ add $(14*8),%rsp
+ ret
asm_builtin_d2l:
- sub $(14*8),%rsp
-
- mov %rdi,0*8(%rsp)
- mov %rsi,1*8(%rsp)
- mov %rdx,2*8(%rsp)
- mov %rcx,3*8(%rsp)
- mov %r8,4*8(%rsp)
- mov %r9,5*8(%rsp)
-
- movq %xmm0,6*8(%rsp)
- movq %xmm1,7*8(%rsp)
- movq %xmm2,8*8(%rsp)
- movq %xmm3,9*8(%rsp)
- movq %xmm4,10*8(%rsp)
- movq %xmm5,11*8(%rsp)
- movq %xmm6,12*8(%rsp)
- movq %xmm7,13*8(%rsp)
-
- movq %xmm8,%xmm0
- call builtin_d2l
-
- mov 0*8(%rsp),%rdi
- mov 1*8(%rsp),%rsi
- mov 2*8(%rsp),%rdx
- mov 3*8(%rsp),%rcx
- mov 4*8(%rsp),%r8
- mov 5*8(%rsp),%r9
-
- movq 6*8(%rsp),%xmm0
- movq 7*8(%rsp),%xmm1
- movq 8*8(%rsp),%xmm2
- movq 9*8(%rsp),%xmm3
- movq 10*8(%rsp),%xmm4
- movq 11*8(%rsp),%xmm5
- movq 12*8(%rsp),%xmm6
- movq 13*8(%rsp),%xmm7
-
- add $(14*8),%rsp
- ret
-
-
-/*********************** function new_builtin_checkcast ************************
-* *
-* Does the cast check and eventually throws an exception *
-* *
-*******************************************************************************/
+ sub $(14*8),%rsp
+
+ mov %rdi,0*8(%rsp)
+ mov %rsi,1*8(%rsp)
+ mov %rdx,2*8(%rsp)
+ mov %rcx,3*8(%rsp)
+ mov %r8,4*8(%rsp)
+ mov %r9,5*8(%rsp)
+
+ movq %xmm0,6*8(%rsp)
+ movq %xmm1,7*8(%rsp)
+ movq %xmm2,8*8(%rsp)
+ movq %xmm3,9*8(%rsp)
+ movq %xmm4,10*8(%rsp)
+ movq %xmm5,11*8(%rsp)
+ movq %xmm6,12*8(%rsp)
+ movq %xmm7,13*8(%rsp)
+
+ movq %xmm8,%xmm0
+ call builtin_d2l
+
+ mov 0*8(%rsp),%rdi
+ mov 1*8(%rsp),%rsi
+ mov 2*8(%rsp),%rdx
+ mov 3*8(%rsp),%rcx
+ mov 4*8(%rsp),%r8
+ mov 5*8(%rsp),%r9
+
+ movq 6*8(%rsp),%xmm0
+ movq 7*8(%rsp),%xmm1
+ movq 8*8(%rsp),%xmm2
+ movq 9*8(%rsp),%xmm3
+ movq 10*8(%rsp),%xmm4
+ movq 11*8(%rsp),%xmm5
+ movq 12*8(%rsp),%xmm6
+ movq 13*8(%rsp),%xmm7
+
+ add $(14*8),%rsp
+ ret
-asm_builtin_checkcast:
- xor %rax,%rax
- mov %rax,(%rax)
- ret
-
/******************* function asm_builtin_checkarraycast ***********************
* *
* Does the cast check and eventually throws an exception *
*******************************************************************************/
asm_builtin_checkarraycast:
- sub $24,%rsp /* keep stack 16-byte aligned */
- mov %rdi,(%rsp) /* save object pointer */
- call builtin_checkarraycast /* builtin_checkarraycast */
- test %rax,%rax /* if (false) throw exception */
- je nb_carray_throw
- mov (%rsp),%rax /* return object pointer */
- add $24,%rsp /* free stack space */
- ret
+ sub $24,%rsp /* keep stack 16-byte aligned */
+ mov %rdi,(%rsp) /* save object pointer */
+ call builtin_checkarraycast /* builtin_checkarraycast */
+ test %rax,%rax /* if (false) throw exception */
+ je nb_carray_throw
+ mov (%rsp),%rax /* return object pointer */
+ add $24,%rsp /* free stack space */
+ ret
nb_carray_throw:
- mov string_java_lang_ClassCastException,%rdi
- call new_exception
-
- add $24,%rsp
- pop %r10 /* delete return address */
- sub $3,%r10 /* faulting address is return adress - 3 */
- jmp asm_handle_exception
+ call new_classcastexception
+ add $24,%rsp
+ pop %r10 /* delete return address */
+ sub $3,%r10 /* faulting address is return adress - 3 */
+ jmp asm_handle_exception
/******************* function asm_builtin_aastore ******************************
ret
nb_aastore_null:
- mov string_java_lang_NullPointerException,%rdi
- call new_exception
-
+ call new_nullpointerexception
add $24,%rsp
- pop %r10 /* delete return address */
+ pop %r10 /* delete return address */
sub $3,%r10 /* faulting address is return adress - 3 */
jmp asm_handle_exception
nb_aastore_bound:
- mov string_java_lang_ArrayIndexOutOfBoundsException,%rdi
- call new_exception_int /* %rsi already contains the index */
-
+ mov %rsi,%rdi /* move index into a0 */
+ call new_arrayindexoutofboundsexception
add $24,%rsp
- pop %r10 /* delete return address */
+ pop %r10 /* delete return address */
sub $3,%r10 /* faulting address is return adress - 3 */
jmp asm_handle_exception
nb_aastore_throw:
- mov string_java_lang_ArrayStoreException,%rdi
- call new_exception
-
+ call new_arraystoreexception
add $24,%rsp
- pop %r10 /* delete return address */
+ pop %r10 /* delete return address */
sub $3,%r10 /* faulting address is return adress - 3 */
jmp asm_handle_exception
mov %r10,(%rsp) /* write return adress */
ret
-
-/********************* function asm_getcallingmethod ***************************
-* *
-* classinfo *asm_getcallingmethod (); *
-* *
-* goes back stack frames to get the calling method *
-* *
-* t2 .. sp *
-* t3 .. ra *
-* t4 .. pv *
-* *
-* Stack: *
-* java function *
-* native stub *
-* Java_java_lang_System_getCallerClass *
-* *
-*******************************************************************************/
-asm_getcallingmethod:
- mov %rbp,%rax /* return address of native function */
- add $(2*8),%rax /* %rsp, return address */
- add $(7*8),%rax /* native stub stackframe */
- mov (%rax),%rdi /* return address to java function */
- call findmethod
- mov MethodPointer(%rax),%rax
- ret
+asm_getclassvalues_atomic:
+_crit_restart2:
+_crit_begin2:
+ movl offbaseval(a0),itmp1l
+ movl offdiffval(a0),itmp2l
+ movl offbaseval(a1),itmp3l
+_crit_end2:
+ movl itmp1l,offcast_super_baseval(a2)
+ movl itmp2l,offcast_super_diffval(a2)
+ movl itmp3l,offcast_sub_baseval(a2)
+ ret
+ .data
+
+asm_criticalsections:
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+ .quad _crit_begin1
+ .quad _crit_end1
+ .quad _crit_restart1
+ .quad _crit_begin2
+ .quad _crit_end2
+ .quad _crit_restart2
+#endif
+ .quad 0
-asm_printf:
- push %rbp
- mov %rsp,%rbp
-
- push %rax
- push %rcx
- push %rdx
- push %rbx
- push %rsi
- push %rdi
- push %r8
- push %r9
- push %r10
- push %r11
- push %r12
- push %r13
- push %r14
- push %r15
-
- mov 16(%rbp),%rdi
- call asmprintf
-
- pop %r15
- pop %r14
- pop %r13
- pop %r12
- pop %r11
- pop %r10
- pop %r9
- pop %r8
- pop %rdi
- pop %rsi
- pop %rbx
- pop %rdx
- pop %rcx
- pop %rax
-
- leave
- ret
-
+
/*
* 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