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 961 2004-03-15 00:35:39Z twisti $
53 .globl _builtin_throw_exception
55 .globl _asm_check_clinit
56 .globl _asm_builtin_checkarraycast
58 .globl _builtin_canstore
59 .globl _builtin_trace_exception
60 .globl _builtin_monitorenter
61 .globl _builtin_monitorexit
64 .globl _builtin_checkarraycast
65 .globl _proto_java_lang_NullPointerException
66 .globl _proto_java_lang_ArrayIndexOutOfBoundsException
67 .globl _proto_java_lang_ArrayStoreException
68 .globl _proto_java_lang_ArithmeticException
69 .globl _proto_java_lang_ClassCastException
73 #define MethodPointer -8
79 #define ExTableSize -32
80 #define ExTableStart -32
82 #define ExEntrySize -16
85 #define ExHandlerPC -12
86 #define ExCatchType -16
90 .long _builtin_throw_exception
93 .long 0 /* catch type all */
94 .long calljava_xhandler /* handler pc */
95 .long calljava_xhandler /* end pc */
96 .long _asm_calljavafunction /* start pc */
97 .long 1 /* extable size */
102 .long 24 /* frame size */
103 .long 0 /* method pointer (pointer to name) */
104 .long 0 /* padding */
107 .globl _asm_docalljavamethod
108 _asm_docalljavamethod:
143 // addis mptr,r31,ha16(_asm_call_jit_compiler-0b)
144 addi mptr,r31,lo16(_asm_call_jit_compiler-0b)
153 addi pv,itmp1,lo16(_asm_docalljavamethod-1b)
183 // addis pv,r31,ha16(builtinthrow-0b)
184 lwz itmp1,lo16(builtinthrow-0b)(r31)
187 b calljava_regrestore
193 .long 0 /* catch type all */
194 .long calljava_xhandler2 /* handler pc */
195 .long calljava_xhandler2 /* end pc */
196 .long _asm_calljavafunction2 /* start pc */
197 .long 1 /* extable size */
198 .long 0 /* fltsave */
199 .long 0 /* intsave */
202 .long 24 /* frame size */
203 .long 0 /* method pointer (pointer to name) */
204 .long 0 /* padding */
206 .globl _asm_calljavafunction2
207 .globl _asm_calljavafunction2long
208 .globl _asm_calljavafunction2double
209 _asm_calljavafunction2:
210 _asm_calljavafunction2long:
211 _asm_calljavafunction2double:
239 stw r3,36(r1) /* save method pointer for compiler */
241 mr itmp1,r6 /* pointer to arg block */
242 mr itmp2,r4 /* arg count */
245 ble calljava_argsloaded
248 lwz r3,offjniitem+4(itmp1)
250 ble calljava_argsloaded
253 lwz r4,offjniitem+sizejniblock*1+4(itmp1)
255 ble calljava_argsloaded
259 lwz r5,offjniitem+sizejniblock*2+4(itmp1)
261 ble calljava_argsloaded
265 lwz r6,offjniitem+sizejniblock*3+4(itmp1)
267 ble calljava_argsloaded
271 // addis mptr,r31,ha16(_asm_call_jit_compiler-0b)
272 addi mptr,r31,lo16(_asm_call_jit_compiler-0b)
281 addi pv,itmp1,lo16(_asm_docalljavamethod-1b)
283 calljava_regrestore2:
311 // addis pv,r31,ha16(builtinthrow-0b)
312 lwz itmp1,lo16(builtinthrow-0b)(r31)
315 b calljava_regrestore2
323 .globl _asm_call_jit_compiler
324 _asm_call_jit_compiler:
375 // addis pv,r31,ha16(jitcompile-0b)
376 lwz itmp1,lo16(jitcompile-0b)(r31)
421 builtin_traceexception:
422 .long _builtin_trace_exception
423 builtin_monitorenter:
424 .long _builtin_monitorenter
426 .long _builtin_monitorexit
432 .globl _asm_handle_nat_exception
433 _asm_handle_nat_exception:
441 bne _asm_handle_exception
446 .globl _asm_handle_exception
447 _asm_handle_exception:
477 lwz r3,0*4(r1) /* exception pointer */
478 lwz r4,MethodPointer(pv) /* method pointer */
479 mr r5,xpc /* exception pc */
481 li r6,1 /* set no unwind flag */
486 lwz itmp1,lo16(builtin_traceexception-0b)(itmp1)
499 lwz r3,ExTableSize(pv)
502 addi r4,pv,ExTableStart
511 lwz r7,ExCatchType(r4)
515 lwz r6,offobjvftbl(xptr)
516 lwz r7,offclassvftbl(r7)
517 lwz r6,offbaseval(r6)
518 lwz r8,offbaseval(r7)
519 lwz r7,offdiffval(r7)
525 lwz xpc,ExHandlerPC(r4)
554 addi r4,r4,ExEntrySize
560 beq ex_already_cleared
583 lwz itmp1,lo16(builtin_monitorexit-0b)(itmp1)
614 addi r5,r5,lo16(ex_int2-ex_int1)
636 addi r5,r5,lo16(ex_flt2-ex_flt1)
666 /********************* asm_check_clinit ****************************************
668 * call static class initializer for PUT/GETSTATIC instructions *
670 *******************************************************************************/
677 lwz itmp2,offclassinit(itmp1)
685 stw r3,3*8(r1) /* save argument registers */
686 stw r4,4*8(r1) /* preserve linkage area (24 bytes) */
709 lwz itmp1,lo16(class_init-0b)(pv)
744 _asm_builtin_checkarraycast:
751 lwz itmp1,lo16(builtincheckarraycast-0b)(pv)
764 lwz xptr,lo16(proto_java_lang_ClassCastException-0b)(pv)
768 b _asm_handle_nat_exception
770 .globl _asm_builtin_checkcast
771 _asm_builtin_checkcast:
773 lwz xptr,lo16(proto_java_lang_NullPointerException-0b)(pv)
776 b _asm_handle_nat_exception
785 .long _builtin_canstore
786 builtincheckarraycast:
787 .long _builtin_checkarraycast
789 .globl _asm_builtin_aastore
790 _asm_builtin_aastore:
798 lwz itmp1,offarraysize(r3)
806 // addis pv,r31,ha16(builtincanstore-0b)
807 lwz itmp1,lo16(builtincanstore-0b)(pv)
818 stw itmp2,offobjarrdata(itmp1)
821 proto_java_lang_NullPointerException:
822 .long _proto_java_lang_NullPointerException
823 proto_java_lang_ArrayIndexOutOfBoundsException:
824 .long _proto_java_lang_ArrayIndexOutOfBoundsException
825 proto_java_lang_ArrayStoreException:
826 .long _proto_java_lang_ArrayStoreException
827 proto_java_lang_ArithmeticException:
828 .long _proto_java_lang_ArithmeticException
829 proto_java_lang_ClassCastException:
830 .long _proto_java_lang_ClassCastException
833 lwz xptr,lo16(proto_java_lang_NullPointerException-0b)(pv)
836 b _asm_handle_nat_exception
838 lwz xptr,lo16(proto_java_lang_ArrayIndexOutOfBoundsException-0b)(pv)
842 b _asm_handle_nat_exception
844 lwz xptr,lo16(proto_java_lang_ArrayStoreException-0b)(pv)
847 b _asm_handle_nat_exception
851 .globl _asm_dumpregistersandcall
852 _asm_dumpregistersandcall:
887 .globl _asm_builtin_monitorenter
888 _asm_builtin_monitorenter:
890 lwz itmp2,lo16(builtin_monitorenter-0b)(pv)
897 lwz xptr,lo16(proto_java_lang_NullPointerException-0b)(pv)
900 b _asm_handle_nat_exception
902 .globl _asm_builtin_monitorexit
903 _asm_builtin_monitorexit:
905 lwz itmp2,lo16(builtin_monitorexit-0b)(pv)
912 lwz xptr,lo16(proto_java_lang_NullPointerException-0b)(pv)
915 b _asm_handle_nat_exception
921 .globl _synchronize_caches
924 .globl _asm_getcallingmethod
925 _asm_getcallingmethod:
929 .globl _asm_builtin_ldiv
934 lwz itmp1,lo16(builtin_ldiv-0b)(pv)
938 lwz xptr,lo16(proto_java_lang_ArithmeticException-0b)(pv)
941 b _asm_handle_nat_exception
943 .globl _asm_builtin_lrem
948 lwz itmp1,lo16(builtin_lrem-0b)(pv)
952 lwz xptr,lo16(proto_java_lang_ArithmeticException-0b)(pv)
955 b _asm_handle_nat_exception
957 .globl _asm_builtin_idiv
972 lwz xptr,lo16(proto_java_lang_ArithmeticException-0b)(pv)
975 b _asm_handle_nat_exception
977 .globl _asm_builtin_irem
996 lwz xptr,lo16(proto_java_lang_ArithmeticException-0b)(pv)
999 b _asm_handle_nat_exception
1004 .globl _has_no_x_instr_set
1005 _has_no_x_instr_set:
1010 .globl _asm_cacheflush
1038 .globl _asm_initialize_thread_stack
1039 _asm_initialize_thread_stack:
1069 lfd f0,lo16(doublezero-0b)(r3)
1094 .globl _asm_perform_threadswitch
1095 _asm_perform_threadswitch:
1188 .globl _asm_switchstackandcall
1189 _asm_switchstackandcall:
1215 lwz xptr,lo16(proto_java_lang_NullPointerException-0b)(itmp1)
1217 b _asm_handle_exception
1223 #define C_RED_ZONE 224
1226 .long _catch_Handler
1228 .globl _asm_sighandler
1230 addi r1,r1,-32*4 - 32 - C_RED_ZONE
1238 lwz r0,lo16(catch_Handler-0b)(r31)
1249 addi r1,r1,32*4 + 32 + C_RED_ZONE
1250 b _asm_handle_exception
1256 addi r1,r1,32*4 + 32 + C_RED_ZONE
1261 * These are local overrides for various environment variables in Emacs.
1262 * Please do not remove this and leave it at the end of the file, where
1263 * Emacs will automagically detect them.
1264 * ---------------------------------------------------------------------
1267 * indent-tabs-mode: t