/* src/vm/jit/powerpc/asmpart.S - Java-C interface functions for PowerPC
- 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
+ Copyright (C) 1996-2005, 2006 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.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
- Contact: cacao@complang.tuwien.ac.at
+ Contact: cacao@cacaojvm.org
Authors: Andreas Krall
Reinhard Grafl
Changes: Christian Thalinger
- $Id: asmpart.S 2525 2005-05-24 10:28:20Z twisti $
+ $Id: asmpart.S 4357 2006-01-22 23:33:38Z twisti $
*/
-#if defined(__LINUX__)
-# include <asm/ppc_asm.h>
-#endif
-
#include "config.h"
-#include "vm/jit/powerpc/offsets.h"
-#include "vm/jit/powerpc/asmoffsets.h"
-
-
-#if defined(__DARWIN__)
-
-#define fr0 f0
-#define fr1 f1
-#define fr2 f2
-#define fr3 f3
-#define fr4 f4
-#define fr5 f5
-#define fr6 f6
-#define fr7 f7
-#define fr8 f8
-#define fr9 f9
-#define fr10 f10
-#define fr11 f11
-#define fr12 f12
-#define fr13 f13
-#define fr14 f14
-#define fr15 f15
-#define fr16 f16
-#define fr17 f17
-#define fr18 f18
-#define fr19 f19
-#define fr20 f20
-#define fr21 f21
-#define fr22 f22
-#define fr23 f23
-#define fr24 f24
-#define fr25 f25
-#define fr26 f26
-#define fr27 f27
-#define fr28 f28
-#define fr29 f29
-#define fr30 f30
-#define fr31 f31
-
-#endif /* defined(__DARWIN__) */
-
-
-/* register defines ***********************************************************/
-
-#define sp r1
-
-#define a0 r3
-#define a1 r4
-#define a2 r5
-#define a3 r6
-#define a4 r7
-#define a5 r8
-#define a6 r9
-#define a7 r10
-
-#define pv r13
-
-#define s0 r14
-#define s1 r15
-
-#define t0 r16
-#define t1 r17
-#define t2 r18
-#define t3 r19
-#define t4 r20
-#define t5 r21
-#define t6 r22
-#define t7 r23
-
-#define s2 r24
-#define s3 r25
-#define s4 r26
-#define s5 r27
-#define s6 r28
-#define s7 r29
-#define s8 r30
-#define s9 r31
-
-#define v0 a0
-#define v1 a1
-
-#define itmp1 r11
-#define itmp2 r12
-#define itmp3 r0
-
-#define xptr itmp1
-#define xpc itmp2
-
-#define mptr r12
-#define mptrn 12
-
-
-#define fa0 fr1
-#define fa1 fr2
-#define fa2 fr3
-#define fa3 fr4
-#define fa4 fr5
-#define fa5 fr6
-#define fa6 fr7
-
-#define fa7 fr8
-#define fa8 fr9
-#define fa9 fr10
-#define fa10 fr11
-#define fa11 fr12
-#define fa12 fr13
-
-#define fs0 fr14
-#define fs1 fr15
-
-#define ft0 fr18
-#define ft1 fr19
-#define ft2 fr20
-#define ft3 fr21
-#define ft4 fr22
-#define ft5 fr23
-
-#define fs2 fr24
-#define fs3 fr25
-#define fs4 fr26
-#define fs5 fr27
-#define fs6 fr28
-#define fs7 fr29
-#define fs8 fr30
-#define fs9 fr31
-
-#define fv0 fa0
-
-
-/* save and restore macros ****************************************************/
-
-#define SAVE_ARGUMENT_REGISTERS(off) \
- stw a0,(0+(off))*4(sp); \
- stw a1,(1+(off))*4(sp); \
- stw a2,(2+(off))*4(sp); \
- stw a3,(3+(off))*4(sp); \
- stw a4,(4+(off))*4(sp); \
- stw a5,(5+(off))*4(sp); \
- stw a6,(6+(off))*4(sp); \
- stw a7,(7+(off))*4(sp); \
- \
- stfd fa0,(8+(off))*4)(sp); \
- stfd fa1,(10+(off))*4)(sp); \
- stfd fa2,(12+(off))*4)(sp); \
- stfd fa3,(14+(off))*4)(sp); \
- stfd fa4,(16+(off))*4)(sp); \
- stfd fa5,(18+(off))*4)(sp); \
- stfd fa6,(20+(off))*4)(sp); \
- stfd fa7,(22+(off))*4)(sp); \
- stfd fa8,(24+(off))*4)(sp); \
- stfd fa9,(26+(off))*4)(sp); \
- stfd fa10,(28+(off))*4)(sp); \
- stfd fa11,(30+(off))*4)(sp); \
- stfd fa12,(32+(off))*4)(sp);
-
-#define RESTORE_ARGUMENT_REGISTERS(off) \
- lwz a0,(0+(off))*4(sp); \
- lwz a1,(1+(off))*4(sp); \
- lwz a2,(2+(off))*4(sp); \
- lwz a3,(3+(off))*4(sp); \
- lwz a4,(4+(off))*4(sp); \
- lwz a5,(5+(off))*4(sp); \
- lwz a6,(6+(off))*4(sp); \
- lwz a7,(7+(off))*4(sp); \
- \
- lfd fa0,(8+(off))*4)(sp); \
- lfd fa1,(10+(off))*4)(sp); \
- lfd fa2,(12+(off))*4)(sp); \
- lfd fa3,(14+(off))*4)(sp); \
- lfd fa4,(16+(off))*4)(sp); \
- lfd fa5,(18+(off))*4)(sp); \
- lfd fa6,(20+(off))*4)(sp); \
- lfd fa7,(22+(off))*4)(sp); \
- lfd fa8,(24+(off))*4)(sp); \
- lfd fa9,(26+(off))*4)(sp); \
- lfd fa10,(28+(off))*4)(sp); \
- lfd fa11,(30+(off))*4)(sp); \
- lfd fa12,(32+(off))*4)(sp);
-
-
-#if defined(__DARWIN__)
-
-/* Defines for darwin's old gnu assembler *************************************/
-
-/* internal defines ***********************************************************/
-
-#define asm_calljavafunction _asm_calljavafunction
-#define asm_calljavafunction_int _asm_calljavafunction_int
-
-#define asm_calljavafunction2 _asm_calljavafunction2
-#define asm_calljavafunction2int _asm_calljavafunction2int
-#define asm_calljavafunction2long _asm_calljavafunction2long
-#define asm_calljavafunction2float _asm_calljavafunction2float
-#define asm_calljavafunction2double _asm_calljavafunction2double
-
-#define asm_call_jit_compiler _asm_call_jit_compiler
-
-#define asm_handle_nat_exception _asm_handle_nat_exception
-#define asm_handle_exception _asm_handle_exception
-#define asm_handle_nullptr_exception _asm_handle_nullptr_exception
-#define asm_wrapper_patcher _asm_wrapper_patcher
+#include "md-abi.h"
+#include "md-asm.h"
-#define asm_builtin_arraycheckcast _asm_builtin_arraycheckcast
-#define asm_builtin_aastore _asm_builtin_aastore
-
-#define asm_builtin_monitorenter _asm_builtin_monitorenter
-#define asm_builtin_monitorexit _asm_builtin_monitorexit
-
-#define asm_builtin_idiv _asm_builtin_idiv
-#define asm_builtin_irem _asm_builtin_irem
-#define asm_builtin_ldiv _asm_builtin_ldiv
-#define asm_builtin_lrem _asm_builtin_lrem
-
-#define asm_cacheflush _asm_cacheflush
-#define asm_initialize_thread_stack _asm_initialize_thread_stack
-#define asm_perform_threadswitch _asm_perform_threadswitch
-#define asm_switchstackandcall _asm_switchstackandcall
-#define asm_criticalsections _asm_criticalsections
-#define asm_getclassvalues_atomic _asm_getclassvalues_atomic
-
-
-/* external defines ***********************************************************/
-
-#define builtin_asm_get_exceptionptrptr _builtin_asm_get_exceptionptrptr
-#define builtin_canstore _builtin_canstore
-#define builtin_arraycheckcast _builtin_arraycheckcast
-#define builtin_ldiv _builtin_ldiv
-#define builtin_lrem _builtin_lrem
-
-#if defined(USE_THREADS)
-#define builtin_monitorenter _builtin_monitorenter
-#define builtin_monitorexit _builtin_monitorexit
-#endif
-
-#define builtin_throw_exception _builtin_throw_exception
-#define builtin_trace_exception _builtin_trace_exception
-#define initialize_class _initialize_class
-#define link_class _link_class
-#define load_class_bootstrap _load_class_bootstrap
-#define jit_compile _jit_compile
-#define new_arithmeticexception _new_arithmeticexception
-#define new_arrayindexoutofboundsexception _new_arrayindexoutofboundsexception
-#define new_arraystoreexception _new_arraystoreexception
-#define new_classcastexception _new_classcastexception
-#define new_nullpointerexception _new_nullpointerexception
-
-#if !defined(USE_THREADS) || !defined(NATIVE_THREADS)
-#if 0
-#define _exceptionptr __exceptionptr
-#endif
-
-_exceptionptr:
- .globl __exceptionptr
-#endif
-
-#endif /* defined(__DARWIN__) */
+#include "vm/jit/abi.h"
+#include "vm/jit/methodheader.h"
+#include "vm/jit/powerpc/offsets.h"
.text
.globl asm_handle_nat_exception
.globl asm_handle_exception
- .globl asm_handle_nullptr_exception
.globl asm_wrapper_patcher
- .globl asm_builtin_arraycheckcast
- .globl asm_builtin_aastore
-
-#if defined(USE_THREADS)
- .globl asm_builtin_monitorenter
- .globl asm_builtin_monitorexit
-#endif
-
- .globl asm_builtin_idiv
- .globl asm_builtin_irem
- .globl asm_builtin_ldiv
- .globl asm_builtin_lrem
-
.globl asm_cacheflush
.globl asm_initialize_thread_stack
.globl asm_perform_threadswitch
* This functions calls the JIT-compiler which eventually translates the *
* method into machine code. *
* *
-* C-prototype: *
+* C-prototype: *
* javaobject_header *asm_calljavamethod (methodinfo *m, *
-* void *arg1, void *arg2, void *arg3, void *arg4); *
+* void *arg1, void *arg2, void *arg3, void *arg4); *
* *
*******************************************************************************/
.align 2
- .long 0 /* catch type all */
+ .long 0 /* catch type all */
.long calljava_xhandler /* handler pc */
.long calljava_xhandler /* end pc */
.long asm_calljavafunction /* start pc */
.long 1 /* extable size */
+ .long 0 /* line number table start */
+ .long 0 /* line number table size */
.long 0 /* fltsave */
.long 0 /* intsave */
.long 0 /* isleaf */
.long 0 /* IsSync */
- .long 24 /* frame size */
+ .long 0 /* frame size */
.long 0 /* method pointer (pointer to name) */
- .long 0 /* padding */
asm_calljavafunction:
asm_calljavafunction_int:
mflr r0
- stw r31,-4(r1)
-/* stw r30,-8(r1)*/
- stw pv,-12(r1)
- stw r0,8(r1)
- stwu r1,-148(r1)
+ stw r0,LA_LR_OFFSET(r1)
+ stwu r1,-40*4(r1)
- bl 0f
-0:
- mflr r31
-
- stw r16,40(r1)
- stw r17,44(r1)
- stw r18,48(r1)
- stw r19,52(r1)
- stw r20,56(r1)
- stw r21,60(r1)
- stw r22,64(r1)
- stw r23,68(r1)
- stfd fr16,72(r1)
- stfd fr17,80(r1)
- stfd fr18,88(r1)
- stfd fr19,96(r1)
- stfd fr20,104(r1)
- stfd fr21,112(r1)
- stfd fr22,120(r1)
- stfd fr23,128(r1)
-
- stw r3,36(r1)
+#if defined(__DARWIN__)
+ stw itmp1,10*4(sp) /* register r11 is callee saved */
+#endif
+ stw pv,11*4(sp) /* save PV register */
+
+ stw itmp3,12*4(sp) /* registers r14-r31 are callee saved */
+ stfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
+ stfd ftmp2,16*4(sp)
+
+#if defined(__DARWIN__)
+ stw t1,18*4(r1)
+ stw t2,19*4(r1)
+ stw t3,20*4(r1)
+ stw t4,21*4(r1)
+ stw t5,22*4(r1)
+ stw t6,23*4(r1)
+ stw t7,24*4(r1)
+
+ stfd ft0,26*4(r1)
+ stfd ft1,28*4(r1)
+ stfd ft2,30*4(r1)
+ stfd ft3,32*4(r1)
+ stfd ft4,34*4(r1)
+ stfd ft5,36*4(r1)
+#else
+ SAVE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
+#endif
+
+ stw a0,36(r1)
addi itmp1,r1,36
- mr r3,r4
- mr r4,r5
- mr r5,r6
- mr r6,r7
+ mr a0,a1
+ mr a1,a2
+ mr a2,a3
+ mr a3,a4
#if defined(__DARWIN__)
-/* addis mptr,r31,ha16(_asm_call_jit_compiler-0b)*/
- addi mptr,r31,lo16(asm_call_jit_compiler-0b)
+ lis mptr,ha16(asm_call_jit_compiler)
+ addi mptr,mptr,lo16(asm_call_jit_compiler)
#else
- addi mptr,r31,(asm_call_jit_compiler-0b)@l
+ lis mptr,asm_call_jit_compiler@ha
+ addi mptr,mptr,asm_call_jit_compiler@l
#endif
stw mptr,32(r1)
addi mptr,r1,28
addi pv,itmp1,(asm_calljavafunction-1b)@l
#endif
-calljava_regrestore:
- lwz r16,40(r1)
- lwz r17,44(r1)
- lwz r18,48(r1)
- lwz r19,52(r1)
- lwz r20,56(r1)
- lwz r21,60(r1)
- lwz r22,64(r1)
- lwz r23,68(r1)
- lfd fr16,72(r1)
- lfd fr17,80(r1)
- lfd fr18,88(r1)
- lfd fr19,96(r1)
- lfd fr20,104(r1)
- lfd fr21,112(r1)
- lfd fr22,120(r1)
- lfd fr23,128(r1)
-
- lwz r0,148+8(r1)
+L_asm_calljavafunction_return:
+#if defined(__DARWIN__)
+ lwz itmp1,10*4(sp) /* register r11 is callee saved */
+#endif
+ lwz pv,11*4(sp) /* save PV register */
+
+ lwz itmp3,12*4(sp)
+ lfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
+ lfd ftmp2,16*4(sp)
+
+#if defined(__DARWIN__)
+ lwz t1,18*4(r1)
+ lwz t2,19*4(r1)
+ lwz t3,20*4(r1)
+ lwz t4,21*4(r1)
+ lwz t5,22*4(r1)
+ lwz t6,23*4(r1)
+ lwz t7,24*4(r1)
+
+ lfd ft0,26*4(r1)
+ lfd ft1,28*4(r1)
+ lfd ft2,30*4(r1)
+ lfd ft3,32*4(r1)
+ lfd ft4,34*4(r1)
+ lfd ft5,36*4(r1)
+#else
+ RESTORE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
+#endif
+
+ lwz r0,40*4+LA_LR_OFFSET(r1)
mtlr r0
- addi r1,r1,148
- lwz pv,-12(r1)
-/* lwz r30,-8(r1)*/
- lwz r31,-4(r1)
+ addi r1,r1,40*4
blr
calljava_xhandler:
- mr r3,itmp1
+ mr a0,itmp1
bl builtin_throw_exception
- b calljava_regrestore
+ li v0,0 /* return NULL */
+ b L_asm_calljavafunction_return
.long calljava_xhandler2 /* end pc */
.long asm_calljavafunction2 /* start pc */
.long 1 /* extable size */
+ .long 0 /* line number table start */
+ .long 0 /* line number table size */
.long 0 /* fltsave */
.long 0 /* intsave */
.long 0 /* isleaf */
.long 0 /* IsSync */
- .long 24 /* frame size */
+ .long 0 /* frame size */
.long 0 /* method pointer (pointer to name) */
- .long 0 /* padding */
asm_calljavafunction2:
asm_calljavafunction2int:
asm_calljavafunction2float:
asm_calljavafunction2double:
mflr r0
- stw r31,-4(r1)
-/* stw r30,-8(r1)*/
- stw pv,-12(r1)
- stw r0,8(r1)
- stwu r1,-148(r1)
- bl 0f
-0:
- mflr r31
-
- stw r16,40(r1)
- stw r17,44(r1)
- stw r18,48(r1)
- stw r19,52(r1)
- stw r20,56(r1)
- stw r21,60(r1)
- stw r22,64(r1)
- stw r23,68(r1)
- stfd fr16,72(r1)
- stfd fr17,80(r1)
- stfd fr18,88(r1)
- stfd fr19,96(r1)
- stfd fr20,104(r1)
- stfd fr21,112(r1)
- stfd fr22,120(r1)
- stfd fr23,128(r1)
+ stw r0,LA_LR_OFFSET(r1)
+ stwu r1,-40*4(r1)
+
+#if defined(__DARWIN__)
+ stw itmp1,10*4(sp) /* register r11 is callee saved */
+#endif
+ stw pv,11*4(sp) /* save PV register */
+
+ stw itmp3,12*4(sp) /* registers r14-r31 are callee saved */
+ stfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
+ stfd ftmp2,16*4(sp)
+
+#if defined(__DARWIN__)
+ stw t1,18*4(r1)
+ stw t2,19*4(r1)
+ stw t3,20*4(r1)
+ stw t4,21*4(r1)
+ stw t5,22*4(r1)
+ stw t6,23*4(r1)
+ stw t7,24*4(r1)
+
+ stfd ft0,26*4(r1)
+ stfd ft1,28*4(r1)
+ stfd ft2,30*4(r1)
+ stfd ft3,32*4(r1)
+ stfd ft4,34*4(r1)
+ stfd ft5,36*4(r1)
+#else
+ SAVE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
+#endif
stw r3,36(r1) /* save method pointer for compiler */
mr itmp1,r6 /* pointer to arg block */
mr itmp2,r4 /* arg count */
- mr. itmp2,itmp2
- ble calljava_argsloaded
+ addi itmp1,itmp1,-sizejniblock /* initialize pointer (smaller code) */
+ addi itmp2,itmp2,1 /* initialize argument count */
+ li r17,0 /* initialize integer argument counter */
+ li r18,0 /* initialize float argument counter */
- addi itmp2,itmp2,-1
- lwz r3,offjniitem+4(itmp1)
+L_register_copy:
+ addi itmp1,itmp1,sizejniblock /* goto next argument block */
+ addi itmp2,itmp2,-1 /* argument count - 1 */
mr. itmp2,itmp2
- ble calljava_argsloaded
+ beq L_register_copy_done
- addi itmp2,itmp2,-1
- lwz r4,offjniitem+sizejniblock*1+4(itmp1)
- mr. itmp2,itmp2
- ble calljava_argsloaded
- addi itmp2,itmp2,-1
-
- addi itmp2,itmp2,-1
- lwz r5,offjniitem+sizejniblock*2+4(itmp1)
- mr. itmp2,itmp2
- ble calljava_argsloaded
- addi itmp2,itmp2,-1
-
- addi itmp2,itmp2,-1
- lwz r6,offjniitem+sizejniblock*3+4(itmp1)
- mr. itmp2,itmp2
- ble calljava_argsloaded
- addi itmp2,itmp2,-1
-
-calljava_argsloaded:
+ lwz itmp3,offjniitemtype+4(itmp1)
+ andi. r0,itmp3,0x0002 /* is this a float/double type? */
+ bne L_register_handle_float
+
+ cmpwi r17,INT_ARG_CNT /* are we out of integer argument */
+ beq L_register_copy /* registers? yes, next loop */
+
+ andi. r0,itmp3,0x0001 /* is this a long type? */
+ bne L_register_handle_long
+
+L_register_handle_int:
+#if defined(__DARWIN__)
+ lis itmp3,ha16(jumptable_int)
+ addi itmp3,itmp3,lo16(jumptable_int)
+#else
+ lis itmp3,jumptable_int@ha
+ addi itmp3,itmp3,jumptable_int@l
+#endif
+ slwi r19,r17,2 /* multiple of 4-bytes */
+ add itmp3,itmp3,r19 /* calculate address of jumptable */
+ lwz itmp3,0(itmp3) /* load function address */
+ addi r17,r17,1 /* integer argument counter + 1 */
+ mtctr itmp3
+ bctr
+
+L_register_handle_long:
+#if defined(__DARWIN__)
+ lis itmp3,ha16(jumptable_long)
+ addi itmp3,itmp3,lo16(jumptable_long)
+#else
+ lis itmp3,jumptable_long@ha
+ addi itmp3,itmp3,jumptable_long@l
+#endif
+ addi r19,r17,1 /* align to even numbers */
+ srwi r19,r19,1
+ slwi r19,r19,1
+ slwi r19,r19,2 /* multiple of 4-bytes */
+ add itmp3,itmp3,r19 /* calculate address of jumptable */
+ lwz itmp3,0(itmp3) /* load function address */
+ addi r17,r17,1 /* integer argument counter + 1 */
+ mtctr itmp3
+ bctr
+
+L_register_handle_float:
+L_register_copy_done:
+
+L_stack_copy_done:
addi itmp1,r1,36
#if defined(__DARWIN__)
-/* addis mptr,r31,ha16(_asm_call_jit_compiler-0b)*/
- addi mptr,r31,lo16(asm_call_jit_compiler-0b)
+ lis mptr,ha16(asm_call_jit_compiler)
+ addi mptr,mptr,lo16(asm_call_jit_compiler)
#else
- addi mptr,r31,(asm_call_jit_compiler-0b)@l
+ lis mptr,asm_call_jit_compiler@ha
+ addi mptr,mptr,asm_call_jit_compiler@l
#endif
stw mptr,32(r1)
addi mptr,r1,28
addi pv,itmp1,(asm_calljavafunction2-1b)@l
#endif
-calljava_regrestore2:
- lwz r16,40(r1)
- lwz r17,44(r1)
- lwz r18,48(r1)
- lwz r19,52(r1)
- lwz r20,56(r1)
- lwz r21,60(r1)
- lwz r22,64(r1)
- lwz r23,68(r1)
- lfd fr16,72(r1)
- lfd fr17,80(r1)
- lfd fr18,88(r1)
- lfd fr19,96(r1)
- lfd fr20,104(r1)
- lfd fr21,112(r1)
- lfd fr22,120(r1)
- lfd fr23,128(r1)
-
- lwz r0,148+8(r1)
+L_asm_calljavafunction2_return:
+#if defined(__DARWIN__)
+ lwz itmp1,10*4(sp) /* register r11 is callee saved */
+#endif
+ lwz pv,11*4(sp) /* save PV register */
+
+ lwz itmp3,12*4(sp)
+ lfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
+ lfd ftmp2,16*4(sp)
+
+#if defined(__DARWIN__)
+ lwz t1,18*4(r1)
+ lwz t2,19*4(r1)
+ lwz t3,20*4(r1)
+ lwz t4,21*4(r1)
+ lwz t5,22*4(r1)
+ lwz t6,23*4(r1)
+ lwz t7,24*4(r1)
+
+ lfd ft0,26*4(r1)
+ lfd ft1,28*4(r1)
+ lfd ft2,30*4(r1)
+ lfd ft3,32*4(r1)
+ lfd ft4,34*4(r1)
+ lfd ft5,36*4(r1)
+#else
+ RESTORE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
+#endif
+
+ lwz r0,40*4+LA_LR_OFFSET(r1)
mtlr r0
- addi r1,r1,148
- lwz pv,-12(r1)
-/* lwz r30,-8(r1)*/
- lwz r31,-4(r1)
+ addi r1,r1,40*4
blr
calljava_xhandler2:
mr r3,itmp1
bl builtin_throw_exception
- b calljava_regrestore2
+ li v0,0 /* return NULL */
+ b L_asm_calljavafunction2_return
+
+
+jumptable_int:
+ .long L_handle_a0
+ .long L_handle_a1
+ .long L_handle_a2
+ .long L_handle_a3
+ .long L_handle_a4
+ .long L_handle_a5
+ .long L_handle_a6
+ .long L_handle_a7
+
+L_handle_a0:
+ lwz a0,offjniitem+4(itmp1)
+ b L_register_copy
+L_handle_a1:
+ lwz a1,offjniitem+4(itmp1)
+ b L_register_copy
+L_handle_a2:
+ lwz a2,offjniitem+4(itmp1)
+ b L_register_copy
+L_handle_a3:
+ lwz a3,offjniitem+4(itmp1)
+ b L_register_copy
+L_handle_a4:
+ lwz a4,offjniitem+4(itmp1)
+ b L_register_copy
+L_handle_a5:
+ lwz a5,offjniitem+4(itmp1)
+ b L_register_copy
+L_handle_a6:
+ lwz a6,offjniitem+4(itmp1)
+ b L_register_copy
+L_handle_a7:
+ lwz a7,offjniitem+4(itmp1)
+ b L_register_copy
+
+
+jumptable_long:
+#if defined(__DARWIN__)
+#else
+ /* we have two entries here, so we get the even argument register
+ alignment for linux */
+
+ .long L_handle_a0_a1
+ .long 0
+ .long L_handle_a2_a3
+ .long 0
+ .long L_handle_a4_a5
+ .long 0
+ .long L_handle_a6_a7
+ .long 0
+#endif
+
+L_handle_a0_a1:
+ lwz a0,offjniitem+0(itmp1)
+ lwz a1,offjniitem+4(itmp1)
+ b L_register_copy
+L_handle_a2_a3:
+ lwz a2,offjniitem+0(itmp1)
+ lwz a3,offjniitem+4(itmp1)
+ b L_register_copy
+L_handle_a4_a5:
+ lwz a4,offjniitem+0(itmp1)
+ lwz a5,offjniitem+4(itmp1)
+ b L_register_copy
+L_handle_a6_a7:
+ lwz a6,offjniitem+0(itmp1)
+ lwz a7,offjniitem+4(itmp1)
+ b L_register_copy
+
+/* asm_call_jit_compiler *******************************************************
+
+ Invokes the compiler for untranslated JavaVM methods.
+
+*******************************************************************************/
asm_call_jit_compiler:
- stw itmp1,-8(r1)
- mflr itmp1
- stw r31,-4(r1)
- stw r29,-12(r1)
- stw itmp1,8(r1)
- stwu r1,-176(r1)
- mr r31,pv
+ mflr r0
+ stw r0,LA_LR_OFFSET(r1) /* save return address */
+ stwu r1,-((LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo)(r1)
+ stw itmp1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 1*4)(r1)
+ mr itmp1,r0 /* save return address to other reg. */
lwz itmp3,-12(itmp1)
srwi itmp3,itmp3,16
andi. itmp3,itmp3,31
add mptr,mptr,itmp3
noregchange:
- lwz itmp1,168(r1)
- mr r29,mptr
- stw r3,28(r1)
- stw r4,32(r1)
- stw r5,36(r1)
- stw r6,40(r1)
- stw r7,44(r1)
- stw r8,48(r1)
- stw r9,52(r1)
- stfd fr1,56(r1)
- stfd fr2,64(r1)
- stfd fr3,72(r1)
- stfd fr4,80(r1)
- stfd fr5,88(r1)
- stfd fr6,96(r1)
- stfd fr7,104(r1)
- stfd fr8,112(r1)
- stfd fr9,120(r1)
- stfd fr10,128(r1)
- stfd fr11,136(r1)
- stfd fr12,144(r1)
- stfd fr13,152(r1)
- stw r10,160(r1)
-
- lwz r3,0(itmp1)
- bl jit_compile
- mr pv,r3
-
- mr mptr,r29
- lwz r3,28(r1)
- lwz r4,32(r1)
- lwz r5,36(r1)
- lwz r6,40(r1)
- lwz r7,44(r1)
- lwz r8,48(r1)
- lwz r9,52(r1)
- lfd fr1,56(r1)
- lfd fr2,64(r1)
- lfd fr3,72(r1)
- lfd fr4,80(r1)
- lfd fr5,88(r1)
- lfd fr6,96(r1)
- lfd fr7,104(r1)
- lfd fr8,112(r1)
- lfd fr9,120(r1)
- lfd fr10,128(r1)
- lfd fr11,136(r1)
- lfd fr12,144(r1)
- lfd fr13,152(r1)
- lwz r10,160(r1)
-
- lwz itmp1,176+8(r1)
+ stw mptr,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 2*4)(r1)
+
+#if defined(__DARWIN__)
+ stw a0,(LA_WORD_SIZE+5+0)*4(r1)
+ stw a1,(LA_WORD_SIZE+5+1)*4(r1)
+ stw a2,(LA_WORD_SIZE+5+2)*4(r1)
+ stw a3,(LA_WORD_SIZE+5+3)*4(r1)
+ stw a4,(LA_WORD_SIZE+5+4)*4(r1)
+ stw a5,(LA_WORD_SIZE+5+5)*4(r1)
+ stw a6,(LA_WORD_SIZE+5+6)*4(r1)
+ stw a7,(LA_WORD_SIZE+5+7)*4(r1)
+
+ stfd fa0,(LA_WORD_SIZE+5+8)*4(r1)
+ stfd fa1,(LA_WORD_SIZE+5+10)*4(r1)
+ stfd fa2,(LA_WORD_SIZE+5+12)*4(r1)
+ stfd fa3,(LA_WORD_SIZE+5+14)*4(r1)
+ stfd fa4,(LA_WORD_SIZE+5+16)*4(r1)
+ stfd fa5,(LA_WORD_SIZE+5+18)*4(r1)
+ stfd fa6,(LA_WORD_SIZE+5+20)*4(r1)
+ stfd fa7,(LA_WORD_SIZE+5+22)*4(r1)
+ stfd fa8,(LA_WORD_SIZE+5+24)*4(r1)
+ stfd fa9,(LA_WORD_SIZE+5+26)*4(r1)
+ stfd fa10,(LA_WORD_SIZE+5+28)*4(r1)
+ stfd fa11,(LA_WORD_SIZE+5+30)*4(r1)
+ stfd fa12,(LA_WORD_SIZE+5+32)*4(r1)
+#else
+ SAVE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1)
+#endif
+
+ addi a0,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)
+ li a1,0 /* we don't have pv handy */
+ addi a2,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo
+ lwz a3,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo+LA_LR_OFFSET(sp)
+ mr a4,a3 /* xpc is equal to ra */
+ bl stacktrace_create_extern_stackframeinfo
+
+ lwz itmp1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 1*4)(r1)
+ lwz a0,0(itmp1)
+ bl jit_compile /* compile the Java method */
+ mr pv,r3 /* move address to pv register */
+
+ addi a0,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)
+ bl stacktrace_remove_stackframeinfo
+
+#if defined(__DARWIN__)
+ lwz a0,(LA_WORD_SIZE+5+0)*4(r1)
+ lwz a1,(LA_WORD_SIZE+5+1)*4(r1)
+ lwz a2,(LA_WORD_SIZE+5+2)*4(r1)
+ lwz a3,(LA_WORD_SIZE+5+3)*4(r1)
+ lwz a4,(LA_WORD_SIZE+5+4)*4(r1)
+ lwz a5,(LA_WORD_SIZE+5+5)*4(r1)
+ lwz a6,(LA_WORD_SIZE+5+6)*4(r1)
+ lwz a7,(LA_WORD_SIZE+5+7)*4(r1)
+
+ lfd fa0,(LA_WORD_SIZE+5+8)*4(r1)
+ lfd fa1,(LA_WORD_SIZE+5+10)*4(r1)
+ lfd fa2,(LA_WORD_SIZE+5+12)*4(r1)
+ lfd fa3,(LA_WORD_SIZE+5+14)*4(r1)
+ lfd fa4,(LA_WORD_SIZE+5+16)*4(r1)
+ lfd fa5,(LA_WORD_SIZE+5+18)*4(r1)
+ lfd fa6,(LA_WORD_SIZE+5+20)*4(r1)
+ lfd fa7,(LA_WORD_SIZE+5+22)*4(r1)
+ lfd fa8,(LA_WORD_SIZE+5+24)*4(r1)
+ lfd fa9,(LA_WORD_SIZE+5+26)*4(r1)
+ lfd fa10,(LA_WORD_SIZE+5+28)*4(r1)
+ lfd fa11,(LA_WORD_SIZE+5+30)*4(r1)
+ lfd fa12,(LA_WORD_SIZE+5+32)*4(r1)
+#else
+ RESTORE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1)
+#endif
+
+ lwz mptr,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 2*4)(r1)
+
+ lwz itmp1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo+LA_LR_OFFSET(r1)
+ mtlr itmp1
+ addi r1,r1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo
+
+ mr. pv,pv /* test for exception */
+ beq L_asm_call_jit_compiler_exception
+
lwz itmp3,-12(itmp1)
extsh itmp3,itmp3
add mptr,mptr,itmp3
- stw pv,0(mptr)
+ stw pv,0(mptr) /* store method address */
- mtctr pv
+ mtctr pv /* move method address to control reg */
+ bctr /* and call the Java method */
- lwz r0,176+8(r1)
- mtlr r0
- addi r1,r1,176
- lwz r29,-12(r1)
-/* lwz pv,-8(r1)*/
- lwz r31,-4(r1)
- bctr
+L_asm_call_jit_compiler_exception:
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+ mflr r0
+ stw r0,LA_LR_OFFSET(sp)
+ stwu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
+ bl builtin_asm_get_exceptionptrptr
+ lwz r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
+ mtlr r0
+ addi sp,sp,LA_SIZE_ALIGNED
+#else
+# if defined(__DARWIN__)
+ lwz v0,lo16(_no_threads_exceptionptr-0b)(pv)
+# else
+ lis v0,_no_threads_exceptionptr@ha
+ addi v0,v0,_no_threads_exceptionptr@l
+# endif
+#endif
+ lwz xptr,0(v0) /* get the exception pointer */
+ li itmp3,0
+ stw itmp3,0(v0) /* clear the exception pointer */
+ mflr xpc
+ addi xpc,xpc,-4
+ b asm_handle_nat_exception
-/***************** function asm_handle_nullptr_exception ***********************
-* *
-* This behaves the same as asm_handle_exception but calls *
-* new_nullpointerexception first *
-* *
-*******************************************************************************/
-
-asm_handle_nullptr_exception:
- stwu r1,-32(r1)
- stw xpc,24(r1)
- bl new_nullpointerexception
- lwz xpc,24(r1)
- addi r1,r1,32
- mr xptr,r3
- b asm_handle_exception
/********************* function asm_handle_exception ***************************
* *
add pv,pv,itmp3
asm_handle_exception:
- addi r1,r1,-18*4
- stw r0,0*4(r1)
- stw r2,1*4(r1)
- stw r3,2*4(r1)
- stw r4,3*4(r1)
- stw r5,4*4(r1)
- stw r6,5*4(r1)
- stw r7,6*4(r1)
- stw r8,7*4(r1)
- stw r9,8*4(r1)
- stw r10,9*4(r1)
- stw r16,10*4(r1)
- stw r17,11*4(r1)
- stw r18,12*4(r1)
- stw r19,13*4(r1)
- stw r20,14*4(r1)
- stw r21,15*4(r1)
- stw r22,16*4(r1)
- stw r23,17*4(r1)
-
- li r9,1
-ex_stack_loop:
- addi r1,r1,-4*4
- stw xptr,0*4(r1)
- stw xpc,1*4(r1)
- mflr xptr
- stw xptr,2*4(r1)
- stw r9,3*4(r1)
-
- lwz r3,0*4(r1) /* exception pointer */
- lwz r4,MethodPointer(pv) /* method pointer */
- mr r5,xpc /* exception pc */
-/* mr r6,r9 */
- li r6,0 /* line number */
- li r7,4 /* set no unwind flag */
-
- /* XXX no valid stack frame chaining here */
- addi r1,r1,-(24+5*4) /* 24 linkage area + 5 argument * 4 */
- bl builtin_trace_exception
- addi r1,r1,(24+5*4)
-
- lwz xptr,2*4(r1)
- mtlr xptr
- lwz xptr,0*4(r1) /* restore xptr */
- lwz xpc,1*4(r1)
- lwz r9,3*4(r1)
- addi r1,r1,4*4
-
- lwz r3,ExTableSize(pv) /* r3 = exception table size */
- mr. r3,r3 /* if empty table skip */
- beq empty_table
-
- addi r4,pv,ExTableStart /* r4 = start of exception table */
-
-ex_table_loop:
- lwz r5,ExStartPC(r4) /* r5 = exception start pc */
- cmplw r5,xpc /* (startpc <= xpc) */
- bgt ex_table_cont
- lwz r5,ExEndPC(r4) /* r5 = exception end pc */
- cmplw xpc,r5 /* (xpc < endpc) */
- bge ex_table_cont
- lwz r7,ExCatchType(r4) /* r7 = exception catch type */
- mr. r7,r7
- beq ex_handle_it
-
- lwz itmp3,offclassloaded(r7)
- mr. itmp3,itmp3
- bne L_class_loaded
-
- /* XXX no valid stack frame chaining here */
- addi r1,r1,-16*4 /* allocate stack */
- stw r3,7*4(r1) /* save used registers */
- stw r4,8*4(r1) /* 6*4 (linkage) + 1*4 (arg1) + 7*4 (save) */
- stw r9,9*4(r1)
- stw xptr,10*4(r1)
- stw xpc,11*4(r1)
- mflr xptr
- stw xptr,12*4(r1)
- stw r7,13*4(r1)
-
- mr r3,r7 /* arg1 = exceptionclass */
- bl load_class_bootstrap
-
- lwz r3,7*4(r1)
- lwz r4,8*4(r1)
- lwz r9,9*4(r1)
- lwz xptr,10*4(r1)
- lwz xpc,11*4(r1)
- lwz itmp3,12*4(r1)
- mtlr itmp3
- lwz r7,13*4(r1)
- addi r1,r1,16*4
-
-L_class_loaded:
- lwz itmp3,offclasslinked(r7)
- mr. itmp3,itmp3
- /* XXX no valid stack frame chaining here */
- addi r1,r1,-16*4 /* allocate stack */
- stw r7,13*4(r1)
- bne L_class_linked
-
- stw r3,7*4(r1) /* save used registers */
- stw r4,8*4(r1) /* 6*4 (linkage) + 1*4 (arg1) + 7*4 (save) */
- stw r9,9*4(r1)
- stw xptr,10*4(r1)
- stw xpc,11*4(r1)
- mflr xptr
- stw xptr,12*4(r1)
-
- mr r3,r7 /* arg1 = exceptionclass */
- bl link_class
-
- lwz r3,7*4(r1)
- lwz r4,8*4(r1)
- lwz r9,9*4(r1)
- lwz xptr,10*4(r1)
- lwz xpc,11*4(r1)
- lwz itmp3,12*4(r1)
- mtlr itmp3
-
-L_class_linked:
-_crit_restart1:
- lwz r7,13*4(r1)
-_crit_begin1:
- lwz r6,offobjvftbl(xptr) /* r6 = vftblptr(xptr) */
- lwz r7,offclassvftbl(r7) /* r7 = vftblptr(catchtype) class (not obj) */
- lwz r6,offbaseval(r6) /* r6 = baseval(xptr) */
- lwz r8,offbaseval(r7) /* r8 = baseval(catchtype) */
- lwz r7,offdiffval(r7) /* r7 = diffval(catchtype) */
-_crit_end1:
- subf r6,r8,r6 /* r6 = baseval(xptr) - baseval(catchtype) */
- cmplw r6,r7 /* xptr is instanceof catchtype */
- addi r1,r1,16*4
- bgt ex_table_cont /* if (false) continue */
-
-ex_handle_it:
- lwz xpc,ExHandlerPC(r4) /* xpc = exception handler pc */
- mr. r9,r9
- beq ex_jump
-
- lwz r0,0*4(r1)
- lwz r2,1*4(r1)
- lwz r3,2*4(r1)
- lwz r4,3*4(r1)
- lwz r5,4*4(r1)
- lwz r6,5*4(r1)
- lwz r7,6*4(r1)
- lwz r8,7*4(r1)
- lwz r9,8*4(r1)
- lwz r10,9*4(r1)
- lwz r16,10*4(r1)
- lwz r17,11*4(r1)
- lwz r18,12*4(r1)
- lwz r19,13*4(r1)
- lwz r20,14*4(r1)
- lwz r21,15*4(r1)
- lwz r22,16*4(r1)
- lwz r23,17*4(r1)
- addi r1,r1,18*4
-
-ex_jump:
- mtctr xpc
- bctr
+ addi sp,sp,-(ARG_CNT+TMP_CNT)*8 /* create maybe-leaf stackframe */
+
+#if defined(__DARWIN__)
+#else
+ SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */
+ SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */
+#endif
+
+ li a3,(ARG_CNT+TMP_CNT)*8 /* prepare a3 for handle_exception */
+ li a4,1 /* set maybe-leaf flag */
+
+L_asm_handle_exception_stack_loop:
+ addi sp,sp,-(LA_WORD_SIZE+4+5)*4 /* allocate stack */
+ stw xptr,LA_SIZE+4*4(sp) /* save exception pointer */
+ stw xpc,LA_SIZE+5*4(sp) /* save exception pc */
+ stw pv,LA_SIZE+6*4(sp) /* save data segment pointer */
+ mflr r0 /* save return address */
+ stw r0,LA_SIZE+5*4(sp)
+ add a3,a3,sp /* calculate Java sp into a3... */
+ addi a3,a3,(LA_WORD_SIZE+4+5)*4
+ stw a4,LA_SIZE+8*4(sp) /* save maybe-leaf flag */
+
+ mr a0,xptr /* pass exception pointer */
+ mr a1,xpc /* pass exception pc */
+ mr a2,pv /* pass data segment pointer */
+ /* a3 is still set */
+ bl exceptions_handle_exception
+
+ mr. v0,v0
+ beq L_asm_handle_exception_not_catched
+
+ mr xpc,v0 /* move handlerpc into xpc */
+ lwz xptr,LA_SIZE+4*4(sp) /* restore exception pointer */
+ lwz pv,LA_SIZE+6*4(sp) /* restore data segment pointer */
+ lwz r0,LA_SIZE+5*4(sp) /* restore return address */
+ mtlr r0
+ lwz a4,LA_SIZE+8*4(sp) /* get maybe-leaf flag */
+ addi sp,sp,(LA_WORD_SIZE+4+5)*4 /* free stack frame */
-ex_table_cont:
- addi r4,r4,ExEntrySize
- addic. r3,r3,-1
- bgt ex_table_loop
-
-empty_table:
- mr. r9,r9 /* if here the first time, then */
- beq ex_already_cleared
- addi r1,r1,18*4 /* deallocate stack and */
- li r9,0 /* clear the no unwind flag */
-ex_already_cleared:
- lwz r3,IsSync(pv)
- mr. r3,r3
- beq no_monitor_exit
-
-#if defined(USE_THREADS)
- add r3,r1,r3
- lwz r6,-4(r3)
-
- addi r1,r1,-6*4
- stw r3,0*4(r1)
- stw r4,1*4(r1)
- stw r9,2*4(r1)
- stw xptr,3*4(r1)
- stw xpc,4*4(r1)
- mflr xptr
- stw xptr,5*4(r1)
-
- mr r3,r6
- /* XXX no valid stack frame chaining here */
- addi r1,r1,-40
- bl builtin_monitorexit
- addi r1,r1,40
-
- lwz xptr,5*4(r1)
- mtlr xptr
- lwz r3,0*4(r1)
- lwz r4,1*4(r1)
- lwz r9,2*4(r1)
- lwz xptr,3*4(r1)
- lwz xpc,4*4(r1)
- addi r1,r1,6*4
+ mr. a4,a4
+ beq L_asm_handle_exception_no_leaf
+
+#if defined(__DARWIN__)
+#else
+ RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */
+ RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */
#endif
-no_monitor_exit:
- lwz r3,FrameSize(pv) /* r3 = frame size */
- add r1,r1,r3 /* unwind stack */
- mr r3,r1 /* r3 = pointer to save area */
- lwz r4,IsLeaf(pv) /* r4 = is leaf procedure */
- mr. r4,r4
- bne ex_no_restore /* if (leaf) skip */
- lwz r4,8(r3) /* restore ra */
- mtlr r4 /* t0-- */
-ex_no_restore:
- mflr r4 /* the new xpc is ra */
- mr xpc,r4
- lwz r4,IntSave(pv) /* r4 = saved int register count */
+ addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
+
+L_asm_handle_exception_no_leaf:
+ mtctr xpc /* jump to the handler */
+ bctr
+
+L_asm_handle_exception_not_catched:
+ lwz xptr,LA_SIZE+4*4(sp) /* restore exception pointer */
+ lwz pv,LA_SIZE+6*4(sp) /* restore data segment pointer */
+ lwz r0,LA_SIZE+5*4(sp) /* restore return address */
+ mtlr r0
+ lwz a4,LA_SIZE+8*4(sp) /* get maybe-leaf flag */
+ addi sp,sp,(LA_WORD_SIZE+4+5)*4 /* free stack frame */
+
+ mr. a4,a4
+ beq L_asm_handle_exception_no_leaf_stack
+
+ addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
+ li a4,0 /* clear the maybe-leaf flag */
+
+L_asm_handle_exception_no_leaf_stack:
+ lwz t0,FrameSize(pv) /* get frame size */
+ add t0,sp,t0 /* pointer to save area */
+
+ lwz t1,IsLeaf(pv) /* is leaf procedure */
+ mr. t1,t1
+ bne L_asm_handle_exception_no_ra_restore
+
+ lwz r0,LA_LR_OFFSET(t0) /* restore ra */
+ mtlr r0
+
+L_asm_handle_exception_no_ra_restore:
+ mflr xpc /* the new xpc is ra */
+ lwz t1,IntSave(pv) /* t1 = saved int register count */
bl ex_int1
ex_int1:
- mflr r5
+ mflr t2 /* t2 = current pc */
#if defined(__DARWIN__)
- addi r5,r5,lo16(ex_int2-ex_int1)
+ addi t2,t2,lo16(ex_int2-ex_int1)
#else
- addi r5,r5,(ex_int2-ex_int1)@l
+ addi t2,t2,(ex_int2-ex_int1)@l
#endif
- slwi r4,r4,2
- subf r5,r4,r5
- mtctr r5
+ slwi t1,t1,2 /* t1 = register count * 4 */
+ subf t2,t1,t2 /* t2 = IntSave - t1 */
+ mtctr t2
bctr
- lwz r14,-40(r3)
- lwz r15,-36(r3)
- lwz r24,-32(r3)
- lwz r25,-28(r3)
- lwz r26,-24(r3)
- lwz r27,-20(r3)
- lwz r28,-16(r3)
- lwz r29,-12(r3)
- lwz r30,-8(r3)
- lwz r31,-4(r3)
+
+ lwz s0,-10*4(t0)
+ lwz s1,-9*4(t0)
+ lwz s2,-8*4(t0)
+ lwz s3,-7*4(t0)
+ lwz s4,-6*4(t0)
+ lwz s5,-5*4(t0)
+ lwz s6,-4*4(t0)
+ lwz s7,-3*4(t0)
+ lwz s8,-2*4(t0)
+ lwz s9,-1*4(t0)
+
ex_int2:
- subf r3,r4,r3
+ subf t0,t1,t0 /* t0 = t0 - register count * 4 */
- lwz r4,FltSave(pv)
+ lwz t1,FltSave(pv)
bl ex_flt1
ex_flt1:
- mflr r5
+ mflr t2
#if defined(__DARWIN__)
- addi r5,r5,lo16(ex_flt2-ex_flt1)
+ addi t2,t2,lo16(ex_flt2-ex_flt1)
#else
- addi r5,r5,(ex_flt2-ex_flt1)@l
+ addi t2,t2,(ex_flt2-ex_flt1)@l
#endif
- slwi r4,r4,2
- subf r5,r4,r5
- mtctr r5
+ slwi t1,t1,2 /* t1 = register count * 4 */
+ subf t2,t1,t2 /* t2 = FltSave - t1 */
+ mtctr t2
bctr
- lfd fr14,-80(r3)
- lfd fr15,-72(r3)
- lfd fr24,-64(r3)
- lfd fr25,-56(r3)
- lfd fr26,-48(r3)
- lfd fr27,-40(r3)
- lfd fr28,-32(r3)
- lfd fr29,-24(r3)
- lfd fr30,-16(r3)
- lfd fr31,-8(r3)
+
+ lfd fs0,-10*8(t0)
+ lfd fs1,-9*8(t0)
+ lfd fs2,-8*8(t0)
+ lfd fs3,-7*8(t0)
+ lfd fs4,-6*8(t0)
+ lfd fs5,-5*8(t0)
+ lfd fs6,-4*8(t0)
+ lfd fs7,-3*8(t0)
+ lfd fs8,-2*8(t0)
+ lfd fs9,-1*8(t0)
+
ex_flt2:
+ lwz t0,FrameSize(pv) /* get frame size */
+ add sp,sp,t0 /* unwind stack */
+ li a3,0 /* prepare a3 for handle_exception */
+
mtlr xpc
lwz itmp3,4(xpc)
extsh itmp3,itmp3
lwz itmp3,8(xpc)
srwi itmp3,itmp3,16
cmpwi itmp3,0x3dad
- bne ex_stack_loop
+ bne L_asm_handle_exception_stack_loop
lwz itmp3,8(xpc)
slwi itmp3,itmp3,16
add pv,pv,itmp3
- b ex_stack_loop
+
+ b L_asm_handle_exception_stack_loop
/* asm_wrapper_patcher *********************************************************
XXX
Stack layout:
- 16 return address into JIT code (patch position)
- 12 pointer to virtual java_objectheader
- 8 machine code (which is patched back later)
- 4 unresolved class/method/field reference
- 0 patcher function pointer to call
+ 20 return address into JIT code (patch position)
+ 16 pointer to virtual java_objectheader
+ 12 machine code (which is patched back later)
+ 8 unresolved class/method/field reference
+ 4 data segment displacement from load instructions
+ 0 patcher function pointer to call (pv is saved here afterwards)
*******************************************************************************/
asm_wrapper_patcher:
- lwz itmp2,offclassinit(itmp1)
- mr. itmp2,itmp2
- bne L_is_initialized
+ mflr r0 /* get Java return address (leaf) */
+ stw r0,6*4(sp) /* store it in the stub stackframe */
+ /* keep stack 16-bytes aligned: 6+1+37 = 44 */
+ stwu sp,-(LA_SIZE+(5+58)*4+sizestackframeinfo)(sp)
- mflr r0
#if defined(__DARWIN__)
- stw r0,8(r1)
-#else
- stw r0,4(r1)
-#endif
- stwu r1,-(36*8)(r1) /* keep stack 16-bytes aligned */
-
-#if 1
- stw r3,4*8(r1) /* save argument registers */
- stw r4,5*8(r1) /* preserve linkage area (24 bytes) */
- stw r5,6*8(r1) /* and 4 bytes (better 8) for 1 argument */
- stw r6,7*8(r1)
- stw r7,8*8(r1)
- stw r8,9*8(r1)
- stw r9,10*8(r1)
- stw r10,11*8(r1)
-
- stfd fr1,12*8(r1)
- stfd fr2,13*8(r1)
- stfd fr3,14*8(r1)
- stfd fr4,15*8(r1)
- stfd fr5,16*8(r1)
- stfd fr6,17*8(r1)
- stfd fr7,18*8(r1)
- stfd fr8,19*8(r1)
- stfd fr9,20*8(r1)
- stfd fr10,21*8(r1)
- stfd fr11,22*8(r1)
- stfd fr12,23*8(r1)
- stfd fr13,24*8(r1)
+ stw a0,LA_SIZE+(5+0)*4(r1) /* save argument registers */
+ stw a1,LA_SIZE+(5+1)*4(r1) /* preserve linkage area (24 bytes) */
+ stw a2,LA_SIZE+(5+2)*4(r1) /* and 4 bytes for 4 argument */
+ stw a3,LA_SIZE+(5+3)*4(r1)
+ stw a4,LA_SIZE+(5+4)*4(r1)
+ stw a5,LA_SIZE+(5+5)*4(r1)
+ stw a6,LA_SIZE+(5+6)*4(r1)
+ stw a7,LA_SIZE+(5+7)*4(r1)
+
+ stfd fa0,LA_SIZE+(5+8)*4(sp)
+ stfd fa1,LA_SIZE+(5+10)*4(sp)
+ stfd fa2,LA_SIZE+(5+12)*4(sp)
+ stfd fa3,LA_SIZE+(5+14)*4(sp)
+ stfd fa4,LA_SIZE+(5+16)*4(sp)
+ stfd fa5,LA_SIZE+(5+18)*4(sp)
+ stfd fa6,LA_SIZE+(5+20)*4(sp)
+ stfd fa7,LA_SIZE+(5+22)*4(sp)
+ stfd fa8,LA_SIZE+(5+24)*4(sp)
+ stfd fa9,LA_SIZE+(5+26)*4(sp)
+ stfd fa10,LA_SIZE+(5+28)*4(sp)
+ stfd fa11,LA_SIZE+(5+30)*4(sp)
+ stfd fa12,LA_SIZE+(5+32)*4(sp)
+
+ stw t0,(LA_WORD_SIZE+5+33)*4(r1)
+ stw t1,(LA_WORD_SIZE+5+34)*4(r1)
+ stw t2,(LA_WORD_SIZE+5+35)*4(r1)
+ stw t3,(LA_WORD_SIZE+5+36)*4(r1)
+ stw t4,(LA_WORD_SIZE+5+37)*4(r1)
+ stw t5,(LA_WORD_SIZE+5+38)*4(r1)
+ stw t6,(LA_WORD_SIZE+5+39)*4(r1)
+ stw t7,(LA_WORD_SIZE+5+40)*4(r1)
+
+ stfd ft0,(LA_WORD_SIZE+5+42)*4(r1)
+ stfd ft1,(LA_WORD_SIZE+5+44)*4(r1)
+ stfd ft2,(LA_WORD_SIZE+5+46)*4(r1)
+ stfd ft3,(LA_WORD_SIZE+5+48)*4(r1)
+ stfd ft4,(LA_WORD_SIZE+5+50)*4(r1)
+ stfd ft5,(LA_WORD_SIZE+5+52)*4(r1)
#else
- SAVE_ARGUMENT_REGISTERS(6+1) /* save 8 int/13 float argument registers */
+ SAVE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1) /* save 8 int/8 float arguments */
+ SAVE_TEMPORARY_REGISTERS(LA_WORD_SIZE+1+24)
#endif
- stw r2,25*8(r1)
- stw r16,26*8(r1)
- stw r17,27*8(r1)
- stw r18,28*8(r1)
- stw r19,29*8(r1)
- stw r20,30*8(r1)
- stw r21,31*8(r1)
- stw r22,32*8(r1)
- stw r23,33*8(r1)
+ stw itmp1,LA_SIZE+(5+54)*4(sp)
+ stw itmp2,LA_SIZE+(5+55)*4(sp)
+ stw pv,LA_SIZE+(5+56)*4(sp)
+
+ addi a0,sp,LA_SIZE+(5+58)*4 /* create stackframe info */
+ mr a1,pv
+ addi a2,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
+ mr a3,r0 /* this is correct for leafs */
+ lwz a4,((5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo)(sp) /* pass xpc */
+ bl stacktrace_create_extern_stackframeinfo
+
+ addi a0,sp,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo /* pass sp */
+ lwz pv,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp) /* get function */
+ lwz itmp1,LA_SIZE+(5+56)*4(sp) /* move pv to position of fp */
+ stw itmp1,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
+ mtctr pv /* call the patcher function */
+ bctrl
+ stw v0,LA_SIZE+(5+57)*4(sp) /* save return value */
- stw pv,34*8(r1)
+ addi a0,sp,LA_SIZE+(5+58)*4
+ bl stacktrace_remove_stackframeinfo /* remove stackframe info */
- mr r3,itmp1
- bl initialize_class
- mr itmp1,r3 /* save return value in temp register */
-
-#if 1
- lwz r3,4*8(r1)
- lwz r4,5*8(r1)
- lwz r5,6*8(r1)
- lwz r6,7*8(r1)
- lwz r7,8*8(r1)
- lwz r8,9*8(r1)
- lwz r9,10*8(r1)
- lwz r10,11*8(r1)
-
- lfd fr1,12*8(r1)
- lfd fr2,13*8(r1)
- lfd fr3,14*8(r1)
- lfd fr4,15*8(r1)
- lfd fr5,16*8(r1)
- lfd fr6,17*8(r1)
- lfd fr7,18*8(r1)
- lfd fr8,19*8(r1)
- lfd fr9,20*8(r1)
- lfd fr10,21*8(r1)
- lfd fr11,22*8(r1)
- lfd fr12,23*8(r1)
- lfd fr13,24*8(r1)
+#if defined(__DARWIN__)
+ lwz a0,LA_SIZE+(5+0)*4(r1)
+ lwz a1,LA_SIZE+(5+1)*4(r1)
+ lwz a2,LA_SIZE+(5+2)*4(r1)
+ lwz a3,LA_SIZE+(5+3)*4(r1)
+ lwz a4,LA_SIZE+(5+4)*4(r1)
+ lwz a5,LA_SIZE+(5+5)*4(r1)
+ lwz a6,LA_SIZE+(5+6)*4(r1)
+ lwz a7,LA_SIZE+(5+7)*4(r1)
+
+ lfd fa0,LA_SIZE+(5+8)*4(sp)
+ lfd fa1,LA_SIZE+(5+10)*4(sp)
+ lfd fa2,LA_SIZE+(5+12)*4(sp)
+ lfd fa3,LA_SIZE+(5+14)*4(sp)
+ lfd fa4,LA_SIZE+(5+16)*4(sp)
+ lfd fa5,LA_SIZE+(5+18)*4(sp)
+ lfd fa6,LA_SIZE+(5+20)*4(sp)
+ lfd fa7,LA_SIZE+(5+22)*4(sp)
+ lfd fa8,LA_SIZE+(5+24)*4(sp)
+ lfd fa9,LA_SIZE+(5+26)*4(sp)
+ lfd fa10,LA_SIZE+(5+28)*4(sp)
+ lfd fa11,LA_SIZE+(5+30)*4(sp)
+ lfd fa12,LA_SIZE+(5+32)*4(sp)
+
+ lwz t0,(LA_WORD_SIZE+5+33)*4(r1)
+ lwz t1,(LA_WORD_SIZE+5+34)*4(r1)
+ lwz t2,(LA_WORD_SIZE+5+35)*4(r1)
+ lwz t3,(LA_WORD_SIZE+5+36)*4(r1)
+ lwz t4,(LA_WORD_SIZE+5+37)*4(r1)
+ lwz t5,(LA_WORD_SIZE+5+38)*4(r1)
+ lwz t6,(LA_WORD_SIZE+5+39)*4(r1)
+ lwz t7,(LA_WORD_SIZE+5+40)*4(r1)
+
+ lfd ft0,(LA_WORD_SIZE+5+42)*4(r1)
+ lfd ft1,(LA_WORD_SIZE+5+44)*4(r1)
+ lfd ft2,(LA_WORD_SIZE+5+46)*4(r1)
+ lfd ft3,(LA_WORD_SIZE+5+48)*4(r1)
+ lfd ft4,(LA_WORD_SIZE+5+50)*4(r1)
+ lfd ft5,(LA_WORD_SIZE+5+52)*4(r1)
#else
- RESTORE_ARGUMENT_REGISTERS(6+1)/* restore 8 int/13 float argument reg. */
+ RESTORE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1) /* restore 8 int/8 float args */
+ RESTORE_TEMPORARY_REGISTERS(LA_WORD_SIZE+1+24)
#endif
- lwz r2,25*8(r1)
- lwz r16,26*8(r1)
- lwz r17,27*8(r1)
- lwz r18,28*8(r1)
- lwz r19,29*8(r1)
- lwz r20,30*8(r1)
- lwz r21,31*8(r1)
- lwz r22,32*8(r1)
- lwz r23,33*8(r1)
+ lwz itmp1,LA_SIZE+(5+54)*4(sp)
+ lwz itmp2,LA_SIZE+(5+55)*4(sp)
+ lwz pv,LA_SIZE+(5+56)*4(sp)
+ lwz itmp3,LA_SIZE+(5+57)*4(sp) /* restore return value into temp reg.*/
- lwz pv,34*8(r1)
+ lwz r0,(6+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp) /* restore RA */
+ mtlr r0
- lwz r0,(36*8)+8(r1)
- mtlr r0
- addi r1,r1,(36*8)
+ mr. itmp3,itmp3 /* check for an exception */
+ beq L_asm_wrapper_patcher_exception
- mr. itmp1,itmp1 /* check for an exception */
- beq L_initializererror
+ /* get return address (into JIT code) */
+ lwz itmp3,(5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
-L_is_initialized:
- blr
+ /* remove stack frame + patcher stub stack */
+ addi sp,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
+
+ mtctr itmp3
+ bctr /* jump to new patched code */
+
+L_asm_wrapper_patcher_exception:
+ lwz xpc,(5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
+ addi sp,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
-L_initializererror:
#if defined(USE_THREADS) && defined(NATIVE_THREADS)
mflr r0
- stw r0,8(r1)
- stwu r1,-4*8(r1) /* preserve linkage area (24 bytes) */
+ stw r0,LA_LR_OFFSET(sp)
+ stwu sp,-(LA_SIZE+1*4)(sp) /* preserve linkage area */
+ stw xpc,LA_SIZE+0*4(sp)
bl builtin_asm_get_exceptionptrptr
- lwz r0,(4*8)+8(r1)
- mtlr r0
- addi r1,r1,4*8
+ lwz xpc,LA_SIZE+0*4(sp)
+ lwz r0,LA_SIZE+1*4+LA_LR_OFFSET(sp)
+ mtlr r0
+ addi sp,sp,LA_SIZE+1*4
#else
# if defined(__DARWIN__)
- lwz r3,lo16(_exceptionptr-0b)(pv)
+ lwz v0,lo16(_no_threads_exceptionptr-0b)(pv)
# else
- lis r3,_exceptionptr@ha
- addi r3,r3,_exceptionptr@l
+ lis v0,_no_threads_exceptionptr@ha
+ addi v0,v0,_no_threads_exceptionptr@l
# endif
#endif
- lwz xptr,0(r3) /* get the exception pointer */
- li r0,0
- stw r0,0(r3) /* clear the exception pointer */
-
- mflr xpc
- b asm_handle_nat_exception
-
-
-/* asm_builtin_arraycheckcast **************************************************
-
- Does the cast check and eventually throws an exception.
-
-*******************************************************************************/
-
-asm_builtin_arraycheckcast:
- mflr r0
- stw r0,8(r1)
- stwu r1,-48(r1)
-
- stw r3,32(r1)
- bl builtin_arraycheckcast
-
- lwz r0,48+8(r1)
- mtlr r0
- mr. r3,r3
- beq nb_carray_throw
- lwz r3,32(r1)
- addi r1,r1,48
- blr
-
-nb_carray_throw:
- addi r1,r1,48
- mflr r0
- stw r0,8(r1)
- stwu r1,-24(r1)
- bl new_classcastexception
- mr xptr,r3
- addi r1,r1,24
- lwz r0,8(r1)
- mr xpc,r0
- mtlr r0
- b asm_handle_nat_exception
-
-
-/******************* function asm_builtin_aastore ******************************
-* *
-* Does the cast check and eventually throws an exception *
-* *
-*******************************************************************************/
-
-asm_builtin_aastore:
- mr. r3,r3
- beq nb_aastore_null
- mflr r0
- stw r0,8(r1)
- stwu r1,-48(r1)
-
- lwz itmp1,offarraysize(r3)
- slwi itmp3,r4,2
- add itmp2,r3,itmp3
- cmplw r4,itmp1
- bge nb_aastore_bound
- mr r4,r5
- stw itmp2,32(r1)
- stw r4,36(r1)
- bl builtin_canstore
-
- lwz r0,48+8(r1)
- mtlr r0
- lwz itmp1,32(r1)
- lwz itmp2,36(r1)
- addi r1,r1,48
- mr. r3,r3
- beq nb_aastore_store
- stw itmp2,offobjarrdata(itmp1)
- blr
-
-nb_aastore_null:
- mflr r0
- stw r0,8(r1)
- stwu r1,-24(r1)
- bl new_nullpointerexception
- mr xptr,r3
- addi r1,r1,24
- lwz r0,8(r1)
- mr xpc,r0
- mtlr r0
- b asm_handle_nat_exception
-
-nb_aastore_bound:
- addi r1,r1,48
- mflr r0
- stw r0,8(r1)
- stwu r1,-(24+1*4)(r1)
- mr r3,r4 /* move index into a0 */
- bl new_arrayindexoutofboundsexception
- mr xptr,r3
- addi r1,r1,(24+1*4)
- lwz r0,8(r1)
- mr xpc,r0
- mtlr r0
- b asm_handle_nat_exception
-
-nb_aastore_store:
- mflr r0
- stw r0,8(r1)
- stwu r1,-24(r1)
- bl new_arraystoreexception
- mr xptr,r3
- addi r1,r1,24
- lwz r0,8(r1)
- mr xpc,r0
- mtlr r0
- b asm_handle_nat_exception
-
-
-#if defined(USE_THREADS)
-asm_builtin_monitorenter:
- mr. r3,r3
- beq nb_monitorenter
- b builtin_monitorenter
-
-nb_monitorenter:
- mflr r0
- stw r0,8(r1)
- stwu r1,-24(r1)
- bl new_nullpointerexception
- mr xptr,r3
- addi r1,r1,24
- lwz r0,8(r1)
-/* addi xpc,r0,-4 */
- mr xpc,r0
- addi xpc,xpc,-4
- mtlr r0
- b asm_handle_nat_exception
-
-
-asm_builtin_monitorexit:
- mr. r3,r3
- beq nb_monitorexit
- b builtin_monitorexit
-
-nb_monitorexit:
- mflr r0
- stw r0,8(r1)
- stwu r1,-24(r1)
- bl new_nullpointerexception
- mr xptr,r3
- addi r1,r1,24
- lwz r0,8(r1)
-/* addi xpc,r0,-4 */
- mr xpc,r0
- addi xpc,xpc,-4
- mtlr r0
- b asm_handle_nat_exception
-#endif
-
-
-asm_builtin_idiv:
- mr. r4,r4
- beq nb_idiv
- lis itmp3,0x8000
- cmpw r3,itmp3
- bne normal_idiv
- cmpwi r4,-1
- bne normal_idiv
- blr
-
-normal_idiv:
- divw r3,r3,r4
- blr
-
-nb_idiv:
- mflr r0
- stw r0,8(r1)
- stwu r1,-24(r1)
- bl new_arithmeticexception
- mr xptr,r3
- addi r1,r1,24
- lwz r0,8(r1)
- mr xpc,r0
- mtlr r0
- b asm_handle_nat_exception
-
-
-asm_builtin_irem:
- mr itmp2,r3
- mr. r4,r4
- beq nb_irem
- lis itmp3,0x8000
- cmpw itmp2,itmp3
- bne normal_irem
- cmpwi r4,-1
- bne normal_irem
- li r3,0
- beqlr
-
-normal_irem:
- divw itmp3,itmp2,r4
- mullw itmp3,itmp3,r4
- subf r3,itmp3,itmp2
- blr
-
-nb_irem:
- mflr r0
- stw r0,8(r1)
- stwu r1,-24(r1)
- bl new_arithmeticexception
- mr xptr,r3
- addi r1,r1,24
- lwz r0,8(r1)
- mr xpc,r0
- mtlr r0
- b asm_handle_nat_exception
-
-
-asm_builtin_ldiv:
- or. r0,r5,r6
- beq nb_ldiv
- b builtin_ldiv
-
-nb_ldiv:
- mflr r0
- stw r0,8(r1)
- stwu r1,-24(r1)
- bl new_arithmeticexception
- mr xptr,r3
- addi r1,r1,24
- lwz r0,8(r1)
- mr xpc,r0
- mtlr r0
- b asm_handle_nat_exception
-
-
-asm_builtin_lrem:
- or. r0,r5,r6
- beq nb_lrem
- b builtin_lrem
-
-nb_lrem:
- mflr r0
- stw r0,8(r1)
- stwu r1,-24(r1)
- bl new_arithmeticexception
- mr xptr,r3
- addi r1,r1,24
- lwz r0,8(r1)
- mr xpc,r0
- mtlr r0
- b asm_handle_nat_exception
+ lwz xptr,0(v0) /* get the exception pointer */
+ li itmp3,0
+ stw itmp3,0(v0) /* clear the exception pointer */
+ b asm_handle_exception
asm_cacheflush:
asm_getclassvalues_atomic:
-_crit_restart2:
-_crit_begin2:
+_crit_restart:
+_crit_begin:
lwz r6,offbaseval(r3)
lwz r7,offdiffval(r3)
lwz r8,offbaseval(r4)
-_crit_end2:
+_crit_end:
stw r6,offcast_super_baseval(r5)
stw r7,offcast_super_diffval(r5)
stw r8,offcast_sub_baseval(r5)
asm_criticalsections:
#if defined(USE_THREADS) && defined(NATIVE_THREADS)
- .long _crit_begin1
- .long _crit_end1
- .long _crit_restart1
- .long _crit_begin2
- .long _crit_end2
- .long _crit_restart2
+ .long _crit_begin
+ .long _crit_end
+ .long _crit_restart
#endif
.long 0