1 /* src/vm/jit/x86_64/asmpart.S - Java-C interface functions for x86_64
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Andreas Krall
31 $Id: asmpart.S 2414 2005-04-29 18:55:09Z twisti $
37 #include "vm/jit/x86_64/arch.h"
38 #include "vm/jit/x86_64/offsets.h"
39 #include "vm/jit/x86_64/asmoffsets.h"
42 /* define it like the risc way */
79 /* save and restore macros ****************************************************/
81 #define SAVE_ARGUMENT_REGISTERS \
88 movq fa0,6*8(%rsp) ; \
89 movq fa1,7*8(%rsp) ; \
90 movq fa2,8*8(%rsp) ; \
91 movq fa3,9*8(%rsp) ; \
92 movq fa4,10*8(%rsp) ; \
93 movq fa5,11*8(%rsp) ; \
94 movq fa6,12*8(%rsp) ; \
98 #define RESTORE_ARGUMENT_REGISTERS \
105 movq 6*8(%rsp),fa0 ; \
106 movq 7*8(%rsp),fa1 ; \
107 movq 8*8(%rsp),fa2 ; \
108 movq 9*8(%rsp),fa3 ; \
109 movq 10*8(%rsp),fa4 ; \
110 movq 11*8(%rsp),fa5 ; \
111 movq 12*8(%rsp),fa6 ; \
112 movq 13*8(%rsp),fa7 ;
115 #define SAVE_TEMPORARY_REGISTERS \
119 #define RESTORE_TEMPORARY_REGISTERS \
126 /********************* exported functions and variables ***********************/
128 .globl asm_calljavafunction
129 .globl asm_calljavafunction_int
131 .globl asm_calljavafunction2
132 .globl asm_calljavafunction2int
133 .globl asm_calljavafunction2long
134 .globl asm_calljavafunction2float
135 .globl asm_calljavafunction2double
137 .globl asm_call_jit_compiler
138 .globl asm_handle_exception
139 .globl asm_handle_nat_exception
141 .globl asm_wrapper_patcher
143 .globl asm_builtin_checkarraycast
144 .globl asm_builtin_aastore
146 .globl asm_builtin_f2i
147 .globl asm_builtin_f2l
148 .globl asm_builtin_d2i
149 .globl asm_builtin_d2l
151 .globl asm_perform_threadswitch
152 .globl asm_initialize_thread_stack
153 .globl asm_switchstackandcall
154 .globl asm_criticalsections
155 .globl asm_getclassvalues_atomic
157 .globl asm_prepare_native_stackinfo
158 .globl asm_remove_native_stackinfo
159 .globl asm_throw_and_handle_exception
160 .globl asm_throw_and_handle_hardware_arithmetic_exception
163 /********************* function asm_calljavafunction ***************************
165 * This function calls a Java-method (which possibly needs compilation) *
166 * with up to 4 address parameters. *
168 * This functions calls the JIT-compiler which eventually translates the *
169 * method into machine code. *
172 * javaobject_header *asm_calljavamethod (methodinfo *m, *
173 * void *arg1, void *arg2, void *arg3, void *arg4); *
175 *******************************************************************************/
180 .quad 0 /* catch type all */
181 .quad calljava_xhandler /* handler pc */
182 .quad calljava_xhandler /* end pc */
183 .quad asm_calljavafunction /* start pc */
184 .long 1 /* extable size */
186 .quad 0 /* line number table start */
187 .quad 0 /* line number table size */
189 .long 0 /* fltsave */
190 .long 0 /* intsave */
193 .long 8 /* frame size */
194 .quad 0 /* method pointer (pointer to name) */
196 asm_calljavafunction:
197 asm_calljavafunction_int:
198 sub $(3*8),%rsp /* keep stack 16-byte aligned */
200 mov %rbx,1*8(%rsp) /* %rbx is not a callee saved in cacao */
201 mov %rdi,%rax /* move function pointer to %rax */
202 /* compilerstub uses this */
204 mov %rsi,%rdi /* pass remaining parameters */
209 lea asm_call_jit_compiler,%r11
210 call *%r11 /* call JIT compiler */
214 add $(3*8),%rsp /* free stack space */
218 mov %rax,%rdi /* pass exception pointer */
219 call builtin_throw_exception
223 xor %rax,%rax /* return NULL */
227 /********************* function asm_calljavafunction ***************************
229 * This function calls a Java-method (which possibly needs compilation) *
230 * with up to 4 address parameters. *
232 * This functions calls the JIT-compiler which eventually translates the *
233 * method into machine code. *
236 * javaobject_header *asm_calljavamethod (methodinfo *m, *
237 * void *arg1, void *arg2, void *arg3, void *arg4); *
239 *******************************************************************************/
244 .quad 0 /* catch type all */
245 .quad calljava_xhandler2 /* handler pc */
246 .quad calljava_xhandler2 /* end pc */
247 .quad asm_calljavafunction2 /* start pc */
248 .long 1 /* extable size */
249 .quad 0 /* line number table start */
250 .quad 0 /* line number table size */
251 .long 0 /* fltsave */
252 .long 0 /* intsave */
255 .long 24 /* frame size */
256 .quad 0 /* method pointer (pointer to name) */
258 asm_calljavafunction2:
259 asm_calljavafunction2int:
260 asm_calljavafunction2long:
261 asm_calljavafunction2float:
262 asm_calljavafunction2double:
263 sub $(7*8),%rsp /* keep stack 16-byte aligned */
264 mov %rbx,0*8(%rsp) /* %rbx is not a callee saved in cacao */
271 mov %rdi,%rax /* move method pointer for compiler */
272 xor %rbp,%rbp /* set argument stack frame to zero */
274 test %rsi,%rsi /* maybe we have no args... */
277 mov %rsi,itmp3 /* arg count */
278 mov %rcx,itmp2 /* pointer to arg block */
280 mov itmp2,%r14 /* save argument block pointer */
281 mov itmp3,%r15 /* save argument count */
283 sub $sizejniblock,itmp2 /* initialize pointer (smaller code) */
284 add $1,itmp3 /* initialize argument count */
285 xor %r12,%r12 /* initialize integer argument counter */
286 xor %r13,%r13 /* initialize float argument counter */
289 add $sizejniblock,itmp2 /* goto next argument block */
290 dec itmp3 /* argument count - 1 */
291 jz L_register_copy_done
292 andb $0x02,offjniitemtype(itmp2) /* is this a float/double type? */
293 jnz L_register_handle_float /* yes, handle it */
295 cmp $INT_ARG_CNT,%r12 /* are we out of integer argument */
296 je L_register_copy /* register? yes, next loop */
298 lea jumptable_integer,%rbp
299 mov 0(%rbp,%r12,8),%rbx
300 inc %r12 /* integer argument counter + 1 */
303 L_register_handle_float:
304 cmp $FLT_ARG_CNT,%r13 /* are we out of float argument */
305 je L_register_copy /* register? yes, next loop */
307 lea jumptable_float,%rbp
308 mov 0(%rbp,%r13,8),%rbx
309 inc %r13 /* float argument counter + 1 */
312 L_register_copy_done:
313 mov %r15,%rbp /* calculate remaining arguments */
314 sub %r12,%rbp /* - integer arguments in registers */
315 sub %r13,%rbp /* - float arguments in registers */
316 jle L_copy_done /* are all assigned to registers? */
318 shl $3,%rbp /* calculate stack size */
319 sub %rbp,%rsp /* stack frame for arguments */
320 mov %rsp,%rbx /* use %rbx as temp sp */
322 sub $sizejniblock,%r14 /* initialize pointer (smaller code) */
323 add $1,%r15 /* initialize argument count */
326 add $sizejniblock,%r14 /* goto next argument block */
327 dec %r15 /* are there any arguments left? */
328 jz L_copy_done /* no test needed after dec */
330 andb $0x02,offjniitemtype(%r14) /* is this a float/double type? */
331 jnz L_stack_handle_float
332 dec %r12 /* arguments assigned to registers */
333 jge L_stack_copy_loop
336 L_stack_handle_float:
337 dec %r13 /* arguments assigned to registers */
338 jge L_stack_copy_loop
341 mov offjniitem(%r14),itmp3 /* copy s8 argument onto stack */
343 add $8,%rbx /* increase sp to next argument */
344 jmp L_stack_copy_loop
347 lea asm_call_jit_compiler,%r11/* %rax still contains method pointer */
348 call *%r11 /* call JIT compiler */
350 add %rbp,%rsp /* remove argument stack frame if any */
352 mov 5*8(%rsp),%r15 /* restore callee saved registers */
358 add $(7*8),%rsp /* free stack space */
362 mov %rax,%rdi /* pass exception pointer */
363 call builtin_throw_exception
365 mov 5*8(%rsp),%r15 /* restore callee saved registers */
371 add $(7*8),%rsp /* free stack space */
372 xor %rax,%rax /* return NULL */
385 mov offjniitem(itmp2),a0
388 mov offjniitem(itmp2),a1
391 mov offjniitem(itmp2),a2
394 mov offjniitem(itmp2),a3
397 mov offjniitem(itmp2),a4
400 mov offjniitem(itmp2),a5
415 movq offjniitem(itmp2),fa0
418 movq offjniitem(itmp2),fa1
421 movq offjniitem(itmp2),fa2
424 movq offjniitem(itmp2),fa3
427 movq offjniitem(itmp2),fa4
430 movq offjniitem(itmp2),fa5
433 movq offjniitem(itmp2),fa6
436 movq offjniitem(itmp2),fa7
440 /****************** function asm_call_jit_compiler *****************************
442 * invokes the compiler for untranslated JavaVM methods. *
444 * Register R0 contains a pointer to the method info structure (prepared *
445 * by createcompilerstub). Using the return address in R26 and the *
446 * offset in the LDA instruction or using the value in methodptr R28 the *
447 * patching address for storing the method address can be computed: *
449 * method address was either loaded using *
451 * i386_mov_imm_reg(a, REG_ITMP2) ; invokestatic/special *
452 * i386_call_reg(REG_ITMP2) *
456 * i386_mov_membase_reg(REG_SP, 0, REG_ITMP2) ; invokevirtual/interface *
457 * i386_mov_membase_reg(REG_ITMP2, OFFSET(, vftbl), REG_ITMP3) *
458 * i386_mov_membase_reg(REG_ITMP3, OFFSET(vftbl, table[0]) + \ *
459 * sizeof(methodptr) * m->vftblindex, REG_ITMP1) *
460 * i386_call_reg(REG_ITMP1) *
462 * in the static case the method pointer can be computed using the *
463 * return address and the lda function following the jmp instruction *
465 *******************************************************************************/
467 asm_call_jit_compiler:
468 sub $8,%rsp /* keep stack 16-byte aligned */
470 mov %rbx,(%rsp) /* save register */
472 mov 8(%rsp),%r11 /* get return address */
473 mov -1(%r11),%bl /* get function code */
474 cmp $0xd2,%bl /* called with `call *REG_ITMP2' (%r10)? */
475 jne L_not_static_special
477 sub $11,%r11 /* calculate address of immediate */
478 jmp L_call_jit_compile
480 L_not_static_special:
481 cmp $0xd0,%bl /* called with `call *REG_ITMP1' (%rax) */
482 jne L_not_virtual_interface
484 sub $7,%r11 /* calculate address of offset */
485 mov (%r11),%r11d /* get offset (32-bit) */
486 add %r10,%r11 /* add base address to get method address */
487 jmp L_call_jit_compile
489 L_not_virtual_interface: /* a call from asm_calljavamethod */
493 mov (%rsp),%rbx /* restore register */
495 sub $(24*8),%rsp /* 8 + 6*8 + 8*8 + 8*8 */
497 mov %r11,0*8(%rsp) /* save address for method pointer */
499 mov a0,1*8(%rsp) /* save arguments */
515 movq %xmm8,15*8(%rsp)/* we use them as callee saved registers */
516 movq %xmm9,16*8(%rsp)
517 movq %xmm10,17*8(%rsp)
518 movq %xmm11,18*8(%rsp)
519 movq %xmm12,19*8(%rsp)
520 movq %xmm13,20*8(%rsp)
521 movq %xmm14,21*8(%rsp)
522 movq %xmm15,22*8(%rsp)
524 mov %rax,%rdi /* pass method pointer */
545 movq 15*8(%rsp),%xmm8
546 movq 16*8(%rsp),%xmm9
547 movq 17*8(%rsp),%xmm10
548 movq 18*8(%rsp),%xmm11
549 movq 19*8(%rsp),%xmm12
550 movq 20*8(%rsp),%xmm13
551 movq 21*8(%rsp),%xmm14
552 movq 22*8(%rsp),%xmm15
555 add $8,%rsp /* keep stack 16-byte aligned */
557 test %rax,%rax /* check for exception */
558 je L_asm_call_jit_compiler_exception
560 test %r11,%r11 /* is address == 0 (asm_calljavamethod) */
563 mov %rax,(%r11) /* and now save the new pointer */
566 jmp *%rax /* ...and now call the new method */
568 L_asm_call_jit_compiler_exception:
569 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
570 call builtin_asm_get_exceptionptrptr
573 lea _exceptionptr,itmp2
575 mov (itmp2),xptr /* get the exception pointer */
576 movl $0,(itmp2) /* clear the exception pointer */
578 pop xpc /* delete return address */
579 sub $5,xpc /* faulting address is ra - 5 */
581 jmp asm_handle_exception
584 /********************* function asm_handle_exception ***************************
586 * This function handles an exception. It does not use the usual calling *
587 * conventions. The exception pointer is passed in REG_ITMP1 and the *
588 * pc from the exception raising position is passed in REG_ITMP2. It searches *
589 * the local exception table for a handler. If no one is found, it unwinds *
590 * stacks and continues searching the callers. *
592 * void asm_handle_exception (exceptionptr, exceptionpc); *
594 *******************************************************************************/
596 asm_handle_nat_exception:
597 add $8,%rsp /* clear return address of native stub*/
599 asm_handle_exception:
601 mov xptr,0*8(%rsp) /* save exception pointer */
602 mov xpc,1*8(%rsp) /* save exception pc */
604 mov xpc,%rdi /* exception pc */
605 call codegen_findmethod
607 mov %rax,2*8(%rsp) /* save data segment pointer */
609 mov 0*8(%rsp),%rax /* restore exception pointer */
610 mov 1*8(%rsp),%r10 /* restore exception pc */
613 mov %rax,%rdi /* exception pointer */
614 mov MethodPointer(itmp3),%rsi /* method pointer */
615 mov xpc,%rdx /* exception pc */
617 mov $1,%r8 /* set noindent flag */
618 call builtin_trace_exception
620 mov 2*8(%rsp),itmp3 /* %r11 = data segment pointer */
621 mov ExTableSize(itmp3),%rcx /* %rcx = exception table size */
622 test %rcx,%rcx /* if empty table skip */
625 lea ExTableStart(itmp3),%rdi /* %rdi = start of exception table */
626 mov 0*8(%rsp),xptr /* get xptr */
629 mov 1*8(%rsp),xpc /* get xpc */
631 mov ExStartPC(%rdi),%rdx /* %rdx = exception start pc */
632 cmp xpc,%rdx /* %rdx = (startpc <= xpc) */
633 jg ex_table_cont /* if (false) continue */
634 mov ExEndPC(%rdi),%rdx /* %rdx = exception end pc */
635 cmp %rdx,xpc /* %rdx = (xpc < endpc) */
636 jge ex_table_cont /* if (false) continue */
637 mov ExCatchType(%rdi),%rdx /* %rdx = exception catch type */
638 test %rdx,%rdx /* NULL catches everything */
641 cmpl $0,offclassloaded(%rdx) /* check if class is loaded */
651 call load_class_bootstrap
660 cmpl $0,offclasslinked(%rdx) /* check if class is linked */
679 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
687 mov offobjvftbl(%rax),%rsi /* %rsi = vftblptr(xptr) */
688 mov offclassvftbl(%rdx),%rdx /* %rdx = vftblptr(catchtype) class (not obj) */
689 mov offbaseval(%rsi),%esi /* %esi = baseval(xptr) */
690 mov offbaseval(%rdx),%r10d /* %r10d = baseval(catchtype) */
691 mov offdiffval(%rdx),%edx /* %edx = diffval(catchtype) */
693 sub %r10d,%esi /* %esi = baseval(xptr) - baseval(catchtype) */
695 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
699 cmp %edx,%esi /* xptr is instanceof catchtype */
703 mov ExHandlerPC(%rdi),xpc /* xpc = exception handler pc */
705 mov 0*8(%rsp),%rax /* restore exception pointer */
706 add $(4*8),%rsp /* free stack frame */
708 jmp *xpc /* jump to the handler */
711 lea ExEntrySize(%rdi),%rdi /* next exception table entry */
712 dec %rcx /* decrement entry counter */
713 test %rcx,%rcx /* if (t0 > 0) next entry */
717 mov 0*8(%rsp),%rax /* restore exception pointer */
718 mov 1*8(%rsp),%r10 /* restore exception pc */
719 mov 2*8(%rsp),%r11 /* restore data segment pointer */
722 mov %rax,%rcx /* save exception pointer */
725 movl IsSync(%r11),%eax /* %rax = SyncOffset */
726 test %rax,%rax /* if zero no monitorexit */
729 #if defined(USE_THREADS)
738 call builtin_monitorexit
747 mov FrameSize(%r11),%eax /* %eax = frame size */
748 add %rax,%rsp /* unwind stack */
749 mov %rsp,%rax /* %rax = pointer to save area */
751 mov IntSave(%r11),%edx /* %edx = saved int register count*/
778 shl $3,%edx /* multiply by 8 bytes */
782 mov FltSave(%r11),%edx /* %edx = saved flt register count*/
805 movq -48(%rax),%xmm10
807 movq -40(%rax),%xmm11
809 movq -32(%rax),%xmm12
811 movq -24(%rax),%xmm13
813 movq -16(%rax),%xmm14
818 pop %r10 /* the new xpc is return address */
819 sub $3,%r10 /* subtract 3 bytes for call */
826 call codegen_findmethod /* get the new data segment ptr */
833 mov %rcx,%rax /* restore saved exception pointer*/
837 mov %rax,0*8(%rsp) /* save exception pointer */
838 mov %r10,1*8(%rsp) /* save exception pc */
839 mov %r11,2*8(%rsp) /* save data segment pointer */
844 /* asm_wrapper_patcher *********************************************************
850 24 pointer to virtual java_objectheader
851 16 machine code (which is patched back later)
852 8 unresolved class/method/field reference
853 0 pointer to patcher function
855 *******************************************************************************/
858 sub $(17*8),%rsp /* stack frame (16-byte aligned) */
860 SAVE_ARGUMENT_REGISTERS
861 SAVE_TEMPORARY_REGISTERS
863 mov itmp1,15*8(%rsp) /* save itmp1 and itmp2 */
864 mov itmp2,16*8(%rsp) /* can be used by some instructions */
866 mov %rsp,a0 /* pass stack pointer */
867 add $(18*8),a0 /* skip patcher function pointer */
868 mov 17*8(%rsp),itmp3 /* get function pointer */
869 call *itmp3 /* call the patcher function */
870 mov v0,itmp3 /* save return value */
872 RESTORE_ARGUMENT_REGISTERS
873 RESTORE_TEMPORARY_REGISTERS
875 mov 15*8(%rsp),itmp1 /* restore itmp1 and itmp2 */
876 mov 16*8(%rsp),itmp2 /* can be used by some instructions */
878 add $((4+17)*8),%rsp /* remove stack frame, keep ra */
880 test itmp3,itmp3 /* exception thrown? */
881 jz L_asm_wrapper_patcher_exception
882 ret /* call new patched code */
884 L_asm_wrapper_patcher_exception:
885 /*stack bottom is xpc and it is directly below the last java stackframe*/
889 call asm_prepare_native_stackinfo /* be aware of the stack effect and calling convention explained above*/
891 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
892 call builtin_asm_get_exceptionptrptr
895 lea _exceptionptr,itmp2
897 mov (itmp2),a0 /* get the exception pointer */
898 movl $0,(itmp2) /* clear exception pointer */
899 call helper_fillin_stacktrace
903 call asm_remove_native_stackinfo /* be aware of the stack effect and calling convention explained above*/
906 pop xpc /* get and remove return address */
907 jmp asm_handle_exception
910 /* asm_builtin_x2x *************************************************************
912 * Wrapper functions for float to int corner cases *
914 *******************************************************************************/
919 SAVE_ARGUMENT_REGISTERS
924 RESTORE_ARGUMENT_REGISTERS
933 SAVE_ARGUMENT_REGISTERS
938 RESTORE_ARGUMENT_REGISTERS
947 SAVE_ARGUMENT_REGISTERS
952 RESTORE_ARGUMENT_REGISTERS
961 SAVE_ARGUMENT_REGISTERS
966 RESTORE_ARGUMENT_REGISTERS
972 /* asm_builtin_checkarraycast **************************************************
974 Does the cast check and eventually throws an exception.
976 *******************************************************************************/
978 asm_builtin_checkarraycast:
979 sub $24,%rsp /* keep stack 16-byte aligned */
980 mov %rdi,(%rsp) /* save object pointer */
981 call builtin_checkarraycast /* builtin_checkarraycast */
982 test %rax,%rax /* if (false) throw exception */
984 mov (%rsp),%rax /* return object pointer */
985 add $24,%rsp /* free stack space */
989 /*call new_classcastexception*/
991 pop xpc /* delete return address */
992 sub $3,xpc /* faulting address is ra - 3 */
993 mov string_java_lang_ClassCastException,xptr
994 jmp asm_throw_and_handle_exception
997 /* asm_builtin_aastore *********************************************************
999 Checks if the object can be stored in the given array and stores the
1000 address if it's possible. This function can also throw some exceptions.
1002 *******************************************************************************/
1004 asm_builtin_aastore:
1005 sub $(3*8),%rsp /* allocate stack space */
1006 test %rdi,%rdi /* if null pointer throw exception */
1009 movl offarraysize(%rdi),%eax /* load size */
1010 cmpl %eax,%esi /* do bound check */
1011 jae nb_aastore_bound /* if out of bounds throw exception */
1013 shl $3,%rsi /* index * 8 */
1015 add %rsi,%r10 /* add index * 8 to arrayref */
1017 mov %r10,(%rsp) /* save store position */
1018 mov %rdx,8(%rsp) /* save object */
1020 mov %rdx,%rsi /* object is second argument */
1021 call builtin_canstore /* builtin_canstore(arrayref,object) */
1022 test %rax,%rax /* if (false) throw exception */
1025 mov (%rsp),%r10 /* restore store position */
1026 mov 8(%rsp),%rdx /* restore object */
1027 mov %rdx,offobjarrdata(%r10)/* store objectptr in array */
1028 add $(3*8),%rsp /* free stack space */
1033 pop xpc /* delete return address from stack */
1034 sub $3,xpc /* faulting address is return adress - 3 */
1035 mov string_java_lang_NullPointerException,xptr
1036 jmp asm_throw_and_handle_exception
1040 push $0 /*directly below return address*/
1041 push $0 /*internal*/
1045 call asm_prepare_native_stackinfo
1047 mov itmp1,%rdi /* move index into a0 */
1048 call new_arrayindexoutofboundsexception
1050 call asm_remove_native_stackinfo
1052 pop xpc /* just remove one quadword */
1053 pop xpc /* delete return address */
1054 sub $3,xpc /* faulting address is return adress - 3 */
1055 jmp asm_handle_exception
1058 /*call new_arraystoreexception*/
1060 pop xpc /* delete return address */
1061 sub $3,xpc /* faulting address is return adress - 3 */
1062 mov string_java_lang_ArrayStoreException,xptr
1063 jmp asm_throw_and_handle_exception
1066 /******************* function asm_initialize_thread_stack **********************
1068 * initialized a thread stack *
1069 * (to)->restorePoint = asm_initialize_thread_stack((u1*)(func), (to)->stackEnd)*
1071 *******************************************************************************/
1073 asm_initialize_thread_stack:
1084 mov %rdi,6*8(%rsi) /* save (u1*) (func) */
1085 mov %rsi,%rax /* return restorepoint in %rax */
1089 /******************* function asm_perform_threadswitch *************************
1091 * void asm_perform_threadswitch (u1 **from, u1 **to, u1 **stackTop); *
1093 * performs a threadswitch *
1095 *******************************************************************************/
1097 asm_perform_threadswitch:
1098 sub $(7*8),%rsp /* allocate stack frame */
1107 mov 7*8(%rsp),%rax /* save current return address */
1110 mov %rsp,(%rdi) /* first argument **from */
1111 mov %rsp,(%rdx) /* third argument **stackTop */
1113 mov (%rsi),%rsp /* load new stack pointer */
1122 mov 6*8(%rsp),%rax /* restore return address */
1123 add $(7*8),%rsp /* free stack frame */
1128 /********************* function asm_switchstackandcall *************************
1130 * int asm_switchstackandcall (void *stack, void *func, void **stacktopsave, *
1133 * Switches to a new stack, calls a function and switches back. *
1134 * a0 (%rdi) new stack pointer *
1135 * a1 (%rsi) function pointer *
1136 * a2 (%rdx) pointer to variable where stack top should be stored *
1137 * a3 (%rcx) pointer to user data, is passed to the function *
1139 *******************************************************************************/
1141 asm_switchstackandcall:
1142 sub $(1*8),%rsp /* keep stack 16-byte aligned */
1143 sub $16,%rdi /* allocate new stack */
1145 mov 8(%rsp),%rax /* save return address on new stack */
1147 mov %rsp,8(%rdi) /* save old stack pointer on new stack*/
1148 mov %rsp,(%rdx) /* save old stack pointer to variable */
1150 mov %rdi,%rsp /* switch to new stack */
1152 mov %rcx,%rdi /* pass pointer */
1153 call *%rsi /* and call function */
1155 mov (%rsp),%r10 /* load return address */
1156 mov 8(%rsp),%rsp /* switch to old stack */
1157 add $(1*8),%rsp /* free stack space */
1158 mov %r10,(%rsp) /* write return adress */
1164 /************************ function asm_prepare_native_stackinfo ****************************
1166 * creates a stackfame for the begin of a native function (either builtin or not ) *
1167 * expected stack at begin of function *
1169 * address of the jit call which invokes the native *
1170 * begin address of stack frame of the java method *
1171 * method pointer or 0 (for built ins) *
1172 * padding for stackframesize 16*n+8 *
1175 * at end of function: *
1177 * address of the jit call which invokes the native *
1178 * begin address of stack frame of the java method *
1179 * method pointer or 0 (for built ins) *
1180 * address of thread specific top of native list *
1181 * old value of thread specific head *
1182 * padding for stackframesize 16*n+8) *
1186 * This thing is less efficient than the original #define (callerside) *
1187 * destroyes REG_ITMP2, keeps REG_ITMP1 *
1188 ********************************************************************************************/
1191 asm_prepare_native_stackinfo:
1192 sub $16,%rsp /*space for the 2 new pointers*/
1196 call builtin_asm_get_stackframeinfo
1209 /************************ function asm_remove _native_stackinfo *******************************************
1211 * removes a stackfame for the begin of a native function (either builtin or not) *
1212 * expected stack at begin of function *
1213 * address of the jit call which invokes the native *
1214 * begin address of stack frame of the java method *
1215 * method pointer or 0 (for built ins) *
1216 * address thread specific top of native list *
1217 * old value of thread specific head *
1221 * at end of function: *
1223 * return adresss of the jit call which invokes the native *
1229 * This thing is less efficient than the original #define (callerside), uses ITMP2,uses ITMP3,keeps ITMP1 *
1230 ***********************************************************************************************************/
1232 asm_remove_native_stackinfo:
1243 asm_throw_and_handle_exception:
1244 push xpc /* the pushed XPC is directly below the java frame*/
1248 call asm_prepare_native_stackinfo /* be aware of the stack effect and calling convention explained above*/
1253 call asm_remove_native_stackinfo /* be aware of the stack effect and calling convention explained above*/
1258 jmp asm_handle_exception
1259 ret /*should never be reached */
1262 asm_throw_and_handle_hardware_arithmetic_exception:
1265 push $0 /* the pushed XPC is directly below the java frame*/
1268 call asm_prepare_native_stackinfo /* be aware of the stack effect and calling convention explained above*/
1270 mov string_java_lang_ArithmeticException_message,%rsi
1271 mov string_java_lang_ArithmeticException,%rdi
1273 call new_exception_message
1275 call asm_remove_native_stackinfo /* be aware of the stack effect and calling convention explained above*/
1279 jmp asm_handle_exception
1280 ret /*should never be reached */
1283 asm_getclassvalues_atomic:
1286 movl offbaseval(a0),itmp1l
1287 movl offdiffval(a0),itmp2l
1288 movl offbaseval(a1),itmp3l
1290 movl itmp1l,offcast_super_baseval(a2)
1291 movl itmp2l,offcast_super_diffval(a2)
1292 movl itmp3l,offcast_sub_baseval(a2)
1297 asm_criticalsections:
1298 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
1301 .quad _crit_restart1
1304 .quad _crit_restart2
1310 * These are local overrides for various environment variables in Emacs.
1311 * Please do not remove this and leave it at the end of the file, where
1312 * Emacs will automagically detect them.
1313 * ---------------------------------------------------------------------
1316 * indent-tabs-mode: t