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