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