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