1 /* jit/powerpc/asmpart.S - Java-C interface functions for powerpc
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 Institut f. Computersprachen, TU Wien
5 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
6 S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
9 This file is part of CACAO.
11 This program is free software.text; you can redistribute it and/or
12 modify it under the terms of the GNU General Public License as
13 published by the Free Software Foundation; either version 2, or (at
14 your option) any later version.
16 This program is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY ; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 Contact: cacao@complang.tuwien.ac.at
28 Authors: Andreas Krall
31 $Id: asmpart.S 1059 2004-05-16 13:16:15Z twisti $
39 #define MethodPointer -8
45 #define ExTableSize -32
46 #define ExTableStart -32
48 #define ExEntrySize -16
51 #define ExHandlerPC -12
52 #define ExCatchType -16
70 .globl _asm_docalljavamethod
71 .globl _asm_calljavafunction2
72 .globl _asm_calljavafunction2long
73 .globl _asm_calljavafunction2double
74 .globl _asm_call_jit_compiler
77 .globl _asm_handle_nat_exception
78 .globl _asm_handle_exception
79 .globl _asm_check_clinit
80 .globl _asm_builtin_checkarraycast
81 .globl _asm_builtin_aastore
82 .globl _builtin_canstore
83 .globl _builtin_trace_exception
84 .globl _builtin_monitorenter
85 .globl _builtin_monitorexit
88 .globl _builtin_checkarraycast
89 .globl _asm_builtin_monitorenter
90 .globl _asm_builtin_monitorexit
91 .globl _asm_builtin_idiv
92 .globl _asm_builtin_irem
93 .globl _asm_builtin_ldiv
94 .globl _asm_builtin_lrem
95 .globl _asm_cacheflush
96 .globl _asm_initialize_thread_stack
97 .globl _asm_perform_threadswitch
98 .globl _asm_switchstackandcall
100 .globl _string_java_lang_NullPointerException
101 .globl _string_java_lang_ArrayIndexOutOfBoundsException
102 .globl _string_java_lang_ArrayStoreException
103 .globl _string_java_lang_ArithmeticException
104 .globl _string_java_lang_ArithmeticException_message
105 .globl _string_java_lang_ClassCastException
107 .globl _builtin_asm_get_exceptionptrptr
108 .globl __exceptionptr
110 .globl _builtin_throw_exception
114 .globl _catch_Handler
115 .globl _new_exception
116 .globl _new_exception_message
117 .globl _new_exception_int
119 .globl _asm_sighandler
132 .long _builtin_throw_exception
134 builtin_traceexception:
135 .long _builtin_trace_exception
136 builtin_monitorenter:
137 .long _builtin_monitorenter
139 .long _builtin_monitorexit
146 .long _builtin_canstore
147 builtincheckarraycast:
148 .long _builtin_checkarraycast
152 new_exception_message:
153 .long _new_exception_message
155 .long _new_exception_int
157 string_java_lang_NullPointerException:
158 .long _string_java_lang_NullPointerException
159 string_java_lang_ArrayIndexOutOfBoundsException:
160 .long _string_java_lang_ArrayIndexOutOfBoundsException
161 string_java_lang_ArrayStoreException:
162 .long _string_java_lang_ArrayStoreException
163 string_java_lang_ArithmeticException:
164 .long _string_java_lang_ArithmeticException
165 string_java_lang_ArithmeticException_message:
166 .long _string_java_lang_ArithmeticException_message
167 string_java_lang_ClassCastException:
168 .long _string_java_lang_ClassCastException
170 builtin_asm_get_exceptionptrptr:
171 .long _builtin_asm_get_exceptionptrptr
179 #define MethodPointer -8
180 #define FrameSize -12
185 #define ExTableSize -32
186 #define ExTableStart -32
188 #define ExEntrySize -16
191 #define ExHandlerPC -12
192 #define ExCatchType -16
196 .long 0 /* catch type all */
197 .long calljava_xhandler /* handler pc */
198 .long calljava_xhandler /* end pc */
199 .long _asm_calljavafunction /* start pc */
200 .long 1 /* extable size */
201 .long 0 /* fltsave */
202 .long 0 /* intsave */
205 .long 24 /* frame size */
206 .long 0 /* method pointer (pointer to name) */
207 .long 0 /* padding */
210 _asm_docalljavamethod:
245 // addis mptr,r31,ha16(_asm_call_jit_compiler-0b)
246 addi mptr,r31,lo16(_asm_call_jit_compiler-0b)
255 addi pv,itmp1,lo16(_asm_docalljavamethod-1b)
285 // addis pv,r31,ha16(builtinthrow-0b)
286 lwz itmp1,lo16(builtinthrow-0b)(r31)
289 b calljava_regrestore
295 .long 0 /* catch type all */
296 .long calljava_xhandler2 /* handler pc */
297 .long calljava_xhandler2 /* end pc */
298 .long _asm_calljavafunction2 /* start pc */
299 .long 1 /* extable size */
300 .long 0 /* fltsave */
301 .long 0 /* intsave */
304 .long 24 /* frame size */
305 .long 0 /* method pointer (pointer to name) */
306 .long 0 /* padding */
308 _asm_calljavafunction2:
309 _asm_calljavafunction2long:
310 _asm_calljavafunction2double:
338 stw r3,36(r1) /* save method pointer for compiler */
340 mr itmp1,r6 /* pointer to arg block */
341 mr itmp2,r4 /* arg count */
344 ble calljava_argsloaded
347 lwz r3,offjniitem+4(itmp1)
349 ble calljava_argsloaded
352 lwz r4,offjniitem+sizejniblock*1+4(itmp1)
354 ble calljava_argsloaded
358 lwz r5,offjniitem+sizejniblock*2+4(itmp1)
360 ble calljava_argsloaded
364 lwz r6,offjniitem+sizejniblock*3+4(itmp1)
366 ble calljava_argsloaded
370 // addis mptr,r31,ha16(_asm_call_jit_compiler-0b)
371 addi mptr,r31,lo16(_asm_call_jit_compiler-0b)
380 addi pv,itmp1,lo16(_asm_docalljavamethod-1b)
382 calljava_regrestore2:
410 // addis pv,r31,ha16(builtinthrow-0b)
411 lwz itmp1,lo16(builtinthrow-0b)(r31)
414 b calljava_regrestore2
417 _asm_call_jit_compiler:
468 // addis pv,r31,ha16(jitcompile-0b)
469 lwz itmp1,lo16(jitcompile-0b)(r31)
515 _asm_handle_nat_exception:
523 bne _asm_handle_exception
528 _asm_handle_exception:
558 lwz r3,0*4(r1) /* exception pointer */
559 lwz r4,MethodPointer(pv) /* method pointer */
560 mr r5,xpc /* exception pc */
562 li r6,0 /* line number */
563 li r7,4 /* set no unwind flag */
568 lwz itmp1,lo16(builtin_traceexception-0b)(itmp1)
570 addi r1,r1,-(24+5*4) /* 24 linkage area + 5 argument * 4 */
576 lwz xptr,0*4(r1) /* restore xptr */
581 lwz r3,ExTableSize(pv) /* r3 = exception table size */
582 mr. r3,r3 /* if empty table skip */
585 addi r4,pv,ExTableStart /* r4 = start of exception table */
588 lwz r5,ExStartPC(r4) /* r5 = exception start pc */
589 cmplw r5,xpc /* (startpc <= xpc) */
591 lwz r5,ExEndPC(r4) /* r5 = exception end pc */
592 cmplw xpc,r5 /* (xpc < endpc) */
594 lwz r7,ExCatchType(r4) /* r7 = exception catch type */
598 lwz itmp3,offclassloaded(r7)
602 addi r1,r1,-16*4 /* allocate stack */
603 stw r3,7*4(r1) /* save used registers */
604 stw r4,8*4(r1) /* 6*4 (linkage) + 1*4 (arg1) + 7*4 (save) */
612 mr r3,r7 /* arg1 = exceptionclass */
616 lwz itmp1,lo16(class_load-0b)(itmp1)
631 lwz itmp3,offclasslinked(r7)
635 addi r1,r1,-16*4 /* allocate stack */
636 stw r3,7*4(r1) /* save used registers */
637 stw r4,8*4(r1) /* 6*4 (linkage) + 1*4 (arg1) + 7*4 (save) */
645 mr r3,r7 /* arg1 = exceptionclass */
649 lwz itmp1,lo16(class_link-0b)(itmp1)
664 lwz r6,offobjvftbl(xptr) /* r6 = vftblptr(xptr) */
665 lwz r7,offclassvftbl(r7) /* r7 = vftblptr(catchtype) class (not obj) */
666 lwz r6,offbaseval(r6) /* r6 = baseval(xptr) */
667 lwz r8,offbaseval(r7) /* r8 = baseval(catchtype) */
668 lwz r7,offdiffval(r7) /* r7 = diffval(catchtype) */
669 subf r6,r8,r6 /* r6 = baseval(xptr) - baseval(catchtype) */
670 cmplw r6,r7 /* xptr is instanceof catchtype */
671 bgt ex_table_cont /* if (false) continue */
674 lwz xpc,ExHandlerPC(r4) /* xpc = exception handler pc */
703 addi r4,r4,ExEntrySize
708 mr. r2,r2 /* if here the first time, then */
709 beq ex_already_cleared
710 addi r1,r1,18*4 /* deallocate stack and */
711 li r2,0 /* clear the no unwind flag */
732 lwz itmp1,lo16(builtin_monitorexit-0b)(itmp1)
748 lwz r3,FrameSize(pv) /* r3 = frame size */
749 add r1,r1,r3 /* unwind stack */
750 mr r3,r1 /* r3 = pointer to save area */
751 lwz r4,IsLeaf(pv) /* r4 = is leaf procedure */
753 bne ex_no_restore /* if (leaf) skip */
754 lwz r4,8(r3) /* restore ra */
757 mflr r4 /* the new xpc is ra */
759 lwz r4,IntSave(pv) /* r4 = saved int register count */
763 addi r5,r5,lo16(ex_int2-ex_int1)
785 addi r5,r5,lo16(ex_flt2-ex_flt1)
815 /********************* asm_check_clinit ****************************************
817 * call static class initializer for PUT/GETSTATIC instructions *
819 *******************************************************************************/
823 lwz itmp2,offclassinit(itmp1)
829 addi r1,r1,-(26*8) /* keep stack 16-bytes aligned */
831 stw r3,4*8(r1) /* save argument registers */
832 stw r4,5*8(r1) /* preserve linkage area (24 bytes) */
833 stw r5,6*8(r1) /* and 4 bytes (better 8) for 1 argument */
855 lwz itmp1,lo16(class_init-0b)(pv)
858 mr itmp1,r3 /* save return value in temp register */
887 mr. itmp1,itmp1 /* check for an exception */
888 beq L_initializererror
894 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
895 #error XXX TWISTI please check me for correctness
898 addi r1,r1,-4*8 /* preserve linkage area (24 bytes) */
899 lwz itmp1,lo16(builtin_asm_get_exceptionptrptr-0b)(pv)
906 lwz itmp2,lo16(_exceptionptr-0b)(pv)
907 lwz xptr,0(itmp2) /* get the exception pointer */
909 stw r0,0(itmp2) /* clear the exception pointer */
913 b _asm_handle_nat_exception
916 /******************* function asm_builtin_checkarraycast ***********************
918 * Does the cast check and eventually throws an exception *
920 *******************************************************************************/
922 _asm_builtin_checkarraycast:
929 lwz itmp1,lo16(builtincheckarraycast-0b)(pv)
946 lwz r3,lo16(string_java_lang_ClassCastException-0b)(pv)
948 lwz itmp1,lo16(new_exception-0b)(pv)
956 b _asm_handle_nat_exception
959 /******************* function asm_builtin_aastore ******************************
961 * Does the cast check and eventually throws an exception *
963 *******************************************************************************/
965 _asm_builtin_aastore:
973 lwz itmp1,offarraysize(r3)
981 // addis pv,r31,ha16(builtincanstore-0b)
982 lwz itmp1,lo16(builtincanstore-0b)(pv)
993 stw itmp2,offobjarrdata(itmp1)
1000 lwz r3,lo16(string_java_lang_NullPointerException-0b)(pv)
1002 lwz itmp1,lo16(new_exception-0b)(pv)
1010 b _asm_handle_nat_exception
1016 addi r1,r1,-(24+2*4)
1017 lwz r3,lo16(string_java_lang_ArrayIndexOutOfBoundsException-0b)(pv)
1019 lwz itmp1,lo16(new_exception_int-0b)(pv)
1021 bctrl /* r4 already contains the index */
1027 b _asm_handle_nat_exception
1033 lwz r3,lo16(string_java_lang_ArrayStoreException-0b)(pv)
1035 lwz itmp1,lo16(new_exception-0b)(pv)
1043 b _asm_handle_nat_exception
1046 _asm_builtin_monitorenter:
1048 lwz itmp2,lo16(builtin_monitorenter-0b)(pv)
1058 lwz r3,lo16(string_java_lang_NullPointerException-0b)(pv)
1060 lwz itmp1,lo16(new_exception-0b)(pv)
1066 /* addi xpc,r0,-4 */
1071 b _asm_handle_nat_exception
1074 _asm_builtin_monitorexit:
1076 lwz itmp2,lo16(builtin_monitorexit-0b)(pv)
1086 lwz r3,lo16(string_java_lang_NullPointerException-0b)(pv)
1088 lwz itmp1,lo16(new_exception-0b)(pv)
1094 /* addi xpc,r0,-4 */
1099 b _asm_handle_nat_exception
1120 addi r1,r1,-(24+2*4)
1121 lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv)
1123 lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv)
1125 lwz itmp1,lo16(new_exception_message-0b)(pv)
1133 b _asm_handle_nat_exception
1151 mullw itmp3,itmp3,r4
1158 addi r1,r1,-(24+2*4)
1159 lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv)
1161 lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv)
1163 lwz itmp1,lo16(new_exception_message-0b)(pv)
1171 b _asm_handle_nat_exception
1178 lwz itmp1,lo16(builtin_ldiv-0b)(pv)
1185 addi r1,r1,-(24+2*4)
1186 lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv)
1188 lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv)
1190 lwz itmp1,lo16(new_exception_message-0b)(pv)
1198 b _asm_handle_nat_exception
1205 lwz itmp1,lo16(builtin_lrem-0b)(pv)
1212 addi r1,r1,-(24+2*4)
1213 lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv)
1215 lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv)
1217 lwz itmp1,lo16(new_exception_message-0b)(pv)
1225 b _asm_handle_nat_exception
1256 _asm_initialize_thread_stack:
1286 lfd f0,lo16(doublezero-0b)(r3)
1312 _asm_perform_threadswitch:
1404 _asm_switchstackandcall:
1422 #define C_RED_ZONE 224
1425 addi r1,r1,-32*4 - 32 - C_RED_ZONE
1433 lwz r0,lo16(catch_Handler-0b)(r31)
1444 addi r1,r1,32*4 + 32 + C_RED_ZONE
1445 b _asm_handle_exception
1451 addi r1,r1,32*4 + 32 + C_RED_ZONE
1456 * These are local overrides for various environment variables in Emacs.
1457 * Please do not remove this and leave it at the end of the file, where
1458 * Emacs will automagically detect them.
1459 * ---------------------------------------------------------------------
1462 * indent-tabs-mode: t