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