* src/vm/jit/powerpc/codegen.c (createcompilerstub): Store the
[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, 2006 R. Grafl, A. Krall, C. Kruegel,
4    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6    J. Wenninger, 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., 51 Franklin Street, Fifth Floor, Boston, MA
23    02110-1301, USA.
24
25    Contact: cacao@cacaojvm.org
26
27    Authors: Andreas Krall
28             Reinhard Grafl
29             Stefan Ring
30
31    Changes: Christian Thalinger
32
33    $Id: asmpart.S 4497 2006-02-12 23:22:36Z twisti $
34
35 */
36
37
38 #include "config.h"
39
40 #include "md-abi.h"
41 #include "md-asm.h"
42
43 #include "vm/jit/abi.h"
44 #include "vm/jit/methodheader.h"
45 #include "vm/jit/powerpc/offsets.h"
46
47
48         .text
49
50         .align 2
51
52         .globl asm_calljavafunction
53         .globl asm_calljavafunction_int
54
55         .globl asm_calljavafunction2
56         .globl asm_calljavafunction2int
57         .globl asm_calljavafunction2long
58         .globl asm_calljavafunction2float
59         .globl asm_calljavafunction2double
60
61         .globl asm_call_jit_compiler
62
63         .globl asm_handle_nat_exception
64         .globl asm_handle_exception
65
66         .globl asm_wrapper_patcher
67
68         .globl asm_cacheflush
69         .globl asm_initialize_thread_stack
70         .globl asm_perform_threadswitch
71         .globl asm_switchstackandcall
72         .globl asm_criticalsections
73         .globl asm_getclassvalues_atomic
74
75
76 /********************* function asm_calljavafunction ***************************
77 *                                                                              *
78 *   This function calls a Java-method (which possibly needs compilation)       *
79 *   with up to 4 address parameters.                                           *
80 *                                                                              *
81 *   This functions calls the JIT-compiler which eventually translates the      *
82 *   method into machine code.                                                  *
83 *                                                                              *
84 *   C-prototype:                                                               *
85 *    javaobject_header *asm_calljavamethod (methodinfo *m,                     *
86 *         void *arg1, void *arg2, void *arg3, void *arg4);                     *
87 *                                                                              *
88 *******************************************************************************/
89                 
90         .align 2
91
92         .long   0                         /* catch type all                       */
93         .long   calljava_xhandler         /* handler pc                           */
94         .long   calljava_xhandler         /* end pc                               */
95         .long   asm_calljavafunction      /* start pc                             */
96         .long   1                         /* extable size                         */
97         .long   0                         /* line number table start              */
98         .long   0                         /* line number table size               */
99         .long   0                         /* fltsave                              */
100         .long   0                         /* intsave                              */
101         .long   0                         /* isleaf                               */
102         .long   0                         /* IsSync                               */
103         .long   0                         /* frame size                           */
104         .long   0                         /* method pointer (pointer to name)     */
105
106 asm_calljavafunction:
107 asm_calljavafunction_int:
108         mflr    r0
109         stw     r0,LA_LR_OFFSET(r1)
110         stwu    r1,-40*4(r1)
111
112 #if defined(__DARWIN__)
113         stw     itmp1,10*4(sp)            /* register r11 is callee saved         */
114 #endif
115         stw     pv,11*4(sp)               /* save PV register                     */
116
117         stw     itmp3,12*4(sp)            /* registers r14-r31 are callee saved   */
118         stfd    ftmp1,14*4(sp)            /* registers f14-f31 are callee saved   */
119         stfd    ftmp2,16*4(sp)
120
121 #if defined(__DARWIN__)
122         stw     t1,18*4(r1)
123         stw     t2,19*4(r1)
124         stw     t3,20*4(r1)
125         stw     t4,21*4(r1)
126         stw     t5,22*4(r1)
127         stw     t6,23*4(r1)
128         stw     t7,24*4(r1)
129
130         stfd    ft0,26*4(r1)
131         stfd    ft1,28*4(r1)
132         stfd    ft2,30*4(r1)
133         stfd    ft3,32*4(r1)
134         stfd    ft4,34*4(r1)
135         stfd    ft5,36*4(r1)
136 #else
137         SAVE_TEMPORARY_REGISTERS(18)      /* the offset has to be even            */
138 #endif
139
140         mr      itmp1,a0                  /* pass method pointer via tmp1         */
141
142         mr      a0,a1
143         mr      a1,a2
144         mr      a2,a3
145         mr      a3,a4
146
147 #if defined(__DARWIN__)
148         lis     mptr,ha16(asm_call_jit_compiler)
149         addi    mptr,mptr,lo16(asm_call_jit_compiler)
150 #else
151         lis     mptr,asm_call_jit_compiler@ha
152         addi    mptr,mptr,asm_call_jit_compiler@l
153 #endif
154         stw     mptr,8*4(r1)
155         addi    mptr,r1,7*4
156
157         lwz     pv,1*4(mptr)
158         mtctr   pv
159         bctrl
160
161 1:
162         mflr    itmp1
163 #if defined(__DARWIN__)
164         addi    pv,itmp1,lo16(asm_calljavafunction-1b)
165 #else
166         addi    pv,itmp1,(asm_calljavafunction-1b)@l
167 #endif
168
169 L_asm_calljavafunction_return:
170 #if defined(__DARWIN__)
171         lwz     itmp1,10*4(sp)            /* register r11 is callee saved         */
172 #endif
173         lwz     pv,11*4(sp)               /* save PV register                     */
174
175         lwz     itmp3,12*4(sp)
176         lfd     ftmp1,14*4(sp)            /* registers f14-f31 are callee saved   */
177         lfd     ftmp2,16*4(sp)
178
179 #if defined(__DARWIN__)
180         lwz     t1,18*4(r1)
181         lwz     t2,19*4(r1)
182         lwz     t3,20*4(r1)
183         lwz     t4,21*4(r1)
184         lwz     t5,22*4(r1)
185         lwz     t6,23*4(r1)
186         lwz     t7,24*4(r1)
187
188         lfd     ft0,26*4(r1)
189         lfd     ft1,28*4(r1)
190         lfd     ft2,30*4(r1)
191         lfd     ft3,32*4(r1)
192         lfd     ft4,34*4(r1)
193         lfd     ft5,36*4(r1)
194 #else
195         RESTORE_TEMPORARY_REGISTERS(18)   /* the offset has to be even            */
196 #endif
197
198         lwz     r0,40*4+LA_LR_OFFSET(r1)
199         mtlr    r0
200         addi    r1,r1,40*4
201         blr
202
203 calljava_xhandler:
204         mr      a0,itmp1
205         bl      builtin_throw_exception
206         li      v0,0                      /* return NULL                          */
207         b       L_asm_calljavafunction_return
208
209
210
211
212         .align 2
213
214         .long   0                         /* catch type all                       */
215         .long   calljava_xhandler2        /* handler pc                           */
216         .long   calljava_xhandler2        /* end pc                               */
217         .long   asm_calljavafunction2     /* start pc                             */
218         .long   1                         /* extable size                         */
219         .long   0                         /* line number table start              */
220         .long   0                         /* line number table size               */
221         .long   0                         /* fltsave                              */
222         .long   0                         /* intsave                              */
223         .long   0                         /* isleaf                               */
224         .long   0                         /* IsSync                               */
225         .long   0                         /* frame size                           */
226         .long   0                         /* method pointer (pointer to name)     */
227
228 asm_calljavafunction2:
229 asm_calljavafunction2int:
230 asm_calljavafunction2long:
231 asm_calljavafunction2float:
232 asm_calljavafunction2double:
233         mflr    r0
234         stw     r0,LA_LR_OFFSET(r1)
235         stwu    r1,-40*4(r1)
236
237 #if defined(__DARWIN__)
238         stw     itmp1,10*4(sp)            /* register r11 is callee saved         */
239 #endif
240         stw     pv,11*4(sp)               /* save PV register                     */
241
242         stw     itmp3,12*4(sp)            /* registers r14-r31 are callee saved   */
243         stfd    ftmp1,14*4(sp)            /* registers f14-f31 are callee saved   */
244         stfd    ftmp2,16*4(sp)
245
246 #if defined(__DARWIN__)
247         stw     t1,18*4(r1)
248         stw     t2,19*4(r1)
249         stw     t3,20*4(r1)
250         stw     t4,21*4(r1)
251         stw     t5,22*4(r1)
252         stw     t6,23*4(r1)
253         stw     t7,24*4(r1)
254
255         stfd    ft0,26*4(r1)
256         stfd    ft1,28*4(r1)
257         stfd    ft2,30*4(r1)
258         stfd    ft3,32*4(r1)
259         stfd    ft4,34*4(r1)
260         stfd    ft5,36*4(r1)
261 #else
262         SAVE_TEMPORARY_REGISTERS(18)      /* the offset has to be even            */
263 #endif
264
265         stw     a0,9*4(r1)                /* save method pointer for compiler     */
266
267         mr      itmp1,r6                  /* pointer to arg block                 */
268         mr      itmp2,r4                  /* arg count                            */
269
270         addi    itmp1,itmp1,-sizejniblock /* initialize pointer (smaller code)    */
271         addi    itmp2,itmp2,1             /* initialize argument count            */
272         li      r17,0                     /* initialize integer argument counter  */
273         li      r18,0                     /* initialize float argument counter    */
274
275 L_register_copy:
276         addi    itmp1,itmp1,sizejniblock  /* goto next argument block             */
277         addi    itmp2,itmp2,-1            /* argument count - 1                   */
278         mr.     itmp2,itmp2
279         beq     L_register_copy_done
280
281         lwz     itmp3,offjniitemtype+4(itmp1)
282         andi.   r0,itmp3,0x0002           /* is this a float/double type?         */
283         bne     L_register_handle_float
284
285         cmpwi   r17,INT_ARG_CNT           /* are we out of integer argument       */
286         beq     L_register_copy           /* registers? yes, next loop            */
287
288         andi.   r0,itmp3,0x0001           /* is this a long type?                 */
289         bne     L_register_handle_long
290
291 L_register_handle_int:
292 #if defined(__DARWIN__)
293         lis     itmp3,ha16(jumptable_int)
294         addi    itmp3,itmp3,lo16(jumptable_int)
295 #else
296         lis     itmp3,jumptable_int@ha
297         addi    itmp3,itmp3,jumptable_int@l
298 #endif
299         slwi    r19,r17,2                 /* multiple of 4-bytes                  */
300         add     itmp3,itmp3,r19           /* calculate address of jumptable       */
301         lwz     itmp3,0(itmp3)            /* load function address                */
302         addi    r17,r17,1                 /* integer argument counter + 1         */
303         mtctr   itmp3
304         bctr
305
306 L_register_handle_long:
307 #if defined(__DARWIN__)
308         lis     itmp3,ha16(jumptable_long)
309         addi    itmp3,itmp3,lo16(jumptable_long)
310 #else
311         lis     itmp3,jumptable_long@ha
312         addi    itmp3,itmp3,jumptable_long@l
313 #endif
314         addi    r19,r17,1                 /* align to even numbers                */
315         srwi    r19,r19,1
316         slwi    r19,r19,1
317         slwi    r19,r19,2                 /* multiple of 4-bytes                  */
318         add     itmp3,itmp3,r19           /* calculate address of jumptable       */
319         lwz     itmp3,0(itmp3)            /* load function address                */
320         addi    r17,r17,1                 /* integer argument counter + 1         */
321         mtctr   itmp3
322         bctr
323
324 L_register_handle_float:
325 L_register_copy_done:
326
327 L_stack_copy_done:
328         lwz     itmp1,9*4(sp)             /* pass method pointer via tmp1         */
329
330 #if defined(__DARWIN__)
331         lis     mptr,ha16(asm_call_jit_compiler)
332         addi    mptr,mptr,lo16(asm_call_jit_compiler)
333 #else
334         lis     mptr,asm_call_jit_compiler@ha
335         addi    mptr,mptr,asm_call_jit_compiler@l
336 #endif
337         stw     mptr,8*4(r1)
338         addi    mptr,r1,7*4
339
340         lwz     pv,1*4(mptr)
341         mtctr   pv
342         bctrl
343 1:
344         mflr    itmp1
345 #if defined(__DARWIN__)
346         addi    pv,itmp1,lo16(asm_calljavafunction2-1b)
347 #else
348         addi    pv,itmp1,(asm_calljavafunction2-1b)@l
349 #endif
350
351 L_asm_calljavafunction2_return:
352 #if defined(__DARWIN__)
353         lwz     itmp1,10*4(sp)            /* register r11 is callee saved         */
354 #endif
355         lwz     pv,11*4(sp)               /* save PV register                     */
356
357         lwz     itmp3,12*4(sp)
358         lfd     ftmp1,14*4(sp)            /* registers f14-f31 are callee saved   */
359         lfd     ftmp2,16*4(sp)
360
361 #if defined(__DARWIN__)
362         lwz     t1,18*4(r1)
363         lwz     t2,19*4(r1)
364         lwz     t3,20*4(r1)
365         lwz     t4,21*4(r1)
366         lwz     t5,22*4(r1)
367         lwz     t6,23*4(r1)
368         lwz     t7,24*4(r1)
369
370         lfd     ft0,26*4(r1)
371         lfd     ft1,28*4(r1)
372         lfd     ft2,30*4(r1)
373         lfd     ft3,32*4(r1)
374         lfd     ft4,34*4(r1)
375         lfd     ft5,36*4(r1)
376 #else
377         RESTORE_TEMPORARY_REGISTERS(18)   /* the offset has to be even            */
378 #endif
379
380         lwz     r0,40*4+LA_LR_OFFSET(r1)
381         mtlr    r0
382         addi    r1,r1,40*4
383         blr
384
385 calljava_xhandler2:
386         mr      r3,itmp1
387         bl      builtin_throw_exception
388         li      v0,0                      /* return NULL                          */
389         b       L_asm_calljavafunction2_return
390
391
392 jumptable_int:
393         .long   L_handle_a0
394         .long   L_handle_a1
395         .long   L_handle_a2
396         .long   L_handle_a3
397         .long   L_handle_a4
398         .long   L_handle_a5
399         .long   L_handle_a6
400         .long   L_handle_a7
401
402 L_handle_a0:
403         lwz     a0,offjniitem+4(itmp1)
404         b       L_register_copy
405 L_handle_a1:
406         lwz     a1,offjniitem+4(itmp1)
407         b       L_register_copy
408 L_handle_a2:
409         lwz     a2,offjniitem+4(itmp1)
410         b       L_register_copy
411 L_handle_a3:
412         lwz     a3,offjniitem+4(itmp1)
413         b       L_register_copy
414 L_handle_a4:
415         lwz     a4,offjniitem+4(itmp1)
416         b       L_register_copy
417 L_handle_a5:
418         lwz     a5,offjniitem+4(itmp1)
419         b       L_register_copy
420 L_handle_a6:
421         lwz     a6,offjniitem+4(itmp1)
422         b       L_register_copy
423 L_handle_a7:
424         lwz     a7,offjniitem+4(itmp1)
425         b       L_register_copy
426
427
428 jumptable_long:
429 #if defined(__DARWIN__)
430 #else
431         /* we have two entries here, so we get the even argument register
432         alignment for linux */
433
434         .long   L_handle_a0_a1
435         .long   0
436         .long   L_handle_a2_a3
437         .long   0
438         .long   L_handle_a4_a5
439         .long   0
440         .long   L_handle_a6_a7
441         .long   0
442 #endif
443
444 L_handle_a0_a1:
445         lwz     a0,offjniitem+0(itmp1)
446         lwz     a1,offjniitem+4(itmp1)
447         b       L_register_copy
448 L_handle_a2_a3:
449         lwz     a2,offjniitem+0(itmp1)
450         lwz     a3,offjniitem+4(itmp1)
451         b       L_register_copy
452 L_handle_a4_a5:
453         lwz     a4,offjniitem+0(itmp1)
454         lwz     a5,offjniitem+4(itmp1)
455         b       L_register_copy
456 L_handle_a6_a7:
457         lwz     a6,offjniitem+0(itmp1)
458         lwz     a7,offjniitem+4(itmp1)
459         b       L_register_copy
460
461
462 /* asm_call_jit_compiler *******************************************************
463
464    Invokes the compiler for untranslated JavaVM methods.
465
466 *******************************************************************************/
467
468 asm_call_jit_compiler:
469         mflr    r0
470         stw     r0,LA_LR_OFFSET(r1)         /* save return address                */
471         stwu    r1,-((LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo)(r1)
472         stw     itmp1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 1*4)(r1)
473
474         mr      itmp1,r0                    /* save return address to other reg.  */
475         lwz     itmp3,-12(itmp1)
476         srwi    itmp3,itmp3,16
477         andi.   itmp3,itmp3,31
478         cmpwi   itmp3,mptrn
479         beq     noregchange
480         lwz     itmp3,4(itmp1)
481         extsh   itmp3,itmp3
482         add     mptr,itmp3,itmp1
483         lwz     itmp3,8(itmp1)
484         srwi    itmp3,itmp3,16
485         cmpwi   itmp3,0x3dad
486         bne     noregchange
487         lwz     itmp3,8(itmp1)
488         slwi    itmp3,itmp3,16
489         add     mptr,mptr,itmp3
490                 
491 noregchange:
492         stw     mptr,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 2*4)(r1)
493
494 #if defined(__DARWIN__)
495         stw     a0,(LA_WORD_SIZE+5+0)*4(r1)
496         stw     a1,(LA_WORD_SIZE+5+1)*4(r1)
497         stw     a2,(LA_WORD_SIZE+5+2)*4(r1)
498         stw     a3,(LA_WORD_SIZE+5+3)*4(r1)
499         stw     a4,(LA_WORD_SIZE+5+4)*4(r1)
500         stw     a5,(LA_WORD_SIZE+5+5)*4(r1)
501         stw     a6,(LA_WORD_SIZE+5+6)*4(r1)
502         stw     a7,(LA_WORD_SIZE+5+7)*4(r1)
503
504         stfd    fa0,(LA_WORD_SIZE+5+8)*4(r1)
505         stfd    fa1,(LA_WORD_SIZE+5+10)*4(r1)
506         stfd    fa2,(LA_WORD_SIZE+5+12)*4(r1)
507         stfd    fa3,(LA_WORD_SIZE+5+14)*4(r1)
508         stfd    fa4,(LA_WORD_SIZE+5+16)*4(r1)
509         stfd    fa5,(LA_WORD_SIZE+5+18)*4(r1)
510         stfd    fa6,(LA_WORD_SIZE+5+20)*4(r1)
511         stfd    fa7,(LA_WORD_SIZE+5+22)*4(r1)
512         stfd    fa8,(LA_WORD_SIZE+5+24)*4(r1)
513         stfd    fa9,(LA_WORD_SIZE+5+26)*4(r1)
514         stfd    fa10,(LA_WORD_SIZE+5+28)*4(r1)
515         stfd    fa11,(LA_WORD_SIZE+5+30)*4(r1)
516         stfd    fa12,(LA_WORD_SIZE+5+32)*4(r1)
517 #else
518         SAVE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1)
519 #endif
520
521         addi    a0,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)
522         li      a1,0                        /* we don't have pv handy             */
523         addi    a2,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo
524         lwz     a3,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo+LA_LR_OFFSET(sp)
525         mr      a4,a3                       /* xpc is equal to ra                 */
526         bl      stacktrace_create_extern_stackframeinfo
527
528         lwz     a0,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 1*4)(r1)
529         bl      jit_compile                 /* compile the Java method            */
530         mr      pv,r3                       /* move address to pv register        */
531
532         addi    a0,sp,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)
533         bl      stacktrace_remove_stackframeinfo
534
535 #if defined(__DARWIN__)
536         lwz     a0,(LA_WORD_SIZE+5+0)*4(r1)
537         lwz     a1,(LA_WORD_SIZE+5+1)*4(r1)
538         lwz     a2,(LA_WORD_SIZE+5+2)*4(r1)
539         lwz     a3,(LA_WORD_SIZE+5+3)*4(r1)
540         lwz     a4,(LA_WORD_SIZE+5+4)*4(r1)
541         lwz     a5,(LA_WORD_SIZE+5+5)*4(r1)
542         lwz     a6,(LA_WORD_SIZE+5+6)*4(r1)
543         lwz     a7,(LA_WORD_SIZE+5+7)*4(r1)
544
545         lfd     fa0,(LA_WORD_SIZE+5+8)*4(r1)
546         lfd     fa1,(LA_WORD_SIZE+5+10)*4(r1)
547         lfd     fa2,(LA_WORD_SIZE+5+12)*4(r1)
548         lfd     fa3,(LA_WORD_SIZE+5+14)*4(r1)
549         lfd     fa4,(LA_WORD_SIZE+5+16)*4(r1)
550         lfd     fa5,(LA_WORD_SIZE+5+18)*4(r1)
551         lfd     fa6,(LA_WORD_SIZE+5+20)*4(r1)
552         lfd     fa7,(LA_WORD_SIZE+5+22)*4(r1)
553         lfd     fa8,(LA_WORD_SIZE+5+24)*4(r1)
554         lfd     fa9,(LA_WORD_SIZE+5+26)*4(r1)
555         lfd     fa10,(LA_WORD_SIZE+5+28)*4(r1)
556         lfd     fa11,(LA_WORD_SIZE+5+30)*4(r1)
557         lfd     fa12,(LA_WORD_SIZE+5+32)*4(r1)
558 #else
559         RESTORE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1)
560 #endif
561
562         lwz     mptr,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 2*4)(r1)
563
564         lwz     itmp1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo+LA_LR_OFFSET(r1)
565         mtlr    itmp1
566         addi    r1,r1,(LA_SIZE + 5*4 + INT_ARG_CNT*4 + FLT_ARG_CNT*8 + 3*4)+sizestackframeinfo
567
568         mr.     pv,pv                       /* test for exception                 */
569         beq     L_asm_call_jit_compiler_exception
570
571         lwz     itmp3,-12(itmp1)
572         extsh   itmp3,itmp3
573         add     mptr,mptr,itmp3
574         stw     pv,0(mptr)                  /* store method address               */
575
576         mtctr   pv                          /* move method address to control reg */
577         bctr                                /* and call the Java method           */
578
579 L_asm_call_jit_compiler_exception:
580 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
581         mflr    r0
582         stw     r0,LA_LR_OFFSET(sp)
583         stwu    sp,-LA_SIZE_ALIGNED(sp)     /* preserve linkage area              */
584         bl      builtin_asm_get_exceptionptrptr
585         lwz     r0,LA_SIZE_ALIGNED+LA_LR_OFFSET(sp)
586         mtlr    r0      
587         addi    sp,sp,LA_SIZE_ALIGNED
588 #else
589 # if defined(__DARWIN__)
590         lwz     v0,lo16(_no_threads_exceptionptr-0b)(pv)
591 # else
592         lis     v0,_no_threads_exceptionptr@ha
593         addi    v0,v0,_no_threads_exceptionptr@l
594 # endif
595 #endif
596         lwz     xptr,0(v0)                  /* get the exception pointer          */
597         li      itmp3,0
598         stw     itmp3,0(v0)                 /* clear the exception pointer        */
599
600         mflr    xpc
601         addi    xpc,xpc,-4
602         b       asm_handle_nat_exception
603
604
605 /********************* function asm_handle_exception ***************************
606 *                                                                              *
607 *   This function handles an exception. It does not use the usual calling      *
608 *   conventions. The exception pointer is passed in REG_ITMP1 and the          *
609 *   pc from the exception raising position is passed in REG_ITMP2. It searches *
610 *   the local exception table for a handler. If no one is found, it unwinds    *
611 *   stacks and continues searching the callers.                                *
612 *                                                                              *
613 *   void asm_handle_exception (exceptionptr, exceptionpc);                     *
614 *                                                                              *
615 *******************************************************************************/
616                 
617 asm_handle_nat_exception:
618         mflr    r9
619         lwz     itmp3,4(r9)
620         extsh   itmp3,itmp3
621         add     pv,itmp3,r9
622         lwz     itmp3,8(r9)
623         srwi    itmp3,itmp3,16
624         cmpwi   itmp3,0x3dad
625         bne     asm_handle_exception
626         lwz     itmp3,8(r9)
627         slwi    itmp3,itmp3,16
628         add     pv,pv,itmp3
629
630 asm_handle_exception:
631         addi    sp,sp,-(ARG_CNT+TMP_CNT)*8  /* create maybe-leaf stackframe       */
632
633 #if defined(__DARWIN__)
634 #else
635         SAVE_ARGUMENT_REGISTERS(0)          /* we save arg and temp registers in  */
636         SAVE_TEMPORARY_REGISTERS(ARG_CNT)   /* case this is a leaf method         */
637 #endif
638
639         li      a3,(ARG_CNT+TMP_CNT)*8      /* prepare a3 for handle_exception    */
640         li      a4,1                        /* set maybe-leaf flag                */
641
642 L_asm_handle_exception_stack_loop:
643         addi    sp,sp,-(LA_WORD_SIZE+4+5)*4 /* allocate stack                     */
644         stw     xptr,LA_SIZE+4*4(sp)        /* save exception pointer             */
645         stw     xpc,LA_SIZE+5*4(sp)         /* save exception pc                  */
646         stw     pv,LA_SIZE+6*4(sp)          /* save data segment pointer          */
647         mflr    r0                          /* save return address                */
648         stw     r0,LA_SIZE+5*4(sp)
649         add     a3,a3,sp                    /* calculate Java sp into a3...       */
650         addi    a3,a3,(LA_WORD_SIZE+4+5)*4
651         stw     a4,LA_SIZE+8*4(sp)          /* save maybe-leaf flag               */
652
653         mr      a0,xptr                     /* pass exception pointer             */
654         mr      a1,xpc                      /* pass exception pc                  */
655         mr      a2,pv                       /* pass data segment pointer          */
656                                             /* a3 is still set                    */
657         bl      exceptions_handle_exception
658
659         mr.     v0,v0
660         beq     L_asm_handle_exception_not_catched
661
662         mr      xpc,v0                      /* move handlerpc into xpc            */
663         lwz     xptr,LA_SIZE+4*4(sp)        /* restore exception pointer          */
664         lwz     pv,LA_SIZE+6*4(sp)          /* restore data segment pointer       */
665         lwz     r0,LA_SIZE+5*4(sp)          /* restore return address             */
666         mtlr    r0
667         lwz     a4,LA_SIZE+8*4(sp)          /* get maybe-leaf flag                */
668         addi    sp,sp,(LA_WORD_SIZE+4+5)*4  /* free stack frame                   */
669
670         mr.     a4,a4
671         beq     L_asm_handle_exception_no_leaf
672
673 #if defined(__DARWIN__)
674 #else
675         RESTORE_ARGUMENT_REGISTERS(0)       /* if this is a leaf method, we have  */
676         RESTORE_TEMPORARY_REGISTERS(ARG_CNT)/* to restore arg and temp registers  */
677 #endif
678
679         addi    sp,sp,(ARG_CNT+TMP_CNT)*8   /* remove maybe-leaf stackframe       */
680
681 L_asm_handle_exception_no_leaf:
682         mtctr   xpc                         /* jump to the handler                */
683         bctr
684
685 L_asm_handle_exception_not_catched:
686         lwz     xptr,LA_SIZE+4*4(sp)        /* restore exception pointer          */
687         lwz     pv,LA_SIZE+6*4(sp)          /* restore data segment pointer       */
688         lwz     r0,LA_SIZE+5*4(sp)          /* restore return address             */
689         mtlr    r0
690         lwz     a4,LA_SIZE+8*4(sp)          /* get maybe-leaf flag                */
691         addi    sp,sp,(LA_WORD_SIZE+4+5)*4  /* free stack frame                   */
692
693         mr.     a4,a4
694         beq     L_asm_handle_exception_no_leaf_stack
695
696         addi    sp,sp,(ARG_CNT+TMP_CNT)*8   /* remove maybe-leaf stackframe       */
697         li      a4,0                        /* clear the maybe-leaf flag          */
698
699 L_asm_handle_exception_no_leaf_stack:
700         lwz     t0,FrameSize(pv)            /* get frame size                     */
701         add     t0,sp,t0                    /* pointer to save area               */
702
703         lwz     t1,IsLeaf(pv)               /* is leaf procedure                  */
704         mr.     t1,t1
705         bne     L_asm_handle_exception_no_ra_restore
706
707         lwz     r0,LA_LR_OFFSET(t0)         /* restore ra                         */
708         mtlr    r0
709
710 L_asm_handle_exception_no_ra_restore:
711         mflr    xpc                         /* the new xpc is ra                  */
712         lwz     t1,IntSave(pv)              /* t1 = saved int register count      */
713         bl      ex_int1
714 ex_int1:
715         mflr    t2                          /* t2 = current pc                    */
716 #if defined(__DARWIN__)
717         addi    t2,t2,lo16(ex_int2-ex_int1)
718 #else
719         addi    t2,t2,(ex_int2-ex_int1)@l
720 #endif
721         slwi    t1,t1,2                     /* t1 = register count * 4            */
722         subf    t2,t1,t2                    /* t2 = IntSave - t1                  */
723         mtctr   t2
724         bctr
725
726         lwz     s0,-10*4(t0)
727         lwz     s1,-9*4(t0)
728         lwz     s2,-8*4(t0)
729         lwz     s3,-7*4(t0)
730         lwz     s4,-6*4(t0)
731         lwz     s5,-5*4(t0)
732         lwz     s6,-4*4(t0)
733         lwz     s7,-3*4(t0)
734         lwz     s8,-2*4(t0)
735         lwz     s9,-1*4(t0)
736
737 ex_int2:
738         subf    t0,t1,t0                    /* t0 = t0 - register count * 4       */
739
740         lwz     t1,FltSave(pv)
741         bl      ex_flt1
742 ex_flt1:
743         mflr    t2
744 #if defined(__DARWIN__)
745         addi    t2,t2,lo16(ex_flt2-ex_flt1)
746 #else
747         addi    t2,t2,(ex_flt2-ex_flt1)@l
748 #endif
749         slwi    t1,t1,2                     /* t1 = register count * 4            */
750         subf    t2,t1,t2                    /* t2 = FltSave - t1                  */
751         mtctr   t2
752         bctr
753
754         lfd     fs0,-10*8(t0)
755         lfd     fs1,-9*8(t0)
756         lfd     fs2,-8*8(t0)
757         lfd     fs3,-7*8(t0)
758         lfd     fs4,-6*8(t0)
759         lfd     fs5,-5*8(t0)
760         lfd     fs6,-4*8(t0)
761         lfd     fs7,-3*8(t0)
762         lfd     fs8,-2*8(t0)
763         lfd     fs9,-1*8(t0)
764
765 ex_flt2:
766         lwz     t0,FrameSize(pv)            /* get frame size                     */
767         add     sp,sp,t0                    /* unwind stack                       */
768         li      a3,0                        /* prepare a3 for handle_exception    */
769
770         mtlr    xpc
771         lwz     itmp3,4(xpc)
772         extsh   itmp3,itmp3
773         add     pv,itmp3,xpc
774         lwz     itmp3,8(xpc)
775         srwi    itmp3,itmp3,16
776         cmpwi   itmp3,0x3dad
777         bne     L_asm_handle_exception_stack_loop
778         lwz     itmp3,8(xpc)
779         slwi    itmp3,itmp3,16
780         add     pv,pv,itmp3
781
782         b       L_asm_handle_exception_stack_loop
783
784
785 /* asm_wrapper_patcher *********************************************************
786
787    XXX
788
789    Stack layout:
790      20   return address into JIT code (patch position)
791      16   pointer to virtual java_objectheader
792      12   machine code (which is patched back later)
793       8   unresolved class/method/field reference
794       4   data segment displacement from load instructions
795       0   patcher function pointer to call (pv is saved here afterwards)
796
797 *******************************************************************************/
798
799 asm_wrapper_patcher:
800         mflr    r0                    /* get Java return address (leaf)           */
801         stw     r0,6*4(sp)            /* store it in the stub stackframe          */
802                                       /* keep stack 16-bytes aligned: 6+1+37 = 44 */
803         stwu    sp,-(LA_SIZE+(5+58)*4+sizestackframeinfo)(sp)
804
805 #if defined(__DARWIN__)
806         stw     a0,LA_SIZE+(5+0)*4(r1)      /* save argument registers            */
807         stw     a1,LA_SIZE+(5+1)*4(r1)      /* preserve linkage area (24 bytes)   */
808         stw     a2,LA_SIZE+(5+2)*4(r1)      /* and 4 bytes for 4 argument         */
809         stw     a3,LA_SIZE+(5+3)*4(r1)
810         stw     a4,LA_SIZE+(5+4)*4(r1)
811         stw     a5,LA_SIZE+(5+5)*4(r1)
812         stw     a6,LA_SIZE+(5+6)*4(r1)
813         stw     a7,LA_SIZE+(5+7)*4(r1)
814
815         stfd    fa0,LA_SIZE+(5+8)*4(sp)
816         stfd    fa1,LA_SIZE+(5+10)*4(sp)
817         stfd    fa2,LA_SIZE+(5+12)*4(sp)
818         stfd    fa3,LA_SIZE+(5+14)*4(sp)
819         stfd    fa4,LA_SIZE+(5+16)*4(sp)
820         stfd    fa5,LA_SIZE+(5+18)*4(sp)
821         stfd    fa6,LA_SIZE+(5+20)*4(sp)
822         stfd    fa7,LA_SIZE+(5+22)*4(sp)
823         stfd    fa8,LA_SIZE+(5+24)*4(sp)
824         stfd    fa9,LA_SIZE+(5+26)*4(sp)
825         stfd    fa10,LA_SIZE+(5+28)*4(sp)
826         stfd    fa11,LA_SIZE+(5+30)*4(sp)
827         stfd    fa12,LA_SIZE+(5+32)*4(sp)
828
829         stw     t0,(LA_WORD_SIZE+5+33)*4(r1)
830         stw     t1,(LA_WORD_SIZE+5+34)*4(r1)
831         stw     t2,(LA_WORD_SIZE+5+35)*4(r1)
832         stw     t3,(LA_WORD_SIZE+5+36)*4(r1)
833         stw     t4,(LA_WORD_SIZE+5+37)*4(r1)
834         stw     t5,(LA_WORD_SIZE+5+38)*4(r1)
835         stw     t6,(LA_WORD_SIZE+5+39)*4(r1)
836         stw     t7,(LA_WORD_SIZE+5+40)*4(r1)
837
838         stfd    ft0,(LA_WORD_SIZE+5+42)*4(r1)
839         stfd    ft1,(LA_WORD_SIZE+5+44)*4(r1)
840         stfd    ft2,(LA_WORD_SIZE+5+46)*4(r1)
841         stfd    ft3,(LA_WORD_SIZE+5+48)*4(r1)
842         stfd    ft4,(LA_WORD_SIZE+5+50)*4(r1)
843         stfd    ft5,(LA_WORD_SIZE+5+52)*4(r1)
844 #else
845         SAVE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1) /* save 8 int/8 float arguments   */
846         SAVE_TEMPORARY_REGISTERS(LA_WORD_SIZE+1+24)
847 #endif
848
849         stw     itmp1,LA_SIZE+(5+54)*4(sp)
850         stw     itmp2,LA_SIZE+(5+55)*4(sp)
851         stw     pv,LA_SIZE+(5+56)*4(sp)
852
853         addi    a0,sp,LA_SIZE+(5+58)*4      /* create stackframe info             */
854         mr      a1,pv
855         addi    a2,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
856         mr      a3,r0                       /* this is correct for leafs          */
857         lwz     a4,((5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo)(sp) /* pass xpc   */
858         bl      stacktrace_create_extern_stackframeinfo
859
860         addi    a0,sp,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo  /* pass sp      */
861         lwz     pv,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp) /* get function */
862         lwz     itmp1,LA_SIZE+(5+56)*4(sp)  /* move pv to position of fp          */
863         stw     itmp1,(0+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
864         mtctr   pv                          /* call the patcher function          */
865         bctrl
866         stw     v0,LA_SIZE+(5+57)*4(sp)     /* save return value                  */
867
868         addi    a0,sp,LA_SIZE+(5+58)*4
869         bl      stacktrace_remove_stackframeinfo /* remove stackframe info        */
870
871 #if defined(__DARWIN__)
872         lwz     a0,LA_SIZE+(5+0)*4(r1)
873         lwz     a1,LA_SIZE+(5+1)*4(r1)
874         lwz     a2,LA_SIZE+(5+2)*4(r1)
875         lwz     a3,LA_SIZE+(5+3)*4(r1)
876         lwz     a4,LA_SIZE+(5+4)*4(r1)
877         lwz     a5,LA_SIZE+(5+5)*4(r1)
878         lwz     a6,LA_SIZE+(5+6)*4(r1)
879         lwz     a7,LA_SIZE+(5+7)*4(r1)
880
881         lfd     fa0,LA_SIZE+(5+8)*4(sp)
882         lfd     fa1,LA_SIZE+(5+10)*4(sp)
883         lfd     fa2,LA_SIZE+(5+12)*4(sp)
884         lfd     fa3,LA_SIZE+(5+14)*4(sp)
885         lfd     fa4,LA_SIZE+(5+16)*4(sp)
886         lfd     fa5,LA_SIZE+(5+18)*4(sp)
887         lfd     fa6,LA_SIZE+(5+20)*4(sp)
888         lfd     fa7,LA_SIZE+(5+22)*4(sp)
889         lfd     fa8,LA_SIZE+(5+24)*4(sp)
890         lfd     fa9,LA_SIZE+(5+26)*4(sp)
891         lfd     fa10,LA_SIZE+(5+28)*4(sp)
892         lfd     fa11,LA_SIZE+(5+30)*4(sp)
893         lfd     fa12,LA_SIZE+(5+32)*4(sp)
894
895         lwz     t0,(LA_WORD_SIZE+5+33)*4(r1)
896         lwz     t1,(LA_WORD_SIZE+5+34)*4(r1)
897         lwz     t2,(LA_WORD_SIZE+5+35)*4(r1)
898         lwz     t3,(LA_WORD_SIZE+5+36)*4(r1)
899         lwz     t4,(LA_WORD_SIZE+5+37)*4(r1)
900         lwz     t5,(LA_WORD_SIZE+5+38)*4(r1)
901         lwz     t6,(LA_WORD_SIZE+5+39)*4(r1)
902         lwz     t7,(LA_WORD_SIZE+5+40)*4(r1)
903
904         lfd     ft0,(LA_WORD_SIZE+5+42)*4(r1)
905         lfd     ft1,(LA_WORD_SIZE+5+44)*4(r1)
906         lfd     ft2,(LA_WORD_SIZE+5+46)*4(r1)
907         lfd     ft3,(LA_WORD_SIZE+5+48)*4(r1)
908         lfd     ft4,(LA_WORD_SIZE+5+50)*4(r1)
909         lfd     ft5,(LA_WORD_SIZE+5+52)*4(r1)
910 #else
911         RESTORE_ARGUMENT_REGISTERS(LA_WORD_SIZE+1) /* restore 8 int/8 float args  */
912         RESTORE_TEMPORARY_REGISTERS(LA_WORD_SIZE+1+24)
913 #endif
914
915         lwz     itmp1,LA_SIZE+(5+54)*4(sp)
916         lwz     itmp2,LA_SIZE+(5+55)*4(sp)
917         lwz     pv,LA_SIZE+(5+56)*4(sp)
918         lwz     itmp3,LA_SIZE+(5+57)*4(sp)  /* restore return value into temp reg.*/
919
920         lwz     r0,(6+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp) /* restore RA   */
921         mtlr    r0
922
923         mr.     itmp3,itmp3           /* check for an exception                   */
924         beq     L_asm_wrapper_patcher_exception
925
926                                       /* get return address (into JIT code)       */
927         lwz     itmp3,(5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
928
929                                       /* remove stack frame + patcher stub stack  */
930         addi    sp,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
931
932         mtctr   itmp3
933         bctr                          /* jump to new patched code                 */
934
935 L_asm_wrapper_patcher_exception:
936         lwz     xpc,(5+LA_WORD_SIZE+5+58)*4+sizestackframeinfo(sp)
937         addi    sp,sp,(8+LA_WORD_SIZE+5+58)*4+sizestackframeinfo
938
939 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
940         mflr    r0
941         stw     r0,LA_LR_OFFSET(sp)
942         stwu    sp,-(LA_SIZE+1*4)(sp) /* preserve linkage area                    */
943         stw     xpc,LA_SIZE+0*4(sp)
944         bl      builtin_asm_get_exceptionptrptr
945         lwz     xpc,LA_SIZE+0*4(sp)
946         lwz     r0,LA_SIZE+1*4+LA_LR_OFFSET(sp)
947         mtlr    r0
948         addi    sp,sp,LA_SIZE+1*4
949 #else
950 # if defined(__DARWIN__)
951         lwz     v0,lo16(_no_threads_exceptionptr-0b)(pv)
952 # else
953         lis     v0,_no_threads_exceptionptr@ha
954         addi    v0,v0,_no_threads_exceptionptr@l
955 # endif
956 #endif
957
958         lwz     xptr,0(v0)            /* get the exception pointer                */
959         li      itmp3,0
960         stw     itmp3,0(v0)           /* clear the exception pointer              */
961         b       asm_handle_exception
962
963
964 asm_cacheflush:
965         add     r4,r3,r4
966         rlwinm  r3,r3,0,0,26
967         addi    r4,r4,31
968         rlwinm  r4,r4,0,0,26
969         mr      r5,r3
970 1:
971         cmplw   r3,r4
972         bge     0f
973         dcbst   0,r3
974         addi    r3,r3,32
975         b       1b
976 0:
977         sync
978 1:
979         cmplw   r5,r4
980         bge     0f
981         icbi    0,r5
982         addi    r5,r5,32
983         b       1b
984 0:
985         sync
986         isync
987         blr
988
989
990         .align 3
991 doublezero:
992         .double 0.0
993
994 asm_initialize_thread_stack:
995         addi r4,r4,-256
996         stw r3,120(r4)
997         li r3,0
998         stw r3,124(r4)
999         stw r3,0(r4)
1000         stw r3,4(r4)
1001         stw r3,8(r4)
1002         stw r3,12(r4)
1003         stw r3,16(r4)
1004         stw r3,20(r4)
1005         stw r3,24(r4)
1006         stw r3,28(r4)
1007         stw r3,32(r4)
1008         stw r3,36(r4)
1009
1010         stw r3,128(r4)
1011         stw r3,132(r4)
1012         stw r3,136(r4)
1013         stw r3,140(r4)
1014         stw r3,144(r4)
1015         stw r3,148(r4)
1016         stw r3,152(r4)
1017         stw r3,156(r4)
1018
1019         mflr r0
1020         bl 0f
1021 0:
1022         mflr r3
1023         mtlr r0
1024 #if defined(__DARWIN__)
1025         lfd fr0,lo16(doublezero-0b)(r3)
1026 #else
1027         lfd fr0,(doublezero-0b)@l(r3)
1028 #endif
1029
1030         stfd fr0,40(r4)
1031         stfd fr0,48(r4)
1032         stfd fr0,56(r4)
1033         stfd fr0,64(r4)
1034         stfd fr0,72(r4)
1035         stfd fr0,80(r4)
1036         stfd fr0,88(r4)
1037         stfd fr0,96(r4)
1038         stfd fr0,104(r4)
1039         stfd fr0,112(r4)
1040
1041         stfd fr0,160(r4)
1042         stfd fr0,168(r4)
1043         stfd fr0,176(r4)
1044         stfd fr0,184(r4)
1045         stfd fr0,192(r4)
1046         stfd fr0,200(r4)
1047         stfd fr0,208(r4)
1048         stfd fr0,216(r4)
1049
1050         mr r3,r4
1051         blr
1052
1053
1054 asm_perform_threadswitch:
1055         mflr r0
1056         addi r1,r1,-224
1057         stw r0,120(r1)
1058         stw pv,124(r1)
1059         stw r14,0(r1)
1060         stw r15,4(r1)
1061         stw r24,8(r1)
1062         stw r25,12(r1)
1063         stw r26,16(r1)
1064         stw r27,20(r1)
1065         stw r28,24(r1)
1066         stw r29,28(r1)
1067         stw r30,32(r1)
1068         stw r31,36(r1)
1069         stfd fr14,40(r1)
1070         stfd fr15,48(r1)
1071         stfd fr24,56(r1)
1072         stfd fr25,64(r1)
1073         stfd fr26,72(r1)
1074         stfd fr27,80(r1)
1075         stfd fr28,88(r1)
1076         stfd fr29,96(r1)
1077         stfd fr30,104(r1)
1078         stfd fr31,112(r1)
1079
1080         stw r16,128(r1)
1081         stw r17,132(r1)
1082         stw r18,136(r1)
1083         stw r19,140(r1)
1084         stw r20,144(r1)
1085         stw r21,148(r1)
1086         stw r22,152(r1)
1087         stw r23,156(r1)
1088         stfd fr16,160(r1)
1089         stfd fr17,168(r1)
1090         stfd fr18,176(r1)
1091         stfd fr19,184(r1)
1092         stfd fr20,192(r1)
1093         stfd fr21,200(r1)
1094         stfd fr22,208(r1)
1095         stfd fr23,216(r1)
1096
1097         stw r1,0(r3)
1098         stw r1,0(r5)
1099         lwz r1,0(r4)
1100
1101         lwz r0,120(r1)
1102         lwz pv,124(r1)
1103         lwz r14,0(r1)
1104         lwz r15,4(r1)
1105         lwz r24,8(r1)
1106         lwz r25,12(r1)
1107         lwz r26,16(r1)
1108         lwz r27,20(r1)
1109         lwz r28,24(r1)
1110         lwz r29,28(r1)
1111         lwz r30,32(r1)
1112         lwz r31,36(r1)
1113         lfd fr14,40(r1)
1114         lfd fr15,48(r1)
1115         lfd fr24,56(r1)
1116         lfd fr25,64(r1)
1117         lfd fr26,72(r1)
1118         lfd fr27,80(r1)
1119         lfd fr28,88(r1)
1120         lfd fr29,96(r1)
1121         lfd fr30,104(r1)
1122         lfd fr31,112(r1)
1123
1124         lwz r16,128(r1)
1125         lwz r17,132(r1)
1126         lwz r18,136(r1)
1127         lwz r19,140(r1)
1128         lwz r20,144(r1)
1129         lwz r21,148(r1)
1130         lwz r22,152(r1)
1131         lwz r23,156(r1)
1132         lfd fr16,160(r1)
1133         lfd fr17,168(r1)
1134         lfd fr18,176(r1)
1135         lfd fr19,184(r1)
1136         lfd fr20,192(r1)
1137         lfd fr21,200(r1)
1138         lfd fr22,208(r1)
1139         lfd fr23,216(r1)
1140
1141         mtlr r0
1142         addi r1,r1,224
1143         blr
1144
1145
1146 asm_switchstackandcall:
1147         mflr r0
1148         stwu r3,-48(r3)
1149         stw r0,40(r3)
1150         stw r1,44(r3)
1151         stw r1,0(r5)
1152         mr r1,r3
1153
1154         mtctr r4
1155         mr r3,r6
1156         bctrl
1157
1158         lwz r0,40(r1)
1159         mtlr r0
1160         lwz r1,44(r1)
1161         blr
1162
1163
1164 asm_getclassvalues_atomic:
1165 _crit_restart:
1166 _crit_begin:
1167         lwz     r6,offbaseval(r3)
1168         lwz     r7,offdiffval(r3)
1169         lwz     r8,offbaseval(r4)
1170 _crit_end:
1171         stw     r6,offcast_super_baseval(r5)
1172         stw     r7,offcast_super_diffval(r5)
1173         stw     r8,offcast_sub_baseval(r5)
1174         blr
1175
1176         .data
1177
1178 asm_criticalsections:
1179 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
1180         .long   _crit_begin
1181         .long   _crit_end
1182         .long   _crit_restart
1183 #endif
1184         .long 0
1185
1186
1187 /* Disable exec-stacks, required for Gentoo ***********************************/
1188
1189 #if defined(__GCC__) && defined(__ELF__)
1190         .section .note.GNU-stack,"",@progbits
1191 #endif
1192
1193
1194 /*
1195  * These are local overrides for various environment variables in Emacs.
1196  * Please do not remove this and leave it at the end of the file, where
1197  * Emacs will automagically detect them.
1198  * ---------------------------------------------------------------------
1199  * Local variables:
1200  * mode: asm
1201  * indent-tabs-mode: t
1202  * c-basic-offset: 4
1203  * tab-width: 4
1204  * End:
1205  */