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