1 /* src/vm/jit/powerpc/asmpart.S - Java-C interface functions for PowerPC
3 Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software.text; 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., 51 Franklin Street, Fifth Floor, Boston, MA
25 Contact: cacao@cacaojvm.org
27 Authors: Andreas Krall
31 Changes: Christian Thalinger
33 $Id: asmpart.S 4497 2006-02-12 23:22:36Z twisti $
43 #include "vm/jit/abi.h"
44 #include "vm/jit/methodheader.h"
45 #include "vm/jit/powerpc/offsets.h"
52 .globl asm_calljavafunction
53 .globl asm_calljavafunction_int
55 .globl asm_calljavafunction2
56 .globl asm_calljavafunction2int
57 .globl asm_calljavafunction2long
58 .globl asm_calljavafunction2float
59 .globl asm_calljavafunction2double
61 .globl asm_call_jit_compiler
63 .globl asm_handle_nat_exception
64 .globl asm_handle_exception
66 .globl asm_wrapper_patcher
69 .globl asm_initialize_thread_stack
70 .globl asm_perform_threadswitch
71 .globl asm_switchstackandcall
72 .globl asm_criticalsections
73 .globl asm_getclassvalues_atomic
76 /********************* function asm_calljavafunction ***************************
78 * This function calls a Java-method (which possibly needs compilation) *
79 * with up to 4 address parameters. *
81 * This functions calls the JIT-compiler which eventually translates the *
82 * method into machine code. *
85 * javaobject_header *asm_calljavamethod (methodinfo *m, *
86 * void *arg1, void *arg2, void *arg3, void *arg4); *
88 *******************************************************************************/
92 .long 0 /* catch type all */
93 .long calljava_xhandler /* handler pc */
94 .long calljava_xhandler /* end pc */
95 .long asm_calljavafunction /* start pc */
96 .long 1 /* extable size */
97 .long 0 /* line number table start */
98 .long 0 /* line number table size */
100 .long 0 /* intsave */
103 .long 0 /* frame size */
104 .long 0 /* method pointer (pointer to name) */
106 asm_calljavafunction:
107 asm_calljavafunction_int:
109 stw r0,LA_LR_OFFSET(r1)
112 #if defined(__DARWIN__)
113 stw itmp1,10*4(sp) /* register r11 is callee saved */
115 stw pv,11*4(sp) /* save PV register */
117 stw itmp3,12*4(sp) /* registers r14-r31 are callee saved */
118 stfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
121 #if defined(__DARWIN__)
137 SAVE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
140 mr itmp1,a0 /* pass method pointer via tmp1 */
147 #if defined(__DARWIN__)
148 lis mptr,ha16(asm_call_jit_compiler)
149 addi mptr,mptr,lo16(asm_call_jit_compiler)
151 lis mptr,asm_call_jit_compiler@ha
152 addi mptr,mptr,asm_call_jit_compiler@l
163 #if defined(__DARWIN__)
164 addi pv,itmp1,lo16(asm_calljavafunction-1b)
166 addi pv,itmp1,(asm_calljavafunction-1b)@l
169 L_asm_calljavafunction_return:
170 #if defined(__DARWIN__)
171 lwz itmp1,10*4(sp) /* register r11 is callee saved */
173 lwz pv,11*4(sp) /* save PV register */
176 lfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
179 #if defined(__DARWIN__)
195 RESTORE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
198 lwz r0,40*4+LA_LR_OFFSET(r1)
205 bl builtin_throw_exception
206 li v0,0 /* return NULL */
207 b L_asm_calljavafunction_return
214 .long 0 /* catch type all */
215 .long calljava_xhandler2 /* handler pc */
216 .long calljava_xhandler2 /* end pc */
217 .long asm_calljavafunction2 /* start pc */
218 .long 1 /* extable size */
219 .long 0 /* line number table start */
220 .long 0 /* line number table size */
221 .long 0 /* fltsave */
222 .long 0 /* intsave */
225 .long 0 /* frame size */
226 .long 0 /* method pointer (pointer to name) */
228 asm_calljavafunction2:
229 asm_calljavafunction2int:
230 asm_calljavafunction2long:
231 asm_calljavafunction2float:
232 asm_calljavafunction2double:
234 stw r0,LA_LR_OFFSET(r1)
237 #if defined(__DARWIN__)
238 stw itmp1,10*4(sp) /* register r11 is callee saved */
240 stw pv,11*4(sp) /* save PV register */
242 stw itmp3,12*4(sp) /* registers r14-r31 are callee saved */
243 stfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
246 #if defined(__DARWIN__)
262 SAVE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
265 stw a0,9*4(r1) /* save method pointer for compiler */
267 mr itmp1,r6 /* pointer to arg block */
268 mr itmp2,r4 /* arg count */
270 addi itmp1,itmp1,-sizejniblock /* initialize pointer (smaller code) */
271 addi itmp2,itmp2,1 /* initialize argument count */
272 li r17,0 /* initialize integer argument counter */
273 li r18,0 /* initialize float argument counter */
276 addi itmp1,itmp1,sizejniblock /* goto next argument block */
277 addi itmp2,itmp2,-1 /* argument count - 1 */
279 beq L_register_copy_done
281 lwz itmp3,offjniitemtype+4(itmp1)
282 andi. r0,itmp3,0x0002 /* is this a float/double type? */
283 bne L_register_handle_float
285 cmpwi r17,INT_ARG_CNT /* are we out of integer argument */
286 beq L_register_copy /* registers? yes, next loop */
288 andi. r0,itmp3,0x0001 /* is this a long type? */
289 bne L_register_handle_long
291 L_register_handle_int:
292 #if defined(__DARWIN__)
293 lis itmp3,ha16(jumptable_int)
294 addi itmp3,itmp3,lo16(jumptable_int)
296 lis itmp3,jumptable_int@ha
297 addi itmp3,itmp3,jumptable_int@l
299 slwi r19,r17,2 /* multiple of 4-bytes */
300 add itmp3,itmp3,r19 /* calculate address of jumptable */
301 lwz itmp3,0(itmp3) /* load function address */
302 addi r17,r17,1 /* integer argument counter + 1 */
306 L_register_handle_long:
307 #if defined(__DARWIN__)
308 lis itmp3,ha16(jumptable_long)
309 addi itmp3,itmp3,lo16(jumptable_long)
311 lis itmp3,jumptable_long@ha
312 addi itmp3,itmp3,jumptable_long@l
314 addi r19,r17,1 /* align to even numbers */
317 slwi r19,r19,2 /* multiple of 4-bytes */
318 add itmp3,itmp3,r19 /* calculate address of jumptable */
319 lwz itmp3,0(itmp3) /* load function address */
320 addi r17,r17,1 /* integer argument counter + 1 */
324 L_register_handle_float:
325 L_register_copy_done:
328 lwz itmp1,9*4(sp) /* pass method pointer via tmp1 */
330 #if defined(__DARWIN__)
331 lis mptr,ha16(asm_call_jit_compiler)
332 addi mptr,mptr,lo16(asm_call_jit_compiler)
334 lis mptr,asm_call_jit_compiler@ha
335 addi mptr,mptr,asm_call_jit_compiler@l
345 #if defined(__DARWIN__)
346 addi pv,itmp1,lo16(asm_calljavafunction2-1b)
348 addi pv,itmp1,(asm_calljavafunction2-1b)@l
351 L_asm_calljavafunction2_return:
352 #if defined(__DARWIN__)
353 lwz itmp1,10*4(sp) /* register r11 is callee saved */
355 lwz pv,11*4(sp) /* save PV register */
358 lfd ftmp1,14*4(sp) /* registers f14-f31 are callee saved */
361 #if defined(__DARWIN__)
377 RESTORE_TEMPORARY_REGISTERS(18) /* the offset has to be even */
380 lwz r0,40*4+LA_LR_OFFSET(r1)
387 bl builtin_throw_exception
388 li v0,0 /* return NULL */
389 b L_asm_calljavafunction2_return
403 lwz a0,offjniitem+4(itmp1)
406 lwz a1,offjniitem+4(itmp1)
409 lwz a2,offjniitem+4(itmp1)
412 lwz a3,offjniitem+4(itmp1)
415 lwz a4,offjniitem+4(itmp1)
418 lwz a5,offjniitem+4(itmp1)
421 lwz a6,offjniitem+4(itmp1)
424 lwz a7,offjniitem+4(itmp1)
429 #if defined(__DARWIN__)
431 /* we have two entries here, so we get the even argument register
432 alignment for linux */
445 lwz a0,offjniitem+0(itmp1)
446 lwz a1,offjniitem+4(itmp1)
449 lwz a2,offjniitem+0(itmp1)
450 lwz a3,offjniitem+4(itmp1)
453 lwz a4,offjniitem+0(itmp1)
454 lwz a5,offjniitem+4(itmp1)
457 lwz a6,offjniitem+0(itmp1)
458 lwz a7,offjniitem+4(itmp1)
462 /* asm_call_jit_compiler *******************************************************
464 Invokes the compiler for untranslated JavaVM methods.
466 *******************************************************************************/
468 asm_call_jit_compiler:
470 stw r0,LA_LR_OFFSET(r1) /* save return address */
471 stwu r1,-((LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo)(r1)
472 stw itmp1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 1*4)(r1)
474 mr itmp1,r0 /* save return address to other reg. */
492 stw mptr,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 2*4)(r1)
494 #if defined(__DARWIN__)
495 stw a0,(LA_WORD_SIZE+5+0)*4(r1)
496 stw a1,(LA_WORD_SIZE+5+1)*4(r1)
497 stw a2,(LA_WORD_SIZE+5+2)*4(r1)
498 stw a3,(LA_WORD_SIZE+5+3)*4(r1)
499 stw a4,(LA_WORD_SIZE+5+4)*4(r1)
500 stw a5,(LA_WORD_SIZE+5+5)*4(r1)
501 stw a6,(LA_WORD_SIZE+5+6)*4(r1)
502 stw a7,(LA_WORD_SIZE+5+7)*4(r1)
504 stfd fa0,(LA_WORD_SIZE+5+8)*4(r1)
505 stfd fa1,(LA_WORD_SIZE+5+10)*4(r1)
506 stfd fa2,(LA_WORD_SIZE+5+12)*4(r1)
507 stfd fa3,(LA_WORD_SIZE+5+14)*4(r1)
508 stfd fa4,(LA_WORD_SIZE+5+16)*4(r1)
509 stfd fa5,(LA_WORD_SIZE+5+18)*4(r1)
510 stfd fa6,(LA_WORD_SIZE+5+20)*4(r1)
511 stfd fa7,(LA_WORD_SIZE+5+22)*4(r1)
512 stfd fa8,(LA_WORD_SIZE+5+24)*4(r1)
513 stfd fa9,(LA_WORD_SIZE+5+26)*4(r1)
514 stfd fa10,(LA_WORD_SIZE+5+28)*4(r1)
515 stfd fa11,(LA_WORD_SIZE+5+30)*4(r1)
516 stfd fa12,(LA_WORD_SIZE+5+32)*4(r1)
518 SAVE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1)
521 addi a0,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)
522 li a1,0 /* we don't have pv handy */
523 addi a2,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo
524 lwz a3,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo+LA_LR_OFFSET(sp)
525 mr a4,a3 /* xpc is equal to ra */
526 bl stacktrace_create_extern_stackframeinfo
528 lwz a0,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 1*4)(r1)
529 bl jit_compile /* compile the Java method */
530 mr pv,r3 /* move address to pv register */
532 addi a0,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)
533 bl stacktrace_remove_stackframeinfo
535 #if defined(__DARWIN__)
536 lwz a0,(LA_WORD_SIZE+5+0)*4(r1)
537 lwz a1,(LA_WORD_SIZE+5+1)*4(r1)
538 lwz a2,(LA_WORD_SIZE+5+2)*4(r1)
539 lwz a3,(LA_WORD_SIZE+5+3)*4(r1)
540 lwz a4,(LA_WORD_SIZE+5+4)*4(r1)
541 lwz a5,(LA_WORD_SIZE+5+5)*4(r1)
542 lwz a6,(LA_WORD_SIZE+5+6)*4(r1)
543 lwz a7,(LA_WORD_SIZE+5+7)*4(r1)
545 lfd fa0,(LA_WORD_SIZE+5+8)*4(r1)
546 lfd fa1,(LA_WORD_SIZE+5+10)*4(r1)
547 lfd fa2,(LA_WORD_SIZE+5+12)*4(r1)
548 lfd fa3,(LA_WORD_SIZE+5+14)*4(r1)
549 lfd fa4,(LA_WORD_SIZE+5+16)*4(r1)
550 lfd fa5,(LA_WORD_SIZE+5+18)*4(r1)
551 lfd fa6,(LA_WORD_SIZE+5+20)*4(r1)
552 lfd fa7,(LA_WORD_SIZE+5+22)*4(r1)
553 lfd fa8,(LA_WORD_SIZE+5+24)*4(r1)
554 lfd fa9,(LA_WORD_SIZE+5+26)*4(r1)
555 lfd fa10,(LA_WORD_SIZE+5+28)*4(r1)
556 lfd fa11,(LA_WORD_SIZE+5+30)*4(r1)
557 lfd fa12,(LA_WORD_SIZE+5+32)*4(r1)
559 RESTORE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1)
562 lwz mptr,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 2*4)(r1)
564 lwz itmp1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo+LA_LR_OFFSET(r1)
566 addi r1,r1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo
568 mr. pv,pv /* test for exception */
569 beq L_asm_call_jit_compiler_exception
574 stw pv,0(mptr) /* store method address */
576 mtctr pv /* move method address to control reg */
577 bctr /* and call the Java method */
579 L_asm_call_jit_compiler_exception:
580 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
582 stw r0,LA_LR_OFFSET(sp)
583 stwu sp,-LA_SIZE_ALIGNED(sp) /* preserve linkage area */
584 bl builtin_asm_get_exceptionptrptr
585 lwz r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
587 addi sp,sp,LA_SIZE_ALIGNED
589 # if defined(__DARWIN__)
590 lwz v0,lo16(_no_threads_exceptionptr-0b)(pv)
592 lis v0,_no_threads_exceptionptr@ha
593 addi v0,v0,_no_threads_exceptionptr@l
596 lwz xptr,0(v0) /* get the exception pointer */
598 stw itmp3,0(v0) /* clear the exception pointer */
602 b asm_handle_nat_exception
605 /********************* function asm_handle_exception ***************************
607 * This function handles an exception. It does not use the usual calling *
608 * conventions. The exception pointer is passed in REG_ITMP1 and the *
609 * pc from the exception raising position is passed in REG_ITMP2. It searches *
610 * the local exception table for a handler. If no one is found, it unwinds *
611 * stacks and continues searching the callers. *
613 * void asm_handle_exception (exceptionptr, exceptionpc); *
615 *******************************************************************************/
617 asm_handle_nat_exception:
625 bne asm_handle_exception
630 asm_handle_exception:
631 addi sp,sp,-(ARG_CNT+TMP_CNT)*8 /* create maybe-leaf stackframe */
633 #if defined(__DARWIN__)
635 SAVE_ARGUMENT_REGISTERS(0) /* we save arg and temp registers in */
636 SAVE_TEMPORARY_REGISTERS(ARG_CNT) /* case this is a leaf method */
639 li a3,(ARG_CNT+TMP_CNT)*8 /* prepare a3 for handle_exception */
640 li a4,1 /* set maybe-leaf flag */
642 L_asm_handle_exception_stack_loop:
643 addi sp,sp,-(LA_WORD_SIZE+4+5)*4 /* allocate stack */
644 stw xptr,LA_SIZE+4*4(sp) /* save exception pointer */
645 stw xpc,LA_SIZE+5*4(sp) /* save exception pc */
646 stw pv,LA_SIZE+6*4(sp) /* save data segment pointer */
647 mflr r0 /* save return address */
648 stw r0,LA_SIZE+5*4(sp)
649 add a3,a3,sp /* calculate Java sp into a3... */
650 addi a3,a3,(LA_WORD_SIZE+4+5)*4
651 stw a4,LA_SIZE+8*4(sp) /* save maybe-leaf flag */
653 mr a0,xptr /* pass exception pointer */
654 mr a1,xpc /* pass exception pc */
655 mr a2,pv /* pass data segment pointer */
656 /* a3 is still set */
657 bl exceptions_handle_exception
660 beq L_asm_handle_exception_not_catched
662 mr xpc,v0 /* move handlerpc into xpc */
663 lwz xptr,LA_SIZE+4*4(sp) /* restore exception pointer */
664 lwz pv,LA_SIZE+6*4(sp) /* restore data segment pointer */
665 lwz r0,LA_SIZE+5*4(sp) /* restore return address */
667 lwz a4,LA_SIZE+8*4(sp) /* get maybe-leaf flag */
668 addi sp,sp,(LA_WORD_SIZE+4+5)*4 /* free stack frame */
671 beq L_asm_handle_exception_no_leaf
673 #if defined(__DARWIN__)
675 RESTORE_ARGUMENT_REGISTERS(0) /* if this is a leaf method, we have */
676 RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers */
679 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
681 L_asm_handle_exception_no_leaf:
682 mtctr xpc /* jump to the handler */
685 L_asm_handle_exception_not_catched:
686 lwz xptr,LA_SIZE+4*4(sp) /* restore exception pointer */
687 lwz pv,LA_SIZE+6*4(sp) /* restore data segment pointer */
688 lwz r0,LA_SIZE+5*4(sp) /* restore return address */
690 lwz a4,LA_SIZE+8*4(sp) /* get maybe-leaf flag */
691 addi sp,sp,(LA_WORD_SIZE+4+5)*4 /* free stack frame */
694 beq L_asm_handle_exception_no_leaf_stack
696 addi sp,sp,(ARG_CNT+TMP_CNT)*8 /* remove maybe-leaf stackframe */
697 li a4,0 /* clear the maybe-leaf flag */
699 L_asm_handle_exception_no_leaf_stack:
700 lwz t0,FrameSize(pv) /* get frame size */
701 add t0,sp,t0 /* pointer to save area */
703 lwz t1,IsLeaf(pv) /* is leaf procedure */
705 bne L_asm_handle_exception_no_ra_restore
707 lwz r0,LA_LR_OFFSET(t0) /* restore ra */
710 L_asm_handle_exception_no_ra_restore:
711 mflr xpc /* the new xpc is ra */
712 lwz t1,IntSave(pv) /* t1 = saved int register count */
715 mflr t2 /* t2 = current pc */
716 #if defined(__DARWIN__)
717 addi t2,t2,lo16(ex_int2-ex_int1)
719 addi t2,t2,(ex_int2-ex_int1)@l
721 slwi t1,t1,2 /* t1 = register count * 4 */
722 subf t2,t1,t2 /* t2 = IntSave - t1 */
738 subf t0,t1,t0 /* t0 = t0 - register count * 4 */
744 #if defined(__DARWIN__)
745 addi t2,t2,lo16(ex_flt2-ex_flt1)
747 addi t2,t2,(ex_flt2-ex_flt1)@l
749 slwi t1,t1,2 /* t1 = register count * 4 */
750 subf t2,t1,t2 /* t2 = FltSave - t1 */
766 lwz t0,FrameSize(pv) /* get frame size */
767 add sp,sp,t0 /* unwind stack */
768 li a3,0 /* prepare a3 for handle_exception */
777 bne L_asm_handle_exception_stack_loop
782 b L_asm_handle_exception_stack_loop
785 /* asm_wrapper_patcher *********************************************************
790 20 return address into JIT code (patch position)
791 16 pointer to virtual java_objectheader
792 12 machine code (which is patched back later)
793 8 unresolved class/method/field reference
794 4 data segment displacement from load instructions
795 0 patcher function pointer to call (pv is saved here afterwards)
797 *******************************************************************************/
800 mflr r0 /* get Java return address (leaf) */
801 stw r0,6*4(sp) /* store it in the stub stackframe */
802 /* keep stack 16-bytes aligned: 6+1+37 = 44 */
803 stwu sp,-(LA_SIZE+(5+58)*4+sizestackframeinfo)(sp)
805 #if defined(__DARWIN__)
806 stw a0,LA_SIZE+(5+0)*4(r1) /* save argument registers */
807 stw a1,LA_SIZE+(5+1)*4(r1) /* preserve linkage area (24 bytes) */
808 stw a2,LA_SIZE+(5+2)*4(r1) /* and 4 bytes for 4 argument */
809 stw a3,LA_SIZE+(5+3)*4(r1)
810 stw a4,LA_SIZE+(5+4)*4(r1)
811 stw a5,LA_SIZE+(5+5)*4(r1)
812 stw a6,LA_SIZE+(5+6)*4(r1)
813 stw a7,LA_SIZE+(5+7)*4(r1)
815 stfd fa0,LA_SIZE+(5+8)*4(sp)
816 stfd fa1,LA_SIZE+(5+10)*4(sp)
817 stfd fa2,LA_SIZE+(5+12)*4(sp)
818 stfd fa3,LA_SIZE+(5+14)*4(sp)
819 stfd fa4,LA_SIZE+(5+16)*4(sp)
820 stfd fa5,LA_SIZE+(5+18)*4(sp)
821 stfd fa6,LA_SIZE+(5+20)*4(sp)
822 stfd fa7,LA_SIZE+(5+22)*4(sp)
823 stfd fa8,LA_SIZE+(5+24)*4(sp)
824 stfd fa9,LA_SIZE+(5+26)*4(sp)
825 stfd fa10,LA_SIZE+(5+28)*4(sp)
826 stfd fa11,LA_SIZE+(5+30)*4(sp)
827 stfd fa12,LA_SIZE+(5+32)*4(sp)
829 stw t0,(LA_WORD_SIZE+5+33)*4(r1)
830 stw t1,(LA_WORD_SIZE+5+34)*4(r1)
831 stw t2,(LA_WORD_SIZE+5+35)*4(r1)
832 stw t3,(LA_WORD_SIZE+5+36)*4(r1)
833 stw t4,(LA_WORD_SIZE+5+37)*4(r1)
834 stw t5,(LA_WORD_SIZE+5+38)*4(r1)
835 stw t6,(LA_WORD_SIZE+5+39)*4(r1)
836 stw t7,(LA_WORD_SIZE+5+40)*4(r1)
838 stfd ft0,(LA_WORD_SIZE+5+42)*4(r1)
839 stfd ft1,(LA_WORD_SIZE+5+44)*4(r1)
840 stfd ft2,(LA_WORD_SIZE+5+46)*4(r1)
841 stfd ft3,(LA_WORD_SIZE+5+48)*4(r1)
842 stfd ft4,(LA_WORD_SIZE+5+50)*4(r1)
843 stfd ft5,(LA_WORD_SIZE+5+52)*4(r1)
845 SAVE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1) /* save 8 int/8 float arguments */
846 SAVE_TEMPORARY_REGISTERS(LA_WORD_SIZE+1+24)
849 stw itmp1,LA_SIZE+(5+54)*4(sp)
850 stw itmp2,LA_SIZE+(5+55)*4(sp)
851 stw pv,LA_SIZE+(5+56)*4(sp)
853 addi a0,sp,LA_SIZE+(5+58)*4 /* create stackframe info */
855 addi a2,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
856 mr a3,r0 /* this is correct for leafs */
857 lwz a4,((5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo)(sp) /* pass xpc */
858 bl stacktrace_create_extern_stackframeinfo
860 addi a0,sp,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo /* pass sp */
861 lwz pv,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp) /* get function */
862 lwz itmp1,LA_SIZE+(5+56)*4(sp) /* move pv to position of fp */
863 stw itmp1,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
864 mtctr pv /* call the patcher function */
866 stw v0,LA_SIZE+(5+57)*4(sp) /* save return value */
868 addi a0,sp,LA_SIZE+(5+58)*4
869 bl stacktrace_remove_stackframeinfo /* remove stackframe info */
871 #if defined(__DARWIN__)
872 lwz a0,LA_SIZE+(5+0)*4(r1)
873 lwz a1,LA_SIZE+(5+1)*4(r1)
874 lwz a2,LA_SIZE+(5+2)*4(r1)
875 lwz a3,LA_SIZE+(5+3)*4(r1)
876 lwz a4,LA_SIZE+(5+4)*4(r1)
877 lwz a5,LA_SIZE+(5+5)*4(r1)
878 lwz a6,LA_SIZE+(5+6)*4(r1)
879 lwz a7,LA_SIZE+(5+7)*4(r1)
881 lfd fa0,LA_SIZE+(5+8)*4(sp)
882 lfd fa1,LA_SIZE+(5+10)*4(sp)
883 lfd fa2,LA_SIZE+(5+12)*4(sp)
884 lfd fa3,LA_SIZE+(5+14)*4(sp)
885 lfd fa4,LA_SIZE+(5+16)*4(sp)
886 lfd fa5,LA_SIZE+(5+18)*4(sp)
887 lfd fa6,LA_SIZE+(5+20)*4(sp)
888 lfd fa7,LA_SIZE+(5+22)*4(sp)
889 lfd fa8,LA_SIZE+(5+24)*4(sp)
890 lfd fa9,LA_SIZE+(5+26)*4(sp)
891 lfd fa10,LA_SIZE+(5+28)*4(sp)
892 lfd fa11,LA_SIZE+(5+30)*4(sp)
893 lfd fa12,LA_SIZE+(5+32)*4(sp)
895 lwz t0,(LA_WORD_SIZE+5+33)*4(r1)
896 lwz t1,(LA_WORD_SIZE+5+34)*4(r1)
897 lwz t2,(LA_WORD_SIZE+5+35)*4(r1)
898 lwz t3,(LA_WORD_SIZE+5+36)*4(r1)
899 lwz t4,(LA_WORD_SIZE+5+37)*4(r1)
900 lwz t5,(LA_WORD_SIZE+5+38)*4(r1)
901 lwz t6,(LA_WORD_SIZE+5+39)*4(r1)
902 lwz t7,(LA_WORD_SIZE+5+40)*4(r1)
904 lfd ft0,(LA_WORD_SIZE+5+42)*4(r1)
905 lfd ft1,(LA_WORD_SIZE+5+44)*4(r1)
906 lfd ft2,(LA_WORD_SIZE+5+46)*4(r1)
907 lfd ft3,(LA_WORD_SIZE+5+48)*4(r1)
908 lfd ft4,(LA_WORD_SIZE+5+50)*4(r1)
909 lfd ft5,(LA_WORD_SIZE+5+52)*4(r1)
911 RESTORE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1) /* restore 8 int/8 float args */
912 RESTORE_TEMPORARY_REGISTERS(LA_WORD_SIZE+1+24)
915 lwz itmp1,LA_SIZE+(5+54)*4(sp)
916 lwz itmp2,LA_SIZE+(5+55)*4(sp)
917 lwz pv,LA_SIZE+(5+56)*4(sp)
918 lwz itmp3,LA_SIZE+(5+57)*4(sp) /* restore return value into temp reg.*/
920 lwz r0,(6+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp) /* restore RA */
923 mr. itmp3,itmp3 /* check for an exception */
924 beq L_asm_wrapper_patcher_exception
926 /* get return address (into JIT code) */
927 lwz itmp3,(5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
929 /* remove stack frame + patcher stub stack */
930 addi sp,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
933 bctr /* jump to new patched code */
935 L_asm_wrapper_patcher_exception:
936 lwz xpc,(5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
937 addi sp,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
939 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
941 stw r0,LA_LR_OFFSET(sp)
942 stwu sp,-(LA_SIZE+1*4)(sp) /* preserve linkage area */
943 stw xpc,LA_SIZE+0*4(sp)
944 bl builtin_asm_get_exceptionptrptr
945 lwz xpc,LA_SIZE+0*4(sp)
946 lwz r0,LA_SIZE+1*4+LA_LR_OFFSET(sp)
948 addi sp,sp,LA_SIZE+1*4
950 # if defined(__DARWIN__)
951 lwz v0,lo16(_no_threads_exceptionptr-0b)(pv)
953 lis v0,_no_threads_exceptionptr@ha
954 addi v0,v0,_no_threads_exceptionptr@l
958 lwz xptr,0(v0) /* get the exception pointer */
960 stw itmp3,0(v0) /* clear the exception pointer */
961 b asm_handle_exception
994 asm_initialize_thread_stack:
1024 #if defined(__DARWIN__)
1025 lfd fr0,lo16(doublezero-0b)(r3)
1027 lfd fr0,(doublezero-0b)@l(r3)
1054 asm_perform_threadswitch:
1146 asm_switchstackandcall:
1164 asm_getclassvalues_atomic:
1167 lwz r6,offbaseval(r3)
1168 lwz r7,offdiffval(r3)
1169 lwz r8,offbaseval(r4)
1171 stw r6,offcast_super_baseval(r5)
1172 stw r7,offcast_super_diffval(r5)
1173 stw r8,offcast_sub_baseval(r5)
1178 asm_criticalsections:
1179 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
1187 /* Disable exec-stacks, required for Gentoo ***********************************/
1189 #if defined(__GCC__) && defined(__ELF__)
1190 .section .note.GNU-stack,"",@progbits
1195 * These are local overrides for various environment variables in Emacs.
1196 * Please do not remove this and leave it at the end of the file, where
1197 * Emacs will automagically detect them.
1198 * ---------------------------------------------------------------------
1201 * indent-tabs-mode: t