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 979 2004-03-25 23:46:22Z 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_throw_exception
109 .globl _catch_Handler
110 .globl _new_exception
111 .globl _new_exception_message
112 .globl _new_exception_int
114 .globl _asm_sighandler
123 .long _builtin_throw_exception
125 builtin_traceexception:
126 .long _builtin_trace_exception
127 builtin_monitorenter:
128 .long _builtin_monitorenter
130 .long _builtin_monitorexit
137 .long _builtin_canstore
138 builtincheckarraycast:
139 .long _builtin_checkarraycast
143 new_exception_message:
144 .long _new_exception_message
146 .long _new_exception_int
148 string_java_lang_NullPointerException:
149 .long _string_java_lang_NullPointerException
150 string_java_lang_ArrayIndexOutOfBoundsException:
151 .long _string_java_lang_ArrayIndexOutOfBoundsException
152 string_java_lang_ArrayStoreException:
153 .long _string_java_lang_ArrayStoreException
154 string_java_lang_ArithmeticException:
155 .long _string_java_lang_ArithmeticException
156 string_java_lang_ArithmeticException_message:
157 .long _string_java_lang_ArithmeticException_message
158 string_java_lang_ClassCastException:
159 .long _string_java_lang_ClassCastException
165 #define MethodPointer -8
166 #define FrameSize -12
171 #define ExTableSize -32
172 #define ExTableStart -32
174 #define ExEntrySize -16
177 #define ExHandlerPC -12
178 #define ExCatchType -16
182 .long 0 /* catch type all */
183 .long calljava_xhandler /* handler pc */
184 .long calljava_xhandler /* end pc */
185 .long _asm_calljavafunction /* start pc */
186 .long 1 /* extable size */
187 .long 0 /* fltsave */
188 .long 0 /* intsave */
191 .long 24 /* frame size */
192 .long 0 /* method pointer (pointer to name) */
193 .long 0 /* padding */
196 _asm_docalljavamethod:
231 // addis mptr,r31,ha16(_asm_call_jit_compiler-0b)
232 addi mptr,r31,lo16(_asm_call_jit_compiler-0b)
241 addi pv,itmp1,lo16(_asm_docalljavamethod-1b)
271 // addis pv,r31,ha16(builtinthrow-0b)
272 lwz itmp1,lo16(builtinthrow-0b)(r31)
275 b calljava_regrestore
281 .long 0 /* catch type all */
282 .long calljava_xhandler2 /* handler pc */
283 .long calljava_xhandler2 /* end pc */
284 .long _asm_calljavafunction2 /* start pc */
285 .long 1 /* extable size */
286 .long 0 /* fltsave */
287 .long 0 /* intsave */
290 .long 24 /* frame size */
291 .long 0 /* method pointer (pointer to name) */
292 .long 0 /* padding */
294 _asm_calljavafunction2:
295 _asm_calljavafunction2long:
296 _asm_calljavafunction2double:
324 stw r3,36(r1) /* save method pointer for compiler */
326 mr itmp1,r6 /* pointer to arg block */
327 mr itmp2,r4 /* arg count */
330 ble calljava_argsloaded
333 lwz r3,offjniitem+4(itmp1)
335 ble calljava_argsloaded
338 lwz r4,offjniitem+sizejniblock*1+4(itmp1)
340 ble calljava_argsloaded
344 lwz r5,offjniitem+sizejniblock*2+4(itmp1)
346 ble calljava_argsloaded
350 lwz r6,offjniitem+sizejniblock*3+4(itmp1)
352 ble calljava_argsloaded
356 // addis mptr,r31,ha16(_asm_call_jit_compiler-0b)
357 addi mptr,r31,lo16(_asm_call_jit_compiler-0b)
366 addi pv,itmp1,lo16(_asm_docalljavamethod-1b)
368 calljava_regrestore2:
396 // addis pv,r31,ha16(builtinthrow-0b)
397 lwz itmp1,lo16(builtinthrow-0b)(r31)
400 b calljava_regrestore2
403 _asm_call_jit_compiler:
454 // addis pv,r31,ha16(jitcompile-0b)
455 lwz itmp1,lo16(jitcompile-0b)(r31)
501 _asm_handle_nat_exception:
509 bne _asm_handle_exception
514 _asm_handle_exception:
544 lwz r3,0*4(r1) /* exception pointer */
545 lwz r4,MethodPointer(pv) /* method pointer */
546 mr r5,xpc /* exception pc */
548 li r6,0 /* line number */
549 li r7,4 /* set no unwind flag */
554 lwz itmp1,lo16(builtin_traceexception-0b)(itmp1)
556 addi r1,r1,-(24+5*4) /* 24 linkage area + 5 argument * 4 */
562 lwz xptr,0*4(r1) /* restore xptr */
567 lwz r3,ExTableSize(pv) /* r3 = exception table size */
568 mr. r3,r3 /* if empty table skip */
571 addi r4,pv,ExTableStart /* r4 = start of exception table */
580 lwz r7,ExCatchType(r4)
584 lwz r6,offobjvftbl(xptr) /* r6 = vftblptr(xptr) */
585 lwz r7,offclassvftbl(r7) /* r7 = vftblptr(catchtype) class (not obj) */
586 lwz r6,offbaseval(r6) /* r6 = baseval(xptr) */
587 lwz r8,offbaseval(r7) /* r8 = baseval(catchtype) */
588 lwz r7,offdiffval(r7) /* r7 = diffval(catchtype) */
589 subf r6,r8,r6 /* r6 = baseval(xptr) - baseval(catchtype) */
590 cmplw r6,r7 /* xptr is instanceof catchtype */
591 bgt ex_table_cont /* if (false) continue */
594 lwz xpc,ExHandlerPC(r4) /* xpc = exception handler pc */
623 addi r4,r4,ExEntrySize
628 mr. r2,r2 /* if here the first time, then */
629 beq ex_already_cleared
630 addi r1,r1,18*4 /* deallocate stack and */
631 li r2,0 /* clear the no unwind flag */
652 lwz itmp1,lo16(builtin_monitorexit-0b)(itmp1)
668 lwz r3,FrameSize(pv) /* r3 = frame size */
669 add r1,r1,r3 /* unwind stack */
670 mr r3,r1 /* r3 = pointer to save area */
671 lwz r4,IsLeaf(pv) /* r4 = is leaf procedure */
673 bne ex_no_restore /* if (leaf) skip */
674 lwz r4,8(r3) /* restore ra */
677 mflr r4 /* the new xpc is ra */
679 lwz r4,IntSave(pv) /* r4 = saved int register count */
683 addi r5,r5,lo16(ex_int2-ex_int1)
705 addi r5,r5,lo16(ex_flt2-ex_flt1)
735 /********************* asm_check_clinit ****************************************
737 * call static class initializer for PUT/GETSTATIC instructions *
739 *******************************************************************************/
743 lwz itmp2,offclassinit(itmp1)
751 stw r3,3*8(r1) /* save argument registers */
752 stw r4,4*8(r1) /* preserve linkage area (24 bytes) */
775 lwz itmp1,lo16(class_init-0b)(pv)
810 /******************* function asm_builtin_checkarraycast ***********************
812 * Does the cast check and eventually throws an exception *
814 *******************************************************************************/
816 _asm_builtin_checkarraycast:
823 lwz itmp1,lo16(builtincheckarraycast-0b)(pv)
840 lwz r3,lo16(string_java_lang_ClassCastException-0b)(pv)
842 lwz itmp1,lo16(new_exception-0b)(pv)
850 b _asm_handle_nat_exception
853 /******************* function asm_builtin_aastore ******************************
855 * Does the cast check and eventually throws an exception *
857 *******************************************************************************/
859 _asm_builtin_aastore:
867 lwz itmp1,offarraysize(r3)
875 // addis pv,r31,ha16(builtincanstore-0b)
876 lwz itmp1,lo16(builtincanstore-0b)(pv)
887 stw itmp2,offobjarrdata(itmp1)
894 lwz r3,lo16(string_java_lang_NullPointerException-0b)(pv)
896 lwz itmp1,lo16(new_exception-0b)(pv)
904 b _asm_handle_nat_exception
911 lwz r3,lo16(string_java_lang_ArrayIndexOutOfBoundsException-0b)(pv)
913 lwz itmp1,lo16(new_exception_int-0b)(pv)
915 bctrl /* r4 already contains the index */
921 b _asm_handle_nat_exception
927 lwz r3,lo16(string_java_lang_ArrayStoreException-0b)(pv)
929 lwz itmp1,lo16(new_exception-0b)(pv)
937 b _asm_handle_nat_exception
940 _asm_builtin_monitorenter:
942 lwz itmp2,lo16(builtin_monitorenter-0b)(pv)
952 lwz r3,lo16(string_java_lang_NullPointerException-0b)(pv)
954 lwz itmp1,lo16(new_exception-0b)(pv)
965 b _asm_handle_nat_exception
968 _asm_builtin_monitorexit:
970 lwz itmp2,lo16(builtin_monitorexit-0b)(pv)
980 lwz r3,lo16(string_java_lang_NullPointerException-0b)(pv)
982 lwz itmp1,lo16(new_exception-0b)(pv)
993 b _asm_handle_nat_exception
1014 addi r1,r1,-(24+2*4)
1015 lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv)
1017 lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv)
1019 lwz itmp1,lo16(new_exception_message-0b)(pv)
1027 b _asm_handle_nat_exception
1045 mullw itmp3,itmp3,r4
1052 addi r1,r1,-(24+2*4)
1053 lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv)
1055 lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv)
1057 lwz itmp1,lo16(new_exception_message-0b)(pv)
1065 b _asm_handle_nat_exception
1072 lwz itmp1,lo16(builtin_ldiv-0b)(pv)
1079 addi r1,r1,-(24+2*4)
1080 lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv)
1082 lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv)
1084 lwz itmp1,lo16(new_exception_message-0b)(pv)
1092 b _asm_handle_nat_exception
1099 lwz itmp1,lo16(builtin_lrem-0b)(pv)
1106 addi r1,r1,-(24+2*4)
1107 lwz r3,lo16(string_java_lang_ArithmeticException-0b)(pv)
1109 lwz r4,lo16(string_java_lang_ArithmeticException_message-0b)(pv)
1111 lwz itmp1,lo16(new_exception_message-0b)(pv)
1119 b _asm_handle_nat_exception
1150 _asm_initialize_thread_stack:
1180 lfd f0,lo16(doublezero-0b)(r3)
1206 _asm_perform_threadswitch:
1298 _asm_switchstackandcall:
1316 #define C_RED_ZONE 224
1319 addi r1,r1,-32*4 - 32 - C_RED_ZONE
1327 lwz r0,lo16(catch_Handler-0b)(r31)
1338 addi r1,r1,32*4 + 32 + C_RED_ZONE
1339 b _asm_handle_exception
1345 addi r1,r1,32*4 + 32 + C_RED_ZONE
1350 * These are local overrides for various environment variables in Emacs.
1351 * Please do not remove this and leave it at the end of the file, where
1352 * Emacs will automagically detect them.
1353 * ---------------------------------------------------------------------
1356 * indent-tabs-mode: t