GNU header update.
[cacao.git] / src / vm / jit / powerpc / asmpart.S
1 /* vm/jit/powerpc/asmpart.S - Java-C interface functions for powerpc
2                 
3    Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4    R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5    C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6    Institut f. Computersprachen - TU Wien
7
8    This file is part of CACAO.
9
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.
14
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.
19
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., 59 Temple Place - Suite 330, Boston, MA
23    02111-1307, USA.
24
25    Contact: cacao@complang.tuwien.ac.at
26
27    Authors: Andreas Krall
28             Reinhard Grafl
29
30    $Id: asmpart.S 1735 2004-12-07 14:33:27Z twisti $
31
32 */
33
34 #include "config.h"
35 #include "vm/jit/powerpc/offsets.h"
36 #include "vm/jit/powerpc/asmoffsets.h"
37
38
39 #define itmp1 r11
40 #define itmp2 r12
41 #define itmp3 r0
42
43 #define xptr itmp1
44 #define xpc itmp2
45
46 #define pv r13
47 #define mptr r12
48 #define mptrn 12
49
50
51         .text
52
53         .align 2
54
55         .globl _asm_calljavafunction
56         .globl _asm_calljavafunction2
57         .globl _asm_calljavafunction2long
58         .globl _asm_calljavafunction2double
59         .globl _asm_call_jit_compiler
60
61         .globl _jit_compile
62         .globl _asm_handle_nat_exception
63         .globl _asm_handle_exception
64         .globl _asm_check_clinit
65         .globl _asm_builtin_checkarraycast
66         .globl _asm_builtin_aastore
67         .globl _builtin_canstore
68         .globl _builtin_trace_exception
69         .globl _builtin_monitorenter
70         .globl _builtin_monitorexit
71         .globl _builtin_ldiv
72         .globl _builtin_lrem
73         .globl _builtin_checkarraycast
74         .globl _asm_builtin_monitorenter
75         .globl _asm_builtin_monitorexit
76         .globl _asm_builtin_idiv
77         .globl _asm_builtin_irem
78         .globl _asm_builtin_ldiv
79         .globl _asm_builtin_lrem
80         .globl _asm_cacheflush
81         .globl _asm_initialize_thread_stack
82         .globl _asm_perform_threadswitch
83         .globl _asm_switchstackandcall
84         .globl _asm_criticalsections
85         .globl _asm_getclassvalues_atomic
86
87         .globl _string_java_lang_NullPointerException
88         .globl _string_java_lang_ArrayIndexOutOfBoundsException
89         .globl _string_java_lang_ArrayStoreException
90         .globl _string_java_lang_ArithmeticException
91         .globl _string_java_lang_ArithmeticException_message
92         .globl _string_java_lang_ClassCastException
93
94 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
95         .globl _builtin_asm_get_exceptionptrptr
96 #endif
97 #if !defined(USE_THREADS) || !defined(NATIVE_THREADS)
98         .globl __exceptionptr
99 #endif
100
101         .globl _builtin_throw_exception
102         .globl _class_load
103         .globl _class_link
104         .globl _class_init
105
106         .globl _new_classcastexception
107         .globl _new_nullpointerexception
108         .globl _new_arrayindexoutofboundsexception
109         .globl _new_arraystoreexception
110         .globl _new_arithmeticexception
111
112 jitcompile:
113         .long _jit_compile
114
115 class_load:
116         .long _class_load
117 class_link:
118         .long _class_link
119 class_init:
120         .long _class_init
121                 
122 builtinthrow:
123         .long _builtin_throw_exception
124
125 builtin_traceexception:
126         .long _builtin_trace_exception
127 builtin_monitorenter:
128         .long _builtin_monitorenter
129 builtin_monitorexit:
130         .long _builtin_monitorexit
131 builtin_ldiv:
132         .long _builtin_ldiv
133 builtin_lrem:
134         .long _builtin_lrem
135
136 builtincanstore:
137         .long _builtin_canstore
138 builtincheckarraycast:
139         .long _builtin_checkarraycast
140         
141 new_classcastexception:
142         .long _new_classcastexception
143 new_nullpointerexception:
144         .long _new_nullpointerexception
145 new_arrayindexoutofboundsexception:
146         .long _new_arrayindexoutofboundsexception
147 new_arraystoreexception:
148         .long _new_arraystoreexception
149 new_arithmeticexception:
150         .long _new_arithmeticexception
151
152
153 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
154 builtin_asm_get_exceptionptrptr:
155         .long _builtin_asm_get_exceptionptrptr
156 #endif
157 #if !defined(USE_THREADS) || !defined(NATIVE_THREADS)
158 _exceptionptr:
159         .long __exceptionptr
160 #endif
161
162                 
163 /********************* function asm_calljavafunction ***************************
164 *                                                                              *
165 *   This function calls a Java-method (which possibly needs compilation)       *
166 *   with up to 4 address parameters.                                           *
167 *                                                                              *
168 *   This functions calls the JIT-compiler which eventually translates the      *
169 *   method into machine code.                                                  *
170 *                                                                              *
171 *   C-prototype:                                                                               *
172 *    javaobject_header *asm_calljavamethod (methodinfo *m,                     *
173 *         void *arg1, void *arg2, void *arg3, void *arg4);                      *
174 *                                                                              *
175 *******************************************************************************/
176                 
177         .align 2
178     .long   0                         /* catch type all                       */
179     .long   calljava_xhandler         /* handler pc                           */
180     .long   calljava_xhandler         /* end pc                               */
181     .long   _asm_calljavafunction     /* start pc                             */
182     .long   1                         /* extable size                         */
183     .long   0                         /* fltsave                              */
184     .long   0                         /* intsave                              */
185     .long   0                         /* isleaf                               */
186     .long   0                         /* IsSync                               */
187     .long   24                        /* frame size                           */
188     .long   0                         /* method pointer (pointer to name)     */
189         .long   0                         /* padding                              */
190
191 _asm_calljavafunction:
192         mflr    r0
193         stw     r31,-4(r1)
194 //      stw     r30,-8(r1)
195         stw     pv,-12(r1)
196         stw     r0,8(r1)
197         stwu    r1,-148(r1)
198         bl      0f
199 0:
200         mflr    r31
201
202         stw             r16,40(r1)
203         stw             r17,44(r1)
204         stw             r18,48(r1)
205         stw             r19,52(r1)
206         stw             r20,56(r1)
207         stw             r21,60(r1)
208         stw             r22,64(r1)
209         stw             r23,68(r1)
210         stfd    f16,72(r1)
211         stfd    f17,80(r1)
212         stfd    f18,88(r1)
213         stfd    f19,96(r1)
214         stfd    f20,104(r1)
215         stfd    f21,112(r1)
216         stfd    f22,120(r1)
217         stfd    f23,128(r1)
218
219         stw     r3,36(r1)
220         addi    r2,r1,36
221         mr      r3,r4
222         mr      r4,r5
223         mr      r5,r6
224         mr      r6,r7
225
226 //      addis   mptr,r31,ha16(_asm_call_jit_compiler-0b)
227         addi    mptr,r31,lo16(_asm_call_jit_compiler-0b)
228         stw     mptr,32(r1)
229         addi    mptr,r1,28
230
231         lwz     pv,4(mptr)
232         mtctr   pv
233         bctrl
234 1:
235         mflr    itmp1
236         addi    pv,itmp1,lo16(_asm_calljavafunction-1b)
237
238 calljava_regrestore:
239         lwz     r16,40(r1)
240         lwz             r17,44(r1)
241         lwz             r18,48(r1)
242         lwz             r19,52(r1)
243         lwz             r20,56(r1)
244         lwz             r21,60(r1)
245         lwz             r22,64(r1)
246         lwz             r23,68(r1)
247         lfd             f16,72(r1)
248         lfd             f17,80(r1)
249         lfd             f18,88(r1)
250         lfd             f19,96(r1)
251         lfd             f20,104(r1)
252         lfd             f21,112(r1)
253         lfd             f22,120(r1)
254         lfd             f23,128(r1)
255
256         lwz     r0,148+8(r1)
257         mtlr    r0
258         addi    r1,r1,148
259         lwz     pv,-12(r1)
260 //      lwz     r30,-8(r1)
261         lwz     r31,-4(r1)
262         blr
263
264 calljava_xhandler:
265         mr      r3,itmp1
266 //      addis   pv,r31,ha16(builtinthrow-0b)
267         lwz     itmp1,lo16(builtinthrow-0b)(r31)
268         mtctr   itmp1
269         bctrl
270         b       calljava_regrestore
271
272
273
274
275         .align 2
276     .long   0                         /* catch type all                       */
277     .long   calljava_xhandler2        /* handler pc                           */
278     .long   calljava_xhandler2        /* end pc                               */
279     .long   _asm_calljavafunction2    /* start pc                             */
280     .long   1                         /* extable size                         */
281     .long   0                         /* fltsave                              */
282     .long   0                         /* intsave                              */
283     .long   0                         /* isleaf                               */
284     .long   0                         /* IsSync                               */
285     .long   24                        /* frame size                           */
286     .long   0                         /* method pointer (pointer to name)     */
287         .long   0                         /* padding                              */
288
289 _asm_calljavafunction2:
290 _asm_calljavafunction2long:
291 _asm_calljavafunction2double:
292         mflr    r0
293         stw     r31,-4(r1)
294 //      stw     r30,-8(r1)
295         stw     pv,-12(r1)
296         stw     r0,8(r1)
297         addi    r1,r1,-148
298         bl      0f
299 0:
300         mflr    r31
301
302         stw     r16,40(r1)
303         stw         r17,44(r1)
304         stw     r18,48(r1)
305         stw         r19,52(r1)
306         stw     r20,56(r1)
307         stw     r21,60(r1)
308         stw     r22,64(r1)
309         stw     r23,68(r1)
310         stfd    f16,72(r1)
311         stfd    f17,80(r1)
312         stfd    f18,88(r1)
313         stfd    f19,96(r1)
314         stfd    f20,104(r1)
315         stfd    f21,112(r1)
316         stfd    f22,120(r1)
317         stfd    f23,128(r1)
318
319         stw     r3,36(r1)                 /* save method pointer for compiler     */
320         addi    r2,r1,36
321         mr      itmp1,r6                  /* pointer to arg block                 */
322         mr      itmp2,r4                  /* arg count                            */
323
324         mr.     itmp2,itmp2
325         ble     calljava_argsloaded
326
327         addi    itmp2,itmp2,-1
328         lwz     r3,offjniitem+4(itmp1)
329         mr.     itmp2,itmp2
330         ble     calljava_argsloaded
331
332         addi    itmp2,itmp2,-1
333         lwz     r4,offjniitem+sizejniblock*1+4(itmp1)
334         mr.     itmp2,itmp2
335         ble     calljava_argsloaded
336     addi    itmp2,itmp2,-1
337
338     addi    itmp2,itmp2,-1
339     lwz     r5,offjniitem+sizejniblock*2+4(itmp1)
340     mr.     itmp2,itmp2
341     ble     calljava_argsloaded
342     addi    itmp2,itmp2,-1
343
344     addi    itmp2,itmp2,-1
345     lwz     r6,offjniitem+sizejniblock*3+4(itmp1)
346     mr.     itmp2,itmp2
347     ble     calljava_argsloaded
348     addi    itmp2,itmp2,-1
349
350 calljava_argsloaded:
351 //      addis   mptr,r31,ha16(_asm_call_jit_compiler-0b)
352         addi    mptr,r31,lo16(_asm_call_jit_compiler-0b)
353         stw     mptr,32(r1)
354         addi    mptr,r1,28
355
356         lwz     pv,4(mptr)
357         mtctr   pv
358         bctrl
359 1:
360         mflr    itmp1
361         addi    pv,itmp1,lo16(_asm_calljavafunction2-1b)
362         
363 calljava_regrestore2:
364         lwz             r16,40(r1)
365         lwz             r17,44(r1)
366         lwz             r18,48(r1)
367         lwz             r19,52(r1)
368         lwz             r20,56(r1)
369         lwz             r21,60(r1)
370         lwz             r22,64(r1)
371         lwz             r23,68(r1)
372         lfd             f16,72(r1)
373         lfd             f17,80(r1)
374         lfd             f18,88(r1)
375         lfd             f19,96(r1)
376         lfd             f20,104(r1)
377         lfd             f21,112(r1)
378         lfd             f22,120(r1)
379         lfd             f23,128(r1)
380
381         lwz     r0,148+8(r1)
382         mtlr    r0
383         addi    r1,r1,148
384         lwz     pv,-12(r1)
385 //      lwz     r30,-8(r1)
386         lwz     r31,-4(r1)
387         blr
388
389 calljava_xhandler2:
390         mr      r3,itmp1
391 //      addis   pv,r31,ha16(builtinthrow-0b)
392         lwz     itmp1,lo16(builtinthrow-0b)(r31)
393         mtctr   itmp1
394         bctrl
395         b       calljava_regrestore2
396
397
398 _asm_call_jit_compiler:
399 0:
400         mflr    itmp1
401         stw     r31,-4(r1)
402 //      stw     pv,-8(r1)
403         stw     r29,-12(r1)
404         stw     itmp1,8(r1)
405         addi    r1,r1,-176
406         mr      r31,pv
407
408         lwz     itmp3,-12(itmp1)
409         srwi    itmp3,itmp3,16
410         andi.   itmp3,itmp3,31
411         cmpwi   itmp3,mptrn
412         beq     noregchange
413         lwz     itmp3,4(itmp1)
414         extsh   itmp3,itmp3
415         add     mptr,itmp3,itmp1
416         lwz     itmp3,8(itmp1)
417         srwi    itmp3,itmp3,16
418         cmpwi   itmp3,0x3dad
419         bne     noregchange
420         lwz     itmp3,8(itmp1)
421         slwi    itmp3,itmp3,16
422         add     mptr,mptr,itmp3
423                 
424 noregchange:
425         mr      r29,mptr
426         stw     r3,28(r1)
427         stw     r4,32(r1)
428         stw     r5,36(r1)
429         stw     r6,40(r1)
430         stw     r7,44(r1)
431         stw     r8,48(r1)
432         stw     r9,52(r1)
433         stfd    f1,56(r1)
434         stfd    f2,64(r1)
435         stfd    f3,72(r1)
436         stfd    f4,80(r1)
437         stfd    f5,88(r1)
438         stfd    f6,96(r1)
439         stfd    f7,104(r1)
440         stfd    f8,112(r1)
441         stfd    f9,120(r1)
442         stfd    f10,128(r1)
443         stfd    f11,136(r1)
444         stfd    f12,144(r1)
445         stfd    f13,152(r1)
446         stw     r10,160(r1)
447
448         lwz     r3,0(r2)
449 //      addis   pv,r31,ha16(jitcompile-0b)
450         lwz     itmp1,lo16(jitcompile-0b)(r31)
451         mtctr   itmp1
452         bctrl
453
454         mr      pv,r3
455         mr      mptr,r29
456         lwz     r3,28(r1)
457         lwz             r4,32(r1)
458         lwz             r5,36(r1)
459         lwz             r6,40(r1)
460         lwz             r7,44(r1)
461         lwz             r8,48(r1)
462         lwz             r9,52(r1)
463         lfd             f1,56(r1)
464         lfd             f2,64(r1)
465         lfd             f3,72(r1)
466         lfd             f4,80(r1)
467         lfd             f5,88(r1)
468         lfd             f6,96(r1)
469         lfd             f7,104(r1)
470         lfd             f8,112(r1)
471         lfd             f9,120(r1)
472         lfd             f10,128(r1)
473         lfd             f11,136(r1)
474         lfd             f12,144(r1)
475         lfd             f13,152(r1)
476         lwz             r10,160(r1)
477
478         lwz     itmp1,176+8(r1)
479         lwz     itmp3,-12(itmp1)
480         extsh   itmp3,itmp3
481         add     mptr,mptr,itmp3
482         stw     pv,0(mptr)
483
484         mtctr   pv
485
486         lwz     r0,176+8(r1)
487         mtlr    r0
488         addi    r1,r1,176
489         lwz     r29,-12(r1)
490 //      lwz     pv,-8(r1)
491         lwz     r31,-4(r1)
492         bctr
493
494
495
496 /********************* function asm_handle_exception ***************************
497 *                                                                              *
498 *   This function handles an exception. It does not use the usual calling      *
499 *   conventions. The exception pointer is passed in REG_ITMP1 and the          *
500 *   pc from the exception raising position is passed in REG_ITMP2. It searches *
501 *   the local exception table for a handler. If no one is found, it unwinds    *
502 *   stacks and continues searching the callers.                                *
503 *                                                                              *
504 *   void asm_handle_exception (exceptionptr, exceptionpc);                     *
505 *                                                                              *
506 *******************************************************************************/
507                 
508 _asm_handle_nat_exception:
509         mflr    r2
510         lwz     itmp3,4(r2)
511         extsh   itmp3,itmp3
512         add     pv,itmp3,r2
513         lwz     itmp3,8(r2)
514         srwi    itmp3,itmp3,16
515         cmpwi   itmp3,0x3dad
516         bne     _asm_handle_exception
517         lwz     itmp3,8(r2)
518         slwi    itmp3,itmp3,16
519         add     pv,pv,itmp3
520
521 _asm_handle_exception:
522         addi    r1,r1,-18*4
523         stw     r0,0*4(r1)
524         stw     r2,1*4(r1)
525         stw     r3,2*4(r1)
526         stw     r4,3*4(r1)
527         stw     r5,4*4(r1)
528         stw     r6,5*4(r1)
529         stw     r7,6*4(r1)
530         stw     r8,7*4(r1)
531         stw     r9,8*4(r1)
532         stw     r10,9*4(r1)
533         stw     r16,10*4(r1)
534         stw     r17,11*4(r1)
535         stw     r18,12*4(r1)
536         stw     r19,13*4(r1)
537         stw     r20,14*4(r1)
538         stw     r21,15*4(r1)
539         stw     r22,16*4(r1)
540         stw     r23,17*4(r1)
541
542         li      r2,1
543 ex_stack_loop:
544         addi    r1,r1,-4*4
545         stw     xptr,0*4(r1)
546         stw     xpc,1*4(r1)
547         mflr    xptr
548         stw     xptr,2*4(r1)
549         stw     r2,3*4(r1)
550
551         lwz     r3,0*4(r1)            /* exception pointer                        */
552         lwz     r4,MethodPointer(pv)  /* method pointer                           */
553         mr      r5,xpc                /* exception pc                             */
554 /*      mr      r6,r2 */
555         li      r6,0                  /* line number                              */
556         li      r7,4                  /* set no unwind flag                       */
557
558         bl      0f
559 0:
560         mflr    itmp1
561         lwz     itmp1,lo16(builtin_traceexception-0b)(itmp1)
562         mtctr   itmp1
563         addi    r1,r1,-(24+5*4)       /* 24 linkage area + 5 argument * 4         */
564         bctrl
565         addi    r1,r1,(24+5*4)
566
567         lwz     xptr,2*4(r1)
568         mtlr    xptr
569         lwz     xptr,0*4(r1)          /* restore xptr                             */
570         lwz     xpc,1*4(r1)
571         lwz     r2,3*4(r1)
572         addi    r1,r1,4*4
573
574         lwz     r3,ExTableSize(pv)    /* r3 = exception table size                */
575         mr.     r3,r3                 /* if empty table skip                      */
576         beq     empty_table
577
578         addi    r4,pv,ExTableStart    /* r4 = start of exception table            */
579
580 ex_table_loop:
581         lwz     r5,ExStartPC(r4)      /* r5 = exception start pc                  */
582         cmplw   r5,xpc                /* (startpc <= xpc)                         */
583         bgt     ex_table_cont
584         lwz     r5,ExEndPC(r4)        /* r5 = exception end pc                    */
585         cmplw   xpc,r5                /* (xpc < endpc)                            */
586         bge     ex_table_cont
587         lwz     r7,ExCatchType(r4)    /* r7 = exception catch type                */
588         mr.     r7,r7
589         beq     ex_handle_it
590
591         lwz     itmp3,offclassloaded(r7)
592         mr.     itmp3,itmp3
593         bne     L_class_loaded
594
595         addi    r1,r1,-16*4           /* allocate stack                           */
596         stw     r3,7*4(r1)            /* save used registers                      */
597         stw     r4,8*4(r1)            /* 6*4 (linkage) + 1*4 (arg1) + 7*4 (save)  */
598         stw     r2,9*4(r1)
599         stw     xptr,10*4(r1)
600         stw     xpc,11*4(r1)
601         mflr    xptr
602         stw     xptr,12*4(r1)
603         stw     r7,13*4(r1)
604
605         mr      r3,r7                 /* arg1 = exceptionclass                    */
606         bl      0f
607 0:
608         mflr    itmp1
609         lwz     itmp1,lo16(class_load-0b)(itmp1)
610         mtctr   itmp1
611         bctrl
612
613         lwz     r3,7*4(r1)
614         lwz     r4,8*4(r1)
615         lwz     r2,9*4(r1)
616         lwz     xptr,10*4(r1)
617         lwz     xpc,11*4(r1)
618         lwz     itmp3,12*4(r1)
619         mtlr    itmp3
620         lwz     r7,13*4(r1)     
621         addi    r1,r1,16*4
622
623 L_class_loaded:
624         lwz     itmp3,offclasslinked(r7)
625         mr.     itmp3,itmp3
626         addi    r1,r1,-16*4           /* allocate stack                           */
627         stw     r7,13*4(r1)
628         bne     L_class_linked
629
630         stw     r3,7*4(r1)            /* save used registers                      */
631         stw     r4,8*4(r1)            /* 6*4 (linkage) + 1*4 (arg1) + 7*4 (save)  */
632         stw     r2,9*4(r1)
633         stw     xptr,10*4(r1)
634         stw     xpc,11*4(r1)
635         mflr    xptr
636         stw     xptr,12*4(r1)
637
638         mr      r3,r7                 /* arg1 = exceptionclass                    */
639         bl      0f
640 0:
641         mflr    itmp1
642         lwz     itmp1,lo16(class_link-0b)(itmp1)
643         mtctr   itmp1
644         bctrl
645
646         lwz     r3,7*4(r1)
647         lwz     r4,8*4(r1)
648         lwz     r2,9*4(r1)
649         lwz     xptr,10*4(r1)
650         lwz     xpc,11*4(r1)
651         lwz     itmp3,12*4(r1)
652         mtlr    itmp3
653
654 L_class_linked:
655 _crit_restart1:
656         lwz     r7,13*4(r1)     
657 _crit_begin1:
658         lwz     r6,offobjvftbl(xptr)  /* r6 = vftblptr(xptr)                      */
659         lwz     r7,offclassvftbl(r7)  /* r7 = vftblptr(catchtype) class (not obj) */
660         lwz     r6,offbaseval(r6)     /* r6 = baseval(xptr)                       */
661         lwz     r8,offbaseval(r7)     /* r8 = baseval(catchtype)                  */
662         lwz     r7,offdiffval(r7)     /* r7 = diffval(catchtype)                  */
663 _crit_end1:
664         subf    r6,r8,r6              /* r6 = baseval(xptr) - baseval(catchtype)  */
665         cmplw   r6,r7                 /* xptr is instanceof catchtype             */
666         addi    r1,r1,16*4
667         bgt     ex_table_cont         /* if (false) continue                      */
668
669 ex_handle_it:
670         lwz     xpc,ExHandlerPC(r4)   /* xpc = exception handler pc               */
671         mr.     r2,r2
672         beq     ex_jump
673
674         lwz     r0,0*4(r1)
675         lwz     r2,1*4(r1)
676         lwz     r3,2*4(r1)
677         lwz     r4,3*4(r1)
678         lwz     r5,4*4(r1)
679         lwz     r6,5*4(r1)
680         lwz     r7,6*4(r1)
681         lwz     r8,7*4(r1)
682         lwz     r9,8*4(r1)
683         lwz     r10,9*4(r1)
684         lwz     r16,10*4(r1)
685         lwz     r17,11*4(r1)
686         lwz     r18,12*4(r1)
687         lwz     r19,13*4(r1)
688         lwz     r20,14*4(r1)
689         lwz     r21,15*4(r1)
690         lwz     r22,16*4(r1)
691         lwz     r23,17*4(r1)
692         addi    r1,r1,18*4
693
694 ex_jump:
695         mtctr   xpc
696         bctr
697
698 ex_table_cont:
699         addi    r4,r4,ExEntrySize
700         addic.  r3,r3,-1
701         bgt     ex_table_loop
702
703 empty_table:
704         mr.     r2,r2                 /* if here the first time, then             */
705         beq     ex_already_cleared
706         addi    r1,r1,18*4            /* deallocate stack and                     */
707         li      r2,0                  /* clear the no unwind flag                 */
708 ex_already_cleared:
709         lwz     r3,IsSync(pv)
710         mr.     r3,r3
711         beq     no_monitor_exit
712         add     r3,r1,r3
713         lwz     r6,-4(r3)
714
715         addi    r1,r1,-6*4
716         stw     r3,0*4(r1)
717         stw     r4,1*4(r1)
718         stw     r2,2*4(r1)
719         stw     xptr,3*4(r1)
720         stw     xpc,4*4(r1)
721         mflr    xptr
722         stw     xptr,5*4(r1)
723
724         mr      r3,r6
725         bl      0f
726 0:
727         mflr    itmp1
728         lwz     itmp1,lo16(builtin_monitorexit-0b)(itmp1)
729         mtctr   itmp1
730         addi    r1,r1,-40
731         bctrl
732         addi    r1,r1,40
733
734         lwz     xptr,5*4(r1)
735         mtlr    xptr
736         lwz     r3,0*4(r1)
737         lwz     r4,1*4(r1)
738         lwz     r2,2*4(r1)
739         lwz     xptr,3*4(r1)
740         lwz     xpc,4*4(r1)
741         addi    r1,r1,6*4
742
743 no_monitor_exit:
744         lwz     r3,FrameSize(pv)      /* r3 = frame size                          */
745         add     r1,r1,r3              /* unwind stack                             */
746         mr      r3,r1                 /* r3 = pointer to save area                */
747         lwz     r4,IsLeaf(pv)         /* r4 = is leaf procedure                   */
748         mr.     r4,r4
749         bne     ex_no_restore         /* if (leaf) skip                           */
750         lwz     r4,8(r3)              /* restore ra                               */
751         mtlr    r4                    /* t0--                                     */
752 ex_no_restore:
753         mflr    r4                    /* the new xpc is ra                        */
754         mr      xpc,r4
755         lwz     r4,IntSave(pv)        /* r4 = saved int register count            */
756         bl      ex_int1
757 ex_int1:
758         mflr    r5
759         addi    r5,r5,lo16(ex_int2-ex_int1)
760         slwi    r4,r4,2
761         subf    r5,r4,r5
762         mtctr   r5
763         bctr
764         lwz     r14,-40(r3)
765         lwz     r15,-36(r3)
766         lwz     r24,-32(r3)
767         lwz     r25,-28(r3)
768         lwz     r26,-24(r3)
769         lwz     r27,-20(r3)
770         lwz     r28,-16(r3)
771         lwz     r29,-12(r3)
772         lwz     r30,-8(r3)
773         lwz     r31,-4(r3)
774 ex_int2:
775         subf    r3,r4,r3
776
777         lwz     r4,FltSave(pv)
778         bl      ex_flt1
779 ex_flt1:
780         mflr    r5
781         addi    r5,r5,lo16(ex_flt2-ex_flt1)
782         slwi    r4,r4,2
783         subf    r5,r4,r5
784         mtctr   r5
785         bctr
786         lfd     f14,-80(r3)
787         lfd     f15,-72(r3)
788         lfd     f24,-64(r3)
789         lfd     f25,-56(r3)
790         lfd     f26,-48(r3)
791         lfd     f27,-40(r3)
792         lfd     f28,-32(r3)
793         lfd     f29,-24(r3)
794         lfd     f30,-16(r3)
795         lfd     f31,-8(r3)
796 ex_flt2:
797         mtlr    xpc
798         lwz     itmp3,4(xpc)
799         extsh   itmp3,itmp3
800         add     pv,itmp3,xpc
801         lwz     itmp3,8(xpc)
802         srwi    itmp3,itmp3,16
803         cmpwi   itmp3,0x3dad
804         bne     ex_stack_loop
805         lwz     itmp3,8(xpc)
806         slwi    itmp3,itmp3,16
807         add     pv,pv,itmp3
808         b       ex_stack_loop
809
810
811 /********************* asm_check_clinit ****************************************
812 *                                                                              *
813 *   call static class initializer for PUT/GETSTATIC instructions               *
814 *                                                                              *
815 *******************************************************************************/
816
817 _asm_check_clinit:
818 0:
819         lwz     itmp2,offclassinit(itmp1)
820         mr.     itmp2,itmp2
821         bne     L_is_initialized
822
823         mflr    r0
824         stw     r0,8(r1)
825         addi    r1,r1,-(26*8)         /* keep stack 16-bytes aligned              */
826
827     stw     r3,4*8(r1)            /* save argument registers                  */
828     stw     r4,5*8(r1)            /* preserve linkage area (24 bytes)         */
829     stw     r5,6*8(r1)            /* and 4 bytes (better 8) for 1 argument    */
830     stw     r6,7*8(r1)
831     stw     r7,8*8(r1)
832     stw     r8,9*8(r1)
833     stw     r9,10*8(r1)
834         stw     r10,11*8(r1)
835
836         stfd    f1,12*8(r1)
837     stfd    f2,13*8(r1)
838     stfd    f3,14*8(r1)
839     stfd    f4,15*8(r1)
840     stfd    f5,16*8(r1)
841     stfd    f6,17*8(r1)
842     stfd    f7,18*8(r1)
843     stfd    f8,19*8(r1)
844     stfd    f9,20*8(r1)
845     stfd    f10,21*8(r1)
846     stfd    f11,22*8(r1)
847     stfd    f12,23*8(r1)
848     stfd    f13,24*8(r1)
849                 
850         mr      r3,itmp1
851         lwz     itmp1,lo16(class_init-0b)(pv)
852         mtctr   itmp1
853         bctrl
854         mr      itmp1,r3              /* save return value in temp register       */
855
856         lwz     r3,4*8(r1)
857         lwz     r4,5*8(r1)
858         lwz     r5,6*8(r1)
859         lwz     r6,7*8(r1)
860         lwz     r7,8*8(r1)
861         lwz     r8,9*8(r1)
862         lwz     r9,10*8(r1)
863         lwz     r10,11*8(r1)
864
865     lfd     f1,12*8(r1)
866     lfd     f2,13*8(r1)
867     lfd     f3,14*8(r1)
868     lfd         f4,15*8(r1)
869     lfd         f5,16*8(r1)
870     lfd         f6,17*8(r1)
871     lfd         f7,18*8(r1)
872     lfd         f8,19*8(r1)
873     lfd         f9,20*8(r1)
874     lfd         f10,21*8(r1)
875     lfd         f11,22*8(r1)
876     lfd         f12,23*8(r1)
877     lfd         f13,24*8(r1)
878                 
879         lwz     r0,(26*8)+8(r1)
880         mtlr    r0
881         addi    r1,r1,(26*8)
882
883         mr.         itmp1,itmp1           /* check for an exception                   */
884         beq     L_initializererror
885
886 L_is_initialized:
887         blr
888
889 L_initializererror:
890 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
891         mflr    r0
892         stw     r0,8(r1)
893         addi    r1,r1,-4*8            /* preserve linkage area (24 bytes)         */
894         lwz     itmp1,lo16(builtin_asm_get_exceptionptrptr-0b)(pv)
895         mtctr   itmp1
896         bctrl
897         lwz     r0,(4*8)+8(r1)
898         mtlr    r0      
899         addi    r1,r1,4*8
900 #else
901         lwz     r3,lo16(_exceptionptr-0b)(pv)
902 #endif
903
904         lwz     xptr,0(r3)            /* get the exception pointer                */
905         li      r0,0
906         stw     r0,0(r3)              /* clear the exception pointer              */
907
908         mflr    xpc
909         b       _asm_handle_nat_exception
910
911
912 /******************* function asm_builtin_checkarraycast ***********************
913 *                                                                              *
914 *   Does the cast check and eventually throws an exception                     *
915 *                                                                              *
916 *******************************************************************************/
917                 
918 _asm_builtin_checkarraycast:
919 0:
920         mflr    r0
921         stw     r0,8(r1)
922         stwu    r1,-48(r1)
923
924         stw     r3,32(r1)
925         lwz     itmp1,lo16(builtincheckarraycast-0b)(pv)
926         mtctr   itmp1
927         bctrl
928
929         lwz     r0,48+8(r1)
930         mtlr    r0
931         mr.     r3,r3
932         beq     nb_carray_throw
933         lwz     r3,32(r1)
934         addi    r1,r1,48
935         blr
936
937 nb_carray_throw:
938         addi    r1,r1,48
939         mflr    r0
940         stw     r0,8(r1)
941         addi    r1,r1,-(24+4)
942         lwz     itmp1,lo16(new_classcastexception-0b)(pv)
943         mtctr   itmp1
944         bctrl
945         mr      xptr,r3
946         addi    r1,r1,24+4
947         lwz     r0,8(r1)
948         mr      xpc,r0
949         mtlr    r0
950         b       _asm_handle_nat_exception
951
952
953 /******************* function asm_builtin_aastore ******************************
954 *                                                                              *
955 *   Does the cast check and eventually throws an exception                     *
956 *                                                                              *
957 *******************************************************************************/
958         
959 _asm_builtin_aastore:
960 0:
961         mr.     r3,r3
962         beq     nb_aastore_null
963         mflr    r0
964         stw     r0,8(r1)
965         addi    r1,r1,-48
966
967         lwz     itmp1,offarraysize(r3)
968         slwi    itmp3,r4,2
969         add     itmp2,r3,itmp3
970         cmplw   r4,itmp1
971         bge     nb_aastore_bound
972         mr      r4,r5
973         stw     itmp2,32(r1)
974         stw     r4,36(r1)
975 //      addis   pv,r31,ha16(builtincanstore-0b)
976         lwz     itmp1,lo16(builtincanstore-0b)(pv)
977         mtctr   itmp1
978         bctrl
979
980         lwz     r0,48+8(r1)
981         mtlr    r0
982         lwz     itmp1,32(r1)
983         lwz     itmp2,36(r1)
984         addi    r1,r1,48
985         mr.     r3,r3
986         beq     nb_aastore_store
987         stw     itmp2,offobjarrdata(itmp1)
988         blr
989
990 nb_aastore_null:
991         mflr    r0
992         stw     r0,8(r1)
993         addi    r1,r1,-(24+4)
994         lwz     itmp1,lo16(new_nullpointerexception-0b)(pv)
995         mtctr   itmp1
996         bctrl
997         mr      xptr,r3
998         addi    r1,r1,(24+4)
999         lwz     r0,8(r1)
1000         mr      xpc,r0
1001         mtlr    r0
1002         b       _asm_handle_nat_exception
1003
1004 nb_aastore_bound:
1005         addi    r1,r1,48
1006         mflr    r0
1007         stw     r0,8(r1)
1008         addi    r1,r1,-(24+2*4)
1009         lwz     itmp1,lo16(new_arrayindexoutofboundsexception-0b)(pv)
1010         mtctr   itmp1
1011         mr      r3,r4                 /* move index into a0                       */
1012         bctrl
1013         mr      xptr,r3
1014         addi    r1,r1,(24+2*4)
1015         lwz     r0,8(r1)
1016         mr      xpc,r0
1017         mtlr    r0
1018         b       _asm_handle_nat_exception
1019
1020 nb_aastore_store:
1021         mflr    r0
1022         stw     r0,8(r1)
1023         addi    r1,r1,-(24+4)
1024         lwz     itmp1,lo16(new_arraystoreexception-0b)(pv)
1025         mtctr   itmp1
1026         bctrl
1027         mr      xptr,r3
1028         addi    r1,r1,(24+4)
1029         lwz     r0,8(r1)
1030         mr      xpc,r0
1031         mtlr    r0
1032         b       _asm_handle_nat_exception
1033
1034
1035 _asm_builtin_monitorenter:
1036 0:
1037         lwz     itmp2,lo16(builtin_monitorenter-0b)(pv)
1038         mr.     r3,r3
1039         beq     nb_monitorenter
1040         mtctr   itmp2
1041         bctr
1042
1043 nb_monitorenter:
1044         mflr    r0
1045         stw     r0,8(r1)
1046         addi    r1,r1,-(24+4)
1047         lwz     itmp1,lo16(new_nullpointerexception-0b)(pv)
1048         mtctr   itmp1
1049         bctrl
1050         mr      xptr,r3
1051         addi    r1,r1,24+4
1052         lwz     r0,8(r1)
1053 /*      addi    xpc,r0,-4 */
1054         mr      xpc,r0
1055         addi    xpc,xpc,-4
1056
1057         mtlr    r0
1058         b       _asm_handle_nat_exception
1059
1060
1061 _asm_builtin_monitorexit:
1062 0:
1063         lwz     itmp2,lo16(builtin_monitorexit-0b)(pv)
1064         mr.     r3,r3
1065         beq     nb_monitorexit
1066         mtctr   itmp2
1067         bctr
1068
1069 nb_monitorexit:
1070         mflr    r0
1071         stw     r0,8(r1)
1072         addi    r1,r1,-(24+4)
1073         lwz     itmp1,lo16(new_nullpointerexception-0b)(pv)
1074         mtctr   itmp1
1075         bctrl
1076         mr      xptr,r3
1077         addi    r1,r1,24+4
1078         lwz     r0,8(r1)
1079 /*      addi    xpc,r0,-4 */
1080         mr      xpc,r0
1081         addi    xpc,xpc,-4
1082
1083         mtlr    r0
1084         b       _asm_handle_nat_exception
1085         
1086         
1087 _asm_builtin_idiv:
1088 0:
1089         mr.     r4,r4
1090         beq     nb_idiv
1091         lis     itmp3,0x8000
1092         cmpw    r3,itmp3
1093         bne     normal_idiv
1094         cmpwi   r4,-1
1095         bne     normal_idiv
1096         blr
1097
1098 normal_idiv:
1099         divw    r3,r3,r4
1100         blr
1101
1102 nb_idiv:
1103         mflr    r0
1104         stw     r0,8(r1)
1105         addi    r1,r1,-(24+2*4)
1106         lwz     itmp1,lo16(new_arithmeticexception-0b)(pv)
1107         mtctr   itmp1
1108         bctrl
1109         mr      xptr,r3
1110         addi    r1,r1,(24+2*4)
1111         lwz     r0,8(r1)
1112         mr      xpc,r0
1113         mtlr    r0
1114         b       _asm_handle_nat_exception
1115
1116
1117 _asm_builtin_irem:
1118 0:
1119         mr      itmp2,r3
1120         mr.     r4,r4
1121         beq     nb_irem
1122         lis     itmp3,0x8000
1123         cmpw    itmp2,itmp3
1124         bne     normal_irem
1125         cmpwi   r4,-1
1126         bne     normal_irem
1127         li      r3,0
1128         beqlr
1129
1130 normal_irem:
1131         divw    itmp3,itmp2,r4
1132         mullw   itmp3,itmp3,r4
1133         subf    r3,itmp3,itmp2
1134         blr
1135
1136 nb_irem:
1137         mflr    r0
1138         stw     r0,8(r1)
1139         addi    r1,r1,-(24+2*4)
1140         lwz     itmp1,lo16(new_arithmeticexception-0b)(pv)
1141         mtctr   itmp1
1142         bctrl
1143         mr      xptr,r3
1144         addi    r1,r1,(24+2*4)
1145         lwz     r0,8(r1)
1146         mr      xpc,r0
1147         mtlr    r0
1148         b       _asm_handle_nat_exception
1149
1150
1151 _asm_builtin_ldiv:
1152 0:
1153         or.     r0,r5,r6
1154         beq     nb_ldiv
1155         lwz     itmp1,lo16(builtin_ldiv-0b)(pv)
1156         mtctr   itmp1
1157         bctr
1158
1159 nb_ldiv:
1160         mflr    r0
1161         stw     r0,8(r1)
1162         addi    r1,r1,-(24+2*4)
1163         lwz     itmp1,lo16(new_arithmeticexception-0b)(pv)
1164         mtctr   itmp1
1165         bctrl
1166         mr      xptr,r3
1167         addi    r1,r1,(24+2*4)
1168         lwz     r0,8(r1)
1169         mr      xpc,r0
1170         mtlr    r0
1171         b       _asm_handle_nat_exception
1172
1173
1174  _asm_builtin_lrem:
1175 0:
1176         or.     r0,r5,r6
1177         beq     nb_lrem
1178         lwz     itmp1,lo16(builtin_lrem-0b)(pv)
1179         mtctr   itmp1
1180         bctr
1181
1182 nb_lrem:
1183         mflr    r0
1184         stw     r0,8(r1)
1185         addi    r1,r1,-(24+2*4)
1186         lwz     itmp1,lo16(new_arithmeticexception-0b)(pv)
1187         mtctr   itmp1
1188         bctrl
1189         mr      xptr,r3
1190         addi    r1,r1,(24+2*4)
1191         lwz     r0,8(r1)
1192         mr      xpc,r0
1193         mtlr    r0
1194         b       _asm_handle_nat_exception
1195
1196
1197 _asm_cacheflush:
1198         addi    r4,r4,31
1199         mr      r5,r3
1200         add     r4,r3,r4
1201 1:
1202         cmplw   r3,r4
1203         bge     0f
1204         dcbst   0,r3
1205         addi    r3,r3,32
1206         b       1b
1207 0:
1208         sync
1209 1:
1210         cmplw   r5,r4
1211         bge     0f
1212         icbi    0,r5
1213         addi    r5,r5,32
1214         b       1b
1215 0:
1216         sync
1217         isync
1218         blr
1219
1220
1221         .align 3
1222 doublezero:
1223         .double 0.0
1224
1225 _asm_initialize_thread_stack:
1226         addi r4,r4,-256
1227         stw r3,120(r4)
1228         li r3,0
1229         stw r3,124(r4)
1230         stw r3,0(r4)
1231         stw r3,4(r4)
1232         stw r3,8(r4)
1233         stw r3,12(r4)
1234         stw r3,16(r4)
1235         stw r3,20(r4)
1236         stw r3,24(r4)
1237         stw r3,28(r4)
1238         stw r3,32(r4)
1239         stw r3,36(r4)
1240
1241         stw r3,128(r4)
1242         stw r3,132(r4)
1243         stw r3,136(r4)
1244         stw r3,140(r4)
1245         stw r3,144(r4)
1246         stw r3,148(r4)
1247         stw r3,152(r4)
1248         stw r3,156(r4)
1249
1250         mflr r0
1251         bl 0f
1252 0:
1253         mflr r3
1254         mtlr r0
1255         lfd f0,lo16(doublezero-0b)(r3)
1256
1257         stfd f0,40(r4)
1258         stfd f0,48(r4)
1259         stfd f0,56(r4)
1260         stfd f0,64(r4)
1261         stfd f0,72(r4)
1262         stfd f0,80(r4)
1263         stfd f0,88(r4)
1264         stfd f0,96(r4)
1265         stfd f0,104(r4)
1266         stfd f0,112(r4)
1267
1268         stfd f0,160(r4)
1269         stfd f0,168(r4)
1270         stfd f0,176(r4)
1271         stfd f0,184(r4)
1272         stfd f0,192(r4)
1273         stfd f0,200(r4)
1274         stfd f0,208(r4)
1275         stfd f0,216(r4)
1276
1277         mr r3,r4
1278         blr
1279
1280
1281 _asm_perform_threadswitch:
1282         mflr r0
1283         addi r1,r1,-224
1284         stw r0,120(r1)
1285         stw pv,124(r1)
1286         stw r14,0(r1)
1287         stw r15,4(r1)
1288         stw r24,8(r1)
1289         stw r25,12(r1)
1290         stw r26,16(r1)
1291         stw r27,20(r1)
1292         stw r28,24(r1)
1293         stw r29,28(r1)
1294         stw r30,32(r1)
1295         stw r31,36(r1)
1296         stfd f14,40(r1)
1297         stfd f15,48(r1)
1298         stfd f24,56(r1)
1299         stfd f25,64(r1)
1300         stfd f26,72(r1)
1301         stfd f27,80(r1)
1302         stfd f28,88(r1)
1303         stfd f29,96(r1)
1304         stfd f30,104(r1)
1305         stfd f31,112(r1)
1306
1307         stw r16,128(r1)
1308         stw r17,132(r1)
1309         stw r18,136(r1)
1310         stw r19,140(r1)
1311         stw r20,144(r1)
1312         stw r21,148(r1)
1313         stw r22,152(r1)
1314         stw r23,156(r1)
1315         stfd f16,160(r1)
1316         stfd f17,168(r1)
1317         stfd f18,176(r1)
1318         stfd f19,184(r1)
1319         stfd f20,192(r1)
1320         stfd f21,200(r1)
1321         stfd f22,208(r1)
1322         stfd f23,216(r1)
1323
1324         stw r1,0(r3)
1325         stw r1,0(r5)
1326         lwz r1,0(r4)
1327
1328         lwz r0,120(r1)
1329         lwz pv,124(r1)
1330         lwz r14,0(r1)
1331         lwz r15,4(r1)
1332         lwz r24,8(r1)
1333         lwz r25,12(r1)
1334         lwz r26,16(r1)
1335         lwz r27,20(r1)
1336         lwz r28,24(r1)
1337         lwz r29,28(r1)
1338         lwz r30,32(r1)
1339         lwz r31,36(r1)
1340         lfd f14,40(r1)
1341         lfd f15,48(r1)
1342         lfd f24,56(r1)
1343         lfd f25,64(r1)
1344         lfd f26,72(r1)
1345         lfd f27,80(r1)
1346         lfd f28,88(r1)
1347         lfd f29,96(r1)
1348         lfd f30,104(r1)
1349         lfd f31,112(r1)
1350
1351         lwz r16,128(r1)
1352         lwz r17,132(r1)
1353         lwz r18,136(r1)
1354         lwz r19,140(r1)
1355         lwz r20,144(r1)
1356         lwz r21,148(r1)
1357         lwz r22,152(r1)
1358         lwz r23,156(r1)
1359         lfd f16,160(r1)
1360         lfd f17,168(r1)
1361         lfd f18,176(r1)
1362         lfd f19,184(r1)
1363         lfd f20,192(r1)
1364         lfd f21,200(r1)
1365         lfd f22,208(r1)
1366         lfd f23,216(r1)
1367
1368         mtlr r0
1369         addi r1,r1,224
1370         blr
1371
1372
1373 _asm_switchstackandcall:
1374         mflr r0
1375         addi r3,r3,-48
1376         stw r0,40(r3)
1377         stw r1,44(r3)
1378         stw r1,0(r5)
1379         mr r1,r3
1380
1381         mtctr r4
1382         mr r3,r6
1383         bctrl
1384
1385         lwz r0,40(r1)
1386         mtlr r0
1387         lwz r1,44(r1)
1388         blr
1389
1390
1391 _asm_getclassvalues_atomic:
1392 _crit_restart2:
1393 _crit_begin2:
1394         lwz     r6,offbaseval(r3)
1395         lwz     r7,offdiffval(r3)
1396         lwz     r8,offbaseval(r4)
1397 _crit_end2:
1398         stw     r6,offcast_super_baseval(r5)
1399         stw     r7,offcast_super_diffval(r5)
1400         stw     r8,offcast_sub_baseval(r5)
1401         blr
1402
1403         .data
1404
1405 _asm_criticalsections:
1406 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
1407         .long   _crit_begin1
1408         .long   _crit_end1
1409         .long   _crit_restart1
1410         .long   _crit_begin2
1411         .long   _crit_end2
1412         .long   _crit_restart2
1413 #endif
1414         .long 0
1415
1416
1417 /*
1418  * These are local overrides for various environment variables in Emacs.
1419  * Please do not remove this and leave it at the end of the file, where
1420  * Emacs will automagically detect them.
1421  * ---------------------------------------------------------------------
1422  * Local variables:
1423  * mode: asm
1424  * indent-tabs-mode: t
1425  * c-basic-offset: 4
1426  * tab-width: 4
1427  * End:
1428  */