apparently, getcallingmethod is gone
[cacao.git] / src / vm / jit / alpha / asmpart.S
1 /* jit/alpha/asmpart.S - Java-C interface functions for alpha
2
3    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4    Institut f. Computersprachen, TU Wien
5    R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
6    S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
7    J. Wenninger
8
9    This file is part of CACAO.
10
11    This program is free software; you can redistribute it and/or
12    modify it under the terms of the GNU General Public License as
13    published by the Free Software Foundation; either version 2, or (at
14    your option) any later version.
15
16    This program is distributed in the hope that it will be useful, but
17    WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19    General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with this program; if not, write to the Free Software
23    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
24    02111-1307, USA.
25
26    Contact: cacao@complang.tuwien.ac.at
27
28    Authors: Andreas Krall
29             Reinhard Grafl
30
31    $Id: asmpart.S 1392 2004-08-03 16:46:41Z stefan $
32
33 */
34
35
36 #include "config.h"        
37 #include "offsets.h"
38
39
40 #define         MethodPointer   -8
41 #define         FrameSize       -12
42 #define     IsSync          -16
43 #define     IsLeaf          -20
44 #define     IntSave         -24
45 #define     FltSave         -28
46 /* DEFINE LINE NUMBER STUFF HERE */
47 #define     ExTableSize     -56
48 #define     ExTableStart    -56
49
50 #define     ExEntrySize     -32
51 #define     ExStartPC       -8
52 #define     ExEndPC         -16
53 #define     ExHandlerPC     -24
54 #define     ExCatchType     -32
55
56
57 #define v0      $0
58
59 #define t0      $1
60 #define t1      $2
61 #define t2      $3
62 #define t3      $4
63 #define t4      $5
64 #define t5      $6
65 #define t6      $7
66 #define t7      $8
67
68 #define s0      $9
69 #define s1      $10
70 #define s2      $11
71 #define s3      $12
72 #define s4      $13
73 #define s5      $14
74 #define s6      $15
75
76 #define a0      $16
77 #define a1      $17
78 #define a2      $18
79 #define a3      $19
80 #define a4      $20
81 #define a5      $21
82
83 #define t8      $22
84 #define t9      $23
85 #define t10     $24
86 #define t11     $25
87 #define ra      $26
88 #define t12     $27
89
90 #define pv      t12
91 #define AT      $at
92 #define gp      $29
93 #define sp      $30
94 #define zero    $31
95
96 #define itmp1   $25
97 #define itmp2   $28
98 #define itmp3   $29
99
100 #define xptr    itmp1
101 #define xpc     itmp2
102
103 #define sf0     $f2
104 #define sf1     $f3
105 #define sf2     $f4
106 #define sf3     $f5
107 #define sf4     $f6
108 #define sf5     $f7
109 #define sf6     $f8
110 #define sf7     $f9
111
112 #define fzero   $f31
113
114
115 #define PAL_imb 134
116
117         .text
118         .set    noat
119         .set    noreorder
120
121
122 /********************* exported functions and variables ***********************/
123
124         .globl has_no_x_instr_set
125         .globl synchronize_caches
126         .globl asm_calljavafunction
127         .globl asm_calljavafunction2
128         .globl asm_calljavafunction2double
129         .globl asm_calljavafunction2long
130         .globl asm_call_jit_compiler
131         .globl asm_handle_exception
132         .globl asm_handle_nat_exception
133         .globl asm_check_clinit
134         .globl asm_builtin_checkcast    
135         .globl asm_builtin_checkarraycast
136         .globl asm_builtin_aastore
137         .globl asm_builtin_monitorenter
138         .globl asm_builtin_monitorexit
139         .globl asm_builtin_idiv
140         .globl asm_builtin_irem
141         .globl asm_builtin_ldiv
142         .globl asm_builtin_lrem
143         .globl asm_perform_threadswitch
144         .globl asm_initialize_thread_stack
145         .globl asm_switchstackandcall
146         .globl asm_builtin_trace
147         .globl asm_builtin_exittrace
148         .globl asm_criticalsections
149         .globl asm_getclassvalues_atomic
150
151 /*************************** imported functions *******************************/
152
153         .globl jit_compile
154         .globl builtin_monitorexit
155         .globl builtin_throw_exception
156         .globl builtin_trace_exception
157         .globl class_java_lang_Object
158
159
160 /*********************** function has_no_x_instr_set ***************************
161 *                                                                              *
162 *   determines if the byte support instruction set (21164a and higher)         *
163 *   is available.                                                              *
164 *                                                                              *
165 *******************************************************************************/
166
167         .ent    has_no_x_instr_set
168 has_no_x_instr_set:
169
170         .long   0x47e03c20                /* amask   1,v0                         */
171         jmp     zero,(ra)                 /* return                               */
172
173         .end    has_no_x_instr_set
174
175
176 /********************* function asm_calljavafunction ***************************
177 *                                                                              *
178 *   This function calls a Java-method (which possibly needs compilation)       *
179 *   with up to 4 address parameters.                                           *
180 *                                                                              *
181 *   This functions calls the JIT-compiler which eventually translates the      *
182 *   method into machine code.                                                  *
183 *                                                                              *
184 *   C-prototype:                                                               *
185 *    javaobject_header *asm_calljavafunction (methodinfo *m,                   *
186 *         void *arg1, void *arg2, void *arg3, void *arg4);                     *
187 *                                                                              *
188 *******************************************************************************/
189
190         .ent    asm_calljavafunction
191
192 call_name:
193         .ascii  "calljavafunction\0\0"
194
195         .align  2 /*3*/
196         .quad   0                         /* catch type all                       */
197         .quad   calljava_xhandler         /* handler pc                           */
198         .quad   calljava_xhandler         /* end pc                               */
199         .quad   asm_calljavafunction      /* start pc                             */
200         .long   1                         /* extable size                         */
201         .long   0                         /* PADDING */
202         .quad   0                         /* line number table start             */
203         .quad   0                         /* line number table size             */
204         .long   0                         /* PADDING */
205         .long   0                         /* fltsave */
206         .long   0                         /* intsave                              */
207         .long   0                         /* isleaf                               */
208         .long   0                         /* IsSync                               */
209         .long   32                        /* frame size                           */
210         .quad   0                         /* method pointer (pointer to name)     */
211
212 asm_calljavafunction:
213         ldgp    gp,0(pv)
214         lda     sp,-32(sp)                /* allocate stack space                 */
215         stq     gp,24(sp)                 /* save global pointer                  */
216         stq     ra,0(sp)                  /* save return address                  */
217
218         stq     a0,16(sp)                 /* save method pointer for compiler     */
219         lda     v0,16(sp)                 /* pass pointer to method pointer via v0*/
220
221         mov     a1,a0                     /* pass the remaining parameters        */
222         mov     a2,a1
223         mov     a3,a2
224         mov     a4,a3
225
226         lda     $28,asm_call_jit_compiler /* fake virtual function call (2 instr) */
227         stq     $28,8(sp)                 /* store function address               */
228         mov     sp,$28                    /* set method pointer                   */
229
230         ldq     pv,8($28)                 /* method call as in Java               */
231         jmp     ra,(pv)                   /* call JIT compiler                    */
232 calljava_jit:
233         lda     pv,-64(ra)                /* asm_calljavafunction-calljava_jit !!!!!*/
234
235 calljava_return:
236         ldq     ra,0(sp)                  /* restore return address               */
237         ldq     gp,24(sp)                 /* restore global pointer               */
238         lda     sp,32(sp)                 /* free stack space                     */
239
240 calljava_ret:
241         jmp     zero,(ra)
242
243 calljava_xhandler:
244         ldq     gp,24(sp)                 /* restore global pointer               */
245         mov     itmp1,a0
246         jsr     ra,builtin_throw_exception
247         ldq     ra,0(sp)                  /* restore return address               */
248         lda     sp,32(sp)                 /* free stack space                     */
249         jmp     zero,(ra)
250         .end    asm_calljavafunction
251
252
253
254
255         .ent    asm_calljavafunction2
256
257 call_name2:
258         .ascii  "calljavafunction2\0\0"
259
260         .align  3
261         .quad   0                         /* catch type all                       */
262         .quad   calljava_xhandler2        /* handler pc                           */
263         .quad   calljava_xhandler2        /* end pc                               */
264         .quad   asm_calljavafunction2     /* start pc                             */
265         .long   1                         /* extable size                         */
266         .long   0                         /* PADDING */
267         .quad   0                         /* line number table start             */
268         .quad   0                         /* line number table size             */
269         .long   0                         /* PADDING */
270         .long   0                         /* fltsave                              */
271         .long   1                         /* intsave                              */
272         .long   0                         /* isleaf                               */
273         .long   0                         /* IsSync                               */
274         .long   40                        /* frame size                           */
275         .quad   0                         /* method pointer (pointer to name)     */
276
277 asm_calljavafunction2:
278 asm_calljavafunction2double:
279 asm_calljavafunction2long:
280         ldgp    gp,0(pv)
281         lda     sp,-40(sp)                /* allocate stack space                 */
282         stq     ra,0(sp)                  /* save return address                  */
283         stq     s6,24(sp)
284         stq     gp,8(sp)                  /* save global pointer                  */
285
286         stq     a0,32(sp)                 /* save method pointer for compiler     */
287         mov     a3,t0                     /* pointer to arg block                 */
288         mov     a1,s6                     /* arg count                            */
289
290         ble     s6,calljava_argsloaded
291         lda     s6,-1(s6)
292         ldq     a0,offjniitem(t0)
293         ldt     $f16,offjniitem(t0)
294         ble     s6,calljava_argsloaded
295         lda     s6,-1(s6)
296         ldq     a1,offjniitem+sizejniblock*1(t0)
297         ldt     $f17,offjniitem+sizejniblock*1(t0)
298         ble     s6,calljava_argsloaded
299         lda     s6,-1(s6)
300         ldq     a2,offjniitem+sizejniblock*2(t0)
301         ldt     $f18,offjniitem+sizejniblock*2(t0)
302         ble     s6,calljava_argsloaded
303         lda     s6,-1(s6)
304         ldq     a3,offjniitem+sizejniblock*3(t0)
305         ldt     $f19,offjniitem+sizejniblock*3(t0)
306         ble     s6,calljava_argsloaded
307         lda     s6,-1(s6)
308         ldq     a4,offjniitem+sizejniblock*4(t0)
309         ldt     $f20,offjniitem+sizejniblock*4(t0)
310         ble     s6,calljava_argsloaded
311         lda     s6,-1(s6)
312         ldq     a5,offjniitem+sizejniblock*5(t0)
313         ldt     $f21,offjniitem+sizejniblock*5(t0)
314 calljava_argsloaded:
315         mov     sp,t4
316         ble     s6,calljava_nocopy
317         negq    s6,t1
318         s8addq  t1,sp,sp
319         s8addq  t1,t4,t2
320
321 calljava_copyloop:
322         ldq     t3,offjniitem+sizejniblock*6(t0)
323         stq     t3,0(t2)
324         lda     t1,1(t1)
325         lda     t0,sizejniblock(t0)
326         lda     t2,8(t2)
327         bne     t1,calljava_copyloop
328
329 calljava_nocopy:
330         lda     v0,32(t4)                 /* pass pointer to method pointer via v0*/
331
332         lda     $28,asm_call_jit_compiler /* fake virtual function call (2 instr) */
333         stq     $28,16(t4)                /* store function address               */
334         lda     $28,8(t4)                 /* set method pointer                   */
335
336         ldq     pv,8($28)                 /* method call as in Java               */
337         jmp     ra,(pv)                   /* call JIT compiler                    */
338 calljava_jit2:
339         lda     pv,-200(ra)               /* asm_calljavafunction-calljava_jit !!!*/
340
341         s8addq  s6,sp,sp
342 calljava_return2:
343         ldq     ra,0(sp)                  /* restore return address               */
344         ldq     gp,8(sp)                  /* restore global pointer               */
345         ldq     s6,24(sp)
346         lda     sp,40(sp)                 /* free stack space                     */
347
348 calljava_ret2:
349         jmp     zero,(ra)
350
351 calljava_xhandler2:
352         s8addq  s6,sp,sp
353         ldq     gp,8(sp)                  /* restore global pointer               */
354         mov     itmp1,a0
355         jsr     ra,builtin_throw_exception
356         ldq     ra,0(sp)                  /* restore return address               */
357         ldq     s6,24(sp)
358         lda     sp,40(sp)                 /* free stack space                     */
359         jmp     zero,(ra)
360         .end    asm_calljavafunction2
361                                                 
362
363 /****************** function asm_call_jit_compiler *****************************
364 *                                                                              *
365 *   invokes the compiler for untranslated JavaVM methods.                      *
366 *                                                                              *
367 *   Register R0 contains a pointer to the method info structure (prepared      *
368 *   by createcompilerstub). Using the return address in R26 and the            *
369 *   offset in the LDA instruction or using the value in methodptr R28 the      *
370 *   patching address for storing the method address can be computed:           *
371 *                                                                              *
372 *   method address was either loaded using                                     *
373 *   M_LDQ (REG_PV, REG_PV, a)        ; invokestatic/special    ($27)           *
374 *   M_LDA (REG_PV, REG_RA, low)                                                *
375 *   M_LDAH(REG_PV, REG_RA, high)     ; optional                                *
376 *   or                                                                         *
377 *   M_LDQ (REG_PV, REG_METHODPTR, m) ; invokevirtual/interface ($28)           *
378 *   in the static case the method pointer can be computed using the            *
379 *   return address and the lda function following the jmp instruction          *
380 *                                                                              *
381 *******************************************************************************/
382
383
384         .ent    asm_call_jit_compiler
385 asm_call_jit_compiler:
386
387         ldgp    gp,0(pv)
388         ldl     t8,-8(ra)             /* load instruction LDQ PV,xxx($yy)         */
389         srl     t8,16,t8              /* shift right register number $yy          */
390         and     t8,31,t8              /* isolate register number                  */
391         subl    t8,28,t8              /* test for REG_METHODPTR                   */
392         beq     t8,noregchange       
393         ldl     t8,0(ra)              /* load instruction LDA PV,xxx(RA)          */
394         sll     t8,48,t8
395         sra     t8,48,t8              /* isolate offset                           */
396         addq    t8,ra,$28             /* compute update address                   */
397         ldl     t8,4(ra)              /* load instruction LDAH PV,xxx(PV)         */
398         srl     t8,16,t8              /* isolate instruction code                 */
399         lda     t8,-0x177b(t8)        /* test for LDAH                            */
400         bne     t8,noregchange       
401         ldl     t8,4(ra)              /* load instruction LDAH PV,xxx(PV)         */
402         sll     t8,16,t8              /* compute high offset                      */
403         addl    t8,0,t8               /* sign extend high offset                  */
404         addq    t8,$28,$28            /* compute update address                   */
405 noregchange:
406         lda     sp,-14*8(sp)          /* reserve stack space                      */
407         stq     a0,0*8(sp)            /* save all argument registers              */
408         stq     a1,1*8(sp)            /* they could be used by method             */
409         stq     a2,2*8(sp)
410         stq     a3,3*8(sp)
411         stq     a4,4*8(sp)
412         stq     a5,5*8(sp)
413         stt     $f16,6*8(sp)
414         stt     $f17,7*8(sp)
415         stt     $f18,8*8(sp)
416         stt     $f19,9*8(sp)
417         stt     $f20,10*8(sp)
418         stt     $f21,11*8(sp)
419         stq     $28,12*8(sp)          /* save method pointer                      */
420         stq     ra,13*8(sp)           /* save return address                      */
421
422         ldq     a0,0(v0)              /* pass 'methodinfo' pointer to             */
423         jsr     ra,jit_compile        /* jit compiler                             */
424         ldgp    gp,0(ra)
425
426         call_pal PAL_imb              /* synchronise instruction cache            */
427
428         ldq     a0,0*8(sp)            /* load argument registers                  */
429         ldq     a1,1*8(sp)
430         ldq     a2,2*8(sp)
431         ldq     a3,3*8(sp)
432         ldq     a4,4*8(sp)
433         ldq     a5,5*8(sp)
434         ldt     $f16,6*8(sp)
435         ldt     $f17,7*8(sp)
436         ldt     $f18,8*8(sp)
437         ldt     $f19,9*8(sp)
438         ldt     $f20,10*8(sp)
439         ldt     $f21,11*8(sp)
440         ldq     $28,12*8(sp)          /* load method pointer                      */
441         ldq     ra,13*8(sp)           /* load return address                      */
442         lda     sp,14*8(sp)           /* deallocate stack area                    */
443
444         ldl     t8,-8(ra)             /* load instruction LDQ PV,xxx($yy)         */
445         sll     t8,48,t8
446         sra     t8,48,t8              /* isolate offset                           */
447
448         addq    t8,$28,t8             /* compute update address via method pointer*/
449         stq     v0,0(t8)              /* save new method address there            */
450
451         mov     v0,pv                 /* load method address into pv              */
452
453         jmp     zero,(pv)             /* and call method. The method returns      */
454                                       /* directly to the caller (ra).             */
455
456         .end    asm_call_jit_compiler
457
458
459 /********************* function asm_handle_exception ***************************
460 *                                                                              *
461 *   This function handles an exception. It does not use the usual calling      *
462 *   conventions. The exception pointer is passed in REG_ITMP1 and the          *
463 *   pc from the exception raising position is passed in REG_ITMP2. It searches *
464 *   the local exception table for a handler. If no one is found, it unwinds    *
465 *   stacks and continues searching the callers.                                *
466 *                                                                              *
467 *   void asm_handle_exception (exceptionptr, exceptionpc);                     *
468 *                                                                              *
469 *******************************************************************************/
470
471         .ent    asm_handle_nat_exception
472 asm_handle_nat_exception:
473         ldl     t0,0(ra)              /* load instruction LDA PV,xxx(RA)          */
474         sll     t0,48,t0
475         sra     t0,48,t0              /* isolate offset                           */
476         addq    t0,ra,pv              /* compute update address                   */
477         ldl     t0,4(ra)              /* load instruction LDAH PV,xxx(PV)         */
478         srl     t0,16,t0              /* isolate instruction code                 */
479         lda     t0,-0x177b(t0)        /* test for LDAH                            */
480         bne     t0,asm_handle_exception       
481         ldl     t0,4(ra)              /* load instruction LDAH PV,xxx(PV)         */
482         sll     t0,16,t0              /* compute high offset                      */
483         addl    t0,0,t0               /* sign extend high offset                  */
484         addq    t0,pv,pv              /* compute update address                   */
485
486         .aent    asm_handle_exception
487 asm_handle_exception:
488         lda     sp,-18*8(sp)          /* allocate stack                           */
489         stq     t0,0*8(sp)            /* save possible used registers             */
490         stq     t1,1*8(sp)            /* also registers used by trace_exception   */
491         stq     t2,2*8(sp)
492         stq     t3,3*8(sp)
493         stq     t4,4*8(sp)
494         stq     t5,5*8(sp)
495         stq     t6,6*8(sp)
496         stq     t7,7*8(sp)
497         stq     t8,8*8(sp)
498         stq     t9,9*8(sp)
499         stq     t10,10*8(sp)
500         stq     v0,11*8(sp)
501         stq     a0,12*8(sp)
502         stq     a1,13*8(sp)
503         stq     a2,14*8(sp)
504         stq     a3,15*8(sp)
505         stq     a4,16*8(sp)
506         stq     a5,17*8(sp)
507
508         lda     t3,1(zero)            /* set no unwind flag                       */
509 ex_stack_loop:
510         lda     sp,-5*8(sp)           /* allocate stack                           */
511         stq     xptr,0*8(sp)          /* save used register                       */
512         stq     xpc,1*8(sp)
513         stq     pv,2*8(sp)
514         stq     ra,3*8(sp)
515         stq     t3,4*8(sp)
516
517         mov     xptr,a0
518         ldq     a1,MethodPointer(pv)
519         mov     xpc,a2
520 /*      mov     t3,a3 */
521         lda             a3,0(zero)
522         lda             a4,1(zero)
523         br      ra,ex_trace           /* set ra for gp loading                    */
524 ex_trace:
525         ldgp    gp,0(ra)              /* load gp                                  */
526         jsr     ra,builtin_trace_exception /* trace_exception(xptr,methodptr)     */
527         
528         ldq     xptr,0*8(sp)          /* restore used register                    */
529         ldq     xpc,1*8(sp)
530         ldq     pv,2*8(sp)
531         ldq     ra,3*8(sp)
532         ldq     t3,4*8(sp)
533         lda     sp,5*8(sp)            /* deallocate stack                         */
534         
535         ldl     t0,ExTableSize(pv)    /* t0 = exception table size                */
536         beq     t0,empty_table        /* if empty table skip                      */
537
538         lda     t1,ExTableStart(pv)   /* t1 = start of exception table            */
539
540 ex_table_loop:
541         ldq     t2,ExStartPC(t1)      /* t2 = exception start pc                  */
542         cmple   t2,xpc,t2             /* t2 = (startpc <= xpc)                    */
543         beq     t2,ex_table_cont      /* if (false) continue                      */
544         ldq     t2,ExEndPC(t1)        /* t2 = exception end pc                    */
545         cmplt   xpc,t2,t2             /* t2 = (xpc < endpc)                       */
546         beq     t2,ex_table_cont      /* if (false) continue                      */
547         ldq     a1,ExCatchType(t1)    /* arg1 = exception catch type              */
548         beq     a1,ex_handle_it       /* NULL catches everything                  */
549
550         ldl     itmp3,offclassloaded(a1)
551         bne     itmp3,L_class_loaded
552
553         subq    sp,8*8,sp             /* allocate stack                           */
554         stq     t0,0*8(sp)            /* save used register                       */
555         stq     t1,1*8(sp)
556         stq     t3,2*8(sp)
557         stq     xptr,3*8(sp)
558         stq     xpc,4*8(sp)
559         stq     pv,5*8(sp)
560         stq     ra,6*8(sp)
561         stq     a1,7*8(sp)
562
563         mov     a1,a0
564
565         br      ra,L_class_load_ra    /* set ra for gp loading                    */
566 L_class_load_ra:
567         ldgp    gp,0(ra)              /* load gp                                  */
568         jsr     ra,class_load         /* class_load(exceptionclass)               */
569
570         ldq     t0,0*8(sp)            /* restore used register                    */
571         ldq     t1,1*8(sp)
572         ldq     t3,2*8(sp)
573         ldq     xptr,3*8(sp)
574         ldq     xpc,4*8(sp)
575         ldq     pv,5*8(sp)
576         ldq     ra,6*8(sp)
577         ldq     a1,7*8(sp)
578         addq    sp,8*8,sp             /* deallocate stack                         */
579
580 L_class_loaded:
581         ldl     itmp3,offclasslinked(a1)
582         subq    sp,8*8,sp             /* allocate stack                           */
583         stq     a1,7*8(sp)
584         bne     itmp3,L_class_linked
585
586         stq     t0,0*8(sp)            /* save used register                       */
587         stq     t1,1*8(sp)
588         stq     t3,2*8(sp)
589         stq     xptr,3*8(sp)
590         stq     xpc,4*8(sp)
591         stq     pv,5*8(sp)
592         stq     ra,6*8(sp)
593
594         mov     a1,a0
595
596         br      ra,L_class_link_ra    /* set ra for gp loading                    */
597 L_class_link_ra:
598         ldgp    gp,0(ra)              /* load gp                                  */
599         jsr     ra,class_link         /* class_load(exceptionclass)               */
600
601         ldq     t0,0*8(sp)            /* restore used register                    */
602         ldq     t1,1*8(sp)
603         ldq     t3,2*8(sp)
604         ldq     xptr,3*8(sp)
605         ldq     xpc,4*8(sp)
606         ldq     pv,5*8(sp)
607         ldq     ra,6*8(sp)
608
609 L_class_linked:
610 _crit_restart1:
611         ldq     a1,7*8(sp)
612 _crit_begin1:
613         ldq     a0,offobjvftbl(xptr)  /* a0 = vftblptr(xptr)                      */
614         ldq     a1,offclassvftbl(a1)  /* a1 = vftblptr(catchtype) class (not obj) */
615         ldl     a0,offbaseval(a0)     /* a0 = baseval(xptr)                       */
616         ldl     v0,offbaseval(a1)     /* a2 = baseval(catchtype)                  */
617         ldl     a1,offdiffval(a1)     /* a1 = diffval(catchtype)                  */
618 _crit_end1:
619         subl    a0,v0,a0              /* a0 = baseval(xptr) - baseval(catchtype)  */
620         cmpule  a0,a1,v0              /* v0 = xptr is instanceof catchtype        */
621         addq    sp,8*8,sp             /* deallocate stack                         */
622         beq     v0,ex_table_cont      /* if (false) continue                      */
623
624 ex_handle_it:
625         ldq     xpc,ExHandlerPC(t1)   /* xpc = exception handler pc               */
626
627         beq     t3,ex_jump            /* if (!(no stack unwinding) skip           */
628
629         ldq     t0,0*8(sp)            /* restore possible used registers          */
630         ldq     t1,1*8(sp)            /* also registers used by trace_exception   */
631         ldq     t2,2*8(sp)
632         ldq     t3,3*8(sp)
633         ldq     t4,4*8(sp)
634         ldq     t5,5*8(sp)
635         ldq     t6,6*8(sp)
636         ldq     t7,7*8(sp)
637         ldq     t8,8*8(sp)
638         ldq     t9,9*8(sp)
639         ldq     t10,10*8(sp)
640         ldq     v0,11*8(sp)
641         ldq     a0,12*8(sp)
642         ldq     a1,13*8(sp)
643         ldq     a2,14*8(sp)
644         ldq     a3,15*8(sp)
645         ldq     a4,16*8(sp)
646         ldq     a5,17*8(sp)
647         lda     sp,18*8(sp)           /* deallocate stack                         */
648
649 ex_jump:
650         jmp     zero,(xpc)            /* jump to the handler                      */
651
652 ex_table_cont:
653         lda     t1,ExEntrySize(t1)    /* next exception table entry               */
654         subl    t0,1,t0               /* decrement entry counter                  */
655         bgt     t0,ex_table_loop      /* if (t0 > 0) next entry                   */
656
657 empty_table:
658         beq     t3,ex_already_cleared /* if here the first time, then             */
659         lda     sp,18*8(sp)           /* deallocate stack and                     */
660         clr     t3                    /* clear the no unwind flag                 */
661 ex_already_cleared:
662         ldl     t0,IsSync(pv)         /* t0 = SyncOffset                          */
663         beq     t0,no_monitor_exit    /* if zero no monitorexit                   */
664         addq    sp,t0,t0              /* add stackptr to Offset                   */
665         ldq     a0,-8(t0)             /* load monitorexit pointer                 */
666
667         lda     sp,-7*8(sp)           /* allocate stack                           */
668         stq     t0,0*8(sp)            /* save used register                       */
669         stq     t1,1*8(sp)
670         stq     t3,2*8(sp)
671         stq     xptr,3*8(sp)
672         stq     xpc,4*8(sp)
673         stq     pv,5*8(sp)
674         stq     ra,6*8(sp)
675
676         br      ra,ex_mon_load        /* set ra for gp loading                    */
677 ex_mon_load:
678         ldgp    gp,0(ra)              /* load gp                                  */
679         jsr     ra,builtin_monitorexit/* builtin_monitorexit(objectptr)           */
680         
681         ldq     t0,0*8(sp)            /* restore used register                    */
682         ldq     t1,1*8(sp)
683         ldq     t3,2*8(sp)
684         ldq     xptr,3*8(sp)
685         ldq     xpc,4*8(sp)
686         ldq     pv,5*8(sp)
687         ldq     ra,6*8(sp)
688         lda     sp,7*8(sp)            /* deallocate stack                         */
689
690 no_monitor_exit:
691         ldl     t0,FrameSize(pv)      /* t0 = frame size                          */
692         addq    sp,t0,sp              /* unwind stack                             */
693         mov     sp,t0                 /* t0 = pointer to save area                */
694         ldl     t1,IsLeaf(pv)         /* t1 = is leaf procedure                   */
695         bne     t1,ex_no_restore      /* if (leaf) skip                           */
696         ldq     ra,-8(t0)             /* restore ra                               */
697         lda     t0,-8(t0)             /* t0--                                     */
698 ex_no_restore:
699         mov     ra,xpc                /* the new xpc is ra                        */
700         ldl     t1,IntSave(pv)        /* t1 = saved int register count            */
701         br      t2,ex_int1            /* t2 = current pc                          */
702 ex_int1:
703         lda     t2,44(t2)             /* lda t2,ex_int2-ex_int1(t2) !!!!!!!!!!!!! */
704         negl    t1,t1                 /* negate register count                    */
705         s4addq  t1,t2,t2              /* t2 = ex_int_sav - 4 * register count     */
706         jmp     zero,(t2)             /* jump to save position                    */
707         ldq     s0,-56(t0)
708         ldq     s1,-48(t0)
709         ldq     s2,-40(t0)
710         ldq     s3,-32(t0)
711         ldq     s4,-24(t0)
712         ldq     s5,-16(t0)
713         ldq     s6,-8(t0)
714 ex_int2:
715         s8addq  t1,t0,t0              /* t0 = t0 - 8 * register count             */
716
717         ldl     t1,FltSave(pv)        /* t1 = saved flt register count            */
718         br      t2,ex_flt1            /* t2 = current pc                          */
719 ex_flt1:
720         lda     t2,48(t2)             /* lda t2,ex_flt2-ex_flt1(t2) !!!!!!!!!!!!! */
721         negl    t1,t1                 /* negate register count                    */
722         s4addq  t1,t2,t2              /* t2 = ex_flt_sav - 4 * register count     */
723         jmp     zero,(t2)             /* jump to save position                    */
724         ldt     $f2,-64(t0)
725         ldt     $f3,-56(t0)
726         ldt     $f4,-48(t0)
727         ldt     $f5,-40(t0)
728         ldt     $f6,-32(t0)
729         ldt     $f7,-24(t0)
730         ldt     $f8,-16(t0)
731         ldt     $f9,-8(t0)
732 ex_flt2:
733         ldl     t0,0(ra)              /* load instruction LDA PV,xxx(RA)          */
734         sll     t0,48,t0
735         sra     t0,48,t0              /* isolate offset                           */
736         addq    t0,ra,pv              /* compute update address                   */
737         ldl     t0,4(ra)              /* load instruction LDAH PV,xxx(PV)         */
738         srl     t0,16,t0              /* isolate instruction code                 */
739         lda     t0,-0x177b(t0)        /* test for LDAH                            */
740         bne     t0,ex_stack_loop       
741         ldl     t0,4(ra)              /* load instruction LDAH PV,xxx(RA)         */
742         sll     t0,16,t0              /* compute high offset                      */
743         addl    t0,0,t0               /* sign extend high offset                  */
744         addq    t0,pv,pv              /* compute update address                   */
745         br      ex_stack_loop
746
747         .end    asm_handle_nat_exception
748
749
750 /********************* asm_check_clinit ****************************************
751 *                                                                              *
752 *   Does null check and calls monitorenter or throws an exception              *
753 *                                                                              *
754 *******************************************************************************/
755                 
756     .ent    asm_check_clinit
757
758 asm_check_clinit:
759         ldgp    gp,0(pv)
760
761         ldl             itmp2,offclassinit(itmp1)
762         bne             itmp2,L_is_initialized
763         
764         subq    sp,7*8,sp
765         stq             ra,0*8(sp)
766         stq             a0,1*8(sp)            /* save argument registers for leaf         */
767         stq             a1,2*8(sp)            /* functions and native stub                */
768         stq             a2,3*8(sp)
769         stq             a3,4*8(sp)
770         stq             a4,5*8(sp)
771         stq             a5,6*8(sp)
772                 
773         mov             itmp1,a0
774         jsr             ra,class_init
775                 
776         ldgp    gp,0(ra)
777         ldq             ra,0*8(sp)
778         ldq             a0,1*8(sp)            /* restore argument registers               */
779         ldq             a1,2*8(sp)
780         ldq             a2,3*8(sp)
781         ldq             a3,4*8(sp)
782         ldq             a4,5*8(sp)
783         ldq             a5,6*8(sp)
784         addq    sp,7*8,sp
785
786         beq     v0,L_initializererror
787
788 L_is_initialized:
789         mov     ra,itmp1              /* now patch the calling code               */
790         subq    itmp1,(3*4),itmp1     /* go back 3 instructions                   */
791         ldah    itmp2,-15392(zero)    /* br -- 0xc3e0 == -15392                   */
792         lda     itmp2,4(itmp2)        /* jump over 4 instructions                 */
793         stl     itmp2,0(itmp1)        /* store the new branch: br +4              */
794
795         jmp             zero,(ra)
796
797 L_initializererror:
798 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
799         subq    sp,1*8,sp
800         stq     ra,0*8(sp)
801         jsr     ra,builtin_asm_get_exceptionptrptr
802         ldq     ra,0*8(sp)
803         addq    sp,1*8,sp
804         ldq     xptr,0(v0)            /* get the exception pointer                */
805         stq     zero,0(v0)            /* clear the exception pointer              */
806 #else
807         lda     itmp3,_exceptionptr
808         ldq     xptr,0(itmp3)
809         stq     zero,0(itmp3)
810 #endif
811
812         subq    ra,4,xpc
813         br      asm_handle_nat_exception
814
815         .end    asm_check_clinit
816
817                 
818 /********************* function asm_builtin_monitorenter ***********************
819 *                                                                              *
820 *   Does null check and calls monitorenter or throws an exception              *
821 *                                                                              *
822 *******************************************************************************/
823
824         .ent    asm_builtin_monitorenter
825
826 asm_builtin_monitorenter:
827         ldgp    gp,0(pv)
828         lda     pv,builtin_monitorenter
829         beq     a0,nb_monitorenter        /* if (null) throw exception            */
830         jmp     zero,(pv)                 /* else call builtin_monitorenter       */
831
832 nb_monitorenter:
833         subq    sp,8,sp
834     stq     ra,0(sp)
835         ldq     a0,string_java_lang_NullPointerException
836     jsr     ra,new_exception
837     ldgp    gp,0(ra)
838         mov     v0,xptr
839     ldq     ra,0(sp)
840         addq    sp,8,sp
841         
842         lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
843         br      asm_handle_nat_exception
844
845         .end    asm_builtin_monitorenter
846
847
848 /********************* function asm_builtin_monitorexit ************************
849 *                                                                              *
850 *   Does null check and calls monitorexit or throws an exception               *
851 *                                                                              *
852 *******************************************************************************/
853
854         .ent    asm_builtin_monitorexit
855
856 asm_builtin_monitorexit:
857         ldgp    gp,0(pv)
858         lda     pv,builtin_monitorexit
859         beq     a0,nb_monitorexit         /* if (null) throw exception            */
860         jmp     zero,(pv)                 /* else call builtin_monitorexit        */
861
862 nb_monitorexit:
863         subq    sp,8,sp
864     stq     ra,0(sp)
865         ldq     a0,string_java_lang_NullPointerException
866     jsr     ra,new_exception
867     ldgp    gp,0(ra)
868         mov     v0,xptr
869     ldq     ra,0(sp)
870         addq    sp,8,sp
871         
872         lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
873         br      asm_handle_nat_exception
874
875         .end    asm_builtin_monitorexit
876
877
878 /************************ function asm_builtin_idiv ****************************
879 *                                                                              *
880 *   Does null check and calls idiv or throws an exception                      *
881 *                                                                              *
882 *******************************************************************************/
883
884         .ent    asm_builtin_idiv
885
886 asm_builtin_idiv:
887         ldgp    gp,0(pv)
888         lda     pv,builtin_idiv
889         beq     a1,nb_idiv                /* if (null) throw exception            */
890         jmp     zero,(pv)                 /* else call builtin_idiv               */
891
892 nb_idiv:
893         subq    sp,8,sp
894         stq     ra,0(sp)
895         ldq     a0,string_java_lang_ArithmeticException
896         ldq     a1,string_java_lang_ArithmeticException_message
897         jsr     ra,new_exception_message
898         ldgp    gp,0(ra)
899         mov     v0,xptr
900         ldq     ra,0(sp)
901         addq    sp,8,sp
902         
903         lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
904         br      asm_handle_nat_exception
905
906         .end    asm_builtin_idiv
907
908
909 /************************ function asm_builtin_ldiv ****************************
910 *                                                                              *
911 *   Does null check and calls ldiv or throws an exception                      *
912 *                                                                              *
913 *******************************************************************************/
914
915         .ent    asm_builtin_ldiv
916
917 asm_builtin_ldiv:
918         ldgp    gp,0(pv)
919         lda     pv,builtin_ldiv
920         beq     a1,nb_ldiv                /* if (null) throw exception            */
921         jmp     zero,(pv)                 /* else call builtin_ldiv               */
922
923 nb_ldiv:
924         subq    sp,8,sp
925         stq     ra,0(sp)
926         ldq     a0,string_java_lang_ArithmeticException
927         ldq     a1,string_java_lang_ArithmeticException_message
928         jsr     ra,new_exception_message
929         ldgp    gp,0(ra)
930         mov     v0,xptr
931         ldq     ra,0(sp)
932         addq    sp,8,sp
933
934         lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
935         br      asm_handle_nat_exception
936
937         .end    asm_builtin_ldiv
938
939
940 /************************ function asm_builtin_irem ****************************
941 *                                                                              *
942 *   Does null check and calls irem or throws an exception                      *
943 *                                                                              *
944 *******************************************************************************/
945
946         .ent    asm_builtin_irem
947
948 asm_builtin_irem:
949         ldgp    gp,0(pv)
950         lda     pv,builtin_irem
951         beq     a1,nb_irem                /* if (null) throw exception            */
952         jmp     zero,(pv)                 /* else call builtin_irem               */
953
954 nb_irem:
955         subq    sp,8,sp
956         stq     ra,0(sp)
957         ldq     a0,string_java_lang_ArithmeticException
958         ldq     a1,string_java_lang_ArithmeticException_message
959         jsr     ra,new_exception_message
960         ldgp    gp,0(ra)
961         mov     v0,xptr
962         ldq     ra,0(sp)
963         addq    sp,8,sp
964
965         lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
966         br      asm_handle_nat_exception
967
968         .end    asm_builtin_irem
969
970
971 /************************ function asm_builtin_lrem ****************************
972 *                                                                              *
973 *   Does null check and calls lrem or throws an exception                      *
974 *                                                                              *
975 *******************************************************************************/
976
977         .ent    asm_builtin_lrem
978
979 asm_builtin_lrem:
980         ldgp    gp,0(pv)
981         lda     pv,builtin_lrem
982         beq     a1,nb_lrem                /* if (null) throw exception            */
983         jmp     zero,(pv)                 /* else call builtin_lrem               */
984
985 nb_lrem:
986         subq    sp,8,sp
987         stq     ra,0(sp)
988         ldq     a0,string_java_lang_ArithmeticException
989         ldq     a1,string_java_lang_ArithmeticException_message
990         jsr     ra,new_exception_message
991         ldgp    gp,0(ra)
992         mov     v0,xptr
993         ldq     ra,0(sp)
994         addq    sp,8,sp
995
996         lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
997         br      asm_handle_nat_exception
998
999         .end    asm_builtin_lrem
1000
1001
1002 /******************* function asm_builtin_checkarraycast ***********************
1003 *                                                                              *
1004 *   Does the cast check and eventually throws an exception                     *
1005 *                                                                              *
1006 *******************************************************************************/
1007
1008         .ent    asm_builtin_checkarraycast
1009
1010 asm_builtin_checkarraycast:
1011         ldgp    gp,0(pv)
1012         lda     sp,-16(sp)                /* allocate stack space                 */
1013         stq     ra,0(sp)                  /* save return address                  */
1014         stq     a0,8(sp)                  /* save object pointer                  */
1015         jsr     ra,builtin_checkarraycast /* builtin_checkarraycast               */
1016         ldgp    gp,0(ra)
1017         beq     v0,nb_carray_throw        /* if (false) throw exception           */
1018         ldq     ra,0(sp)                  /* restore return address               */
1019         ldq     v0,8(sp)                  /* return object pointer                */
1020         lda     sp,16(sp)                 /* free stack space                     */
1021         jmp     zero,(ra)
1022
1023 nb_carray_throw:
1024         ldq     a0,string_java_lang_ClassCastException
1025     jsr     ra,new_exception
1026     ldgp    gp,0(ra)
1027         mov     v0,xptr
1028
1029         ldq     ra,0(sp)                  /* restore return address               */
1030         lda     sp,16(sp)                 /* free stack space                     */
1031         lda     xpc,-4(ra)                /* faulting address is return adress - 4*/
1032         br      asm_handle_nat_exception
1033
1034         .end    asm_builtin_checkarraycast
1035
1036
1037 /******************* function asm_builtin_aastore ******************************
1038 *                                                                              *
1039 *   Does the cast check and eventually throws an exception                     *
1040 *                                                                              *
1041 *******************************************************************************/
1042
1043         .ent    asm_builtin_aastore
1044
1045 asm_builtin_aastore:
1046         ldgp    gp,0(pv)
1047         beq     a0,nb_aastore_null        /* if null pointer throw exception      */
1048         ldl     t0,offarraysize(a0)       /* load size                            */
1049         lda     sp,-24(sp)                /* allocate stack space                 */
1050         stq     ra,0(sp)                  /* save return address                  */
1051         s8addq  a1,a0,t1                  /* add index*8 to arrayref              */
1052         cmpult  a1,t0,t0                  /* do bound check                       */
1053         beq     t0,nb_aastore_bound       /* if out of bounds throw exception     */
1054         mov     a2,a1                     /* object is second argument            */
1055         stq     t1,8(sp)                  /* save store position                  */
1056         stq     a1,16(sp)                 /* save object                          */
1057         jsr     ra,builtin_canstore       /* builtin_canstore(arrayref,object)    */
1058         ldgp    gp,0(ra)
1059         ldq     ra,0(sp)                  /* restore return address               */
1060         ldq     a0,8(sp)                  /* restore store position               */
1061         ldq     a1,16(sp)                 /* restore object                       */
1062         lda     sp,24(sp)                 /* free stack space                     */
1063         beq     v0,nb_aastore_throw       /* if (false) throw exception           */
1064         stq     a1,offobjarrdata(a0)      /* store objectptr in array             */
1065         jmp     zero,(ra)
1066
1067 nb_aastore_null:        
1068         subq    sp,8,sp                   /* allocate stack space                 */
1069         stq     ra,0(sp)                  /* save return address                  */
1070         ldq     a0,string_java_lang_NullPointerException
1071     jsr     ra,new_exception
1072     ldgp    gp,0(ra)
1073         mov     v0,xptr
1074         ldq     ra,0(sp)
1075         addq    sp,8,sp
1076
1077         mov     ra,xpc                    /* faulting address is return adress    */
1078         br      asm_handle_nat_exception
1079
1080 nb_aastore_bound:
1081         ldq     a0,string_java_lang_ArrayIndexOutOfBoundsException
1082     jsr     ra,new_exception_int      /* a1 already contains the index        */
1083     ldgp    gp,0(ra)
1084         mov     v0,xptr
1085
1086         ldq     ra,0(sp)                  /* restore return address               */
1087         lda     sp,24(sp)                 /* free stack space                     */
1088         mov     ra,xpc                    /* faulting address is return adress    */
1089         br      asm_handle_nat_exception
1090
1091 nb_aastore_throw:
1092         subq    sp,8,sp                   /* allocate stack space                 */
1093         stq     ra,0(sp)                  /* save return address                  */
1094         ldq     a0,string_java_lang_ArrayStoreException
1095     jsr     ra,new_exception
1096     ldgp    gp,0(ra)
1097         mov     v0,xptr
1098         ldq     ra,0(sp)
1099         addq    sp,8,sp
1100
1101         mov     ra,xpc                    /* faulting address is return adress    */
1102         br      asm_handle_nat_exception
1103
1104         .end    asm_builtin_aastore
1105
1106
1107 /******************* function asm_initialize_thread_stack **********************
1108 *                                                                              *
1109 *   initialized a thread stack                                                 *
1110 *                                                                              *
1111 *******************************************************************************/
1112
1113         .ent    asm_initialize_thread_stack
1114
1115 asm_initialize_thread_stack:
1116         lda     a1,-128(a1)
1117         stq     zero, 0(a1)
1118         stq     zero, 8(a1)
1119         stq     zero, 16(a1)
1120         stq     zero, 24(a1)
1121         stq     zero, 32(a1)
1122         stq     zero, 40(a1)
1123         stq     zero, 48(a1)
1124         stt     fzero, 56(a1)
1125         stt     fzero, 64(a1)
1126         stt     fzero, 72(a1)
1127         stt     fzero, 80(a1)
1128         stt     fzero, 88(a1)
1129         stt     fzero, 96(a1)
1130         stt     fzero, 104(a1)
1131         stt     fzero, 112(a1)
1132         stq     a0, 120(a1)
1133         mov     a1, v0
1134         jmp     zero,(ra)
1135
1136         .end    asm_initialize_thread_stack
1137
1138
1139 /******************* function asm_perform_threadswitch *************************
1140 *                                                                              *
1141 *   void asm_perform_threadswitch (u1 **from, u1 **to, u1 **stackTop);         *
1142 *                                                                              *
1143 *   performs a threadswitch                                                    *
1144 *                                                                              *
1145 *******************************************************************************/
1146
1147         .ent    asm_perform_threadswitch
1148
1149 asm_perform_threadswitch:
1150         subq    sp,128,sp
1151         stq     s0, 0(sp)
1152         stq     s1, 8(sp)
1153         stq     s2, 16(sp)
1154         stq     s3, 24(sp)
1155         stq     s4, 32(sp)
1156         stq     s5, 40(sp)
1157         stq     s6, 48(sp)
1158         stt     sf0, 56(sp)
1159         stt     sf1, 64(sp)
1160         stt     sf2, 72(sp)
1161         stt     sf3, 80(sp)
1162         stt     sf4, 88(sp)
1163         stt     sf5, 96(sp)
1164         stt     sf6, 104(sp)
1165         stt     sf7, 112(sp)
1166         stq     ra, 120(sp)
1167         stq     sp, 0(a0)
1168         stq     sp, 0(a2)
1169         ldq     sp, 0(a1)
1170         ldq     s0, 0(sp)
1171         ldq     s1, 8(sp)
1172         ldq     s2, 16(sp)
1173         ldq     s3, 24(sp)
1174         ldq     s4, 32(sp)
1175         ldq     s5, 40(sp)
1176         ldq     s6, 48(sp)
1177         ldt     sf0, 56(sp)
1178         ldt     sf1, 64(sp)
1179         ldt     sf2, 72(sp)
1180         ldt     sf3, 80(sp)
1181         ldt     sf4, 88(sp)
1182         ldt     sf5, 96(sp)
1183         ldt     sf6, 104(sp)
1184         ldt     sf7, 112(sp)
1185         ldq     ra, 120(sp)
1186         mov     ra, pv
1187         addq    sp, 128, sp
1188         jmp     zero,(ra)
1189
1190         .end    asm_perform_threadswitch
1191
1192
1193 /********************* function asm_switchstackandcall *************************
1194 *                                                                              *
1195 *  void *asm_switchstackandcall (void *stack, void *func, void **stacktopsave, *
1196 *                               void *p);                                      *
1197 *                                                                              *
1198 *   Switches to a new stack, calls a function and switches back.               *
1199 *       a0      new stack pointer                                              *
1200 *       a1      function pointer                                               *
1201 *               a2              pointer to variable where stack top should be stored           *
1202 *               a3      pointer to user data, is passed to the function                *
1203 *                                                                              *
1204 *******************************************************************************/
1205
1206
1207         .ent    asm_switchstackandcall
1208
1209 asm_switchstackandcall:
1210         lda     a0,-2*8(a0)     /* allocate new stack                                 */
1211         stq     ra,0(a0)        /* save return address on new stack                   */
1212         stq     sp,1*8(a0)      /* save old stack pointer on new stack                */
1213         stq sp,0(a2)        /* save old stack pointer to variable                 */
1214         mov     a0,sp           /* switch to new stack                                */
1215         
1216         mov     a1,pv           /* load function pointer                              */
1217         mov a3,a0           /* pass pointer */
1218         jmp     ra,(pv)         /* and call function                                  */
1219
1220         ldq     ra,0(sp)        /* load return address                                */
1221         ldq     sp,1*8(sp)      /* switch to old stack                                */
1222
1223         jmp     zero,(ra)       /* return                                             */
1224
1225         .end    asm_switchstackandcall
1226
1227         .ent    asm_getclassvalues_atomic
1228
1229 asm_getclassvalues_atomic:
1230 _crit_restart2:
1231 _crit_begin2:
1232         ldl     t0,offbaseval(a0)
1233         ldl     t1,offdiffval(a0)
1234         ldl     t2,offbaseval(a1)
1235 _crit_end2:
1236         stl     t0,offcast_super_baseval(a2)
1237         stl     t1,offcast_super_diffval(a2)
1238         stl     t2,offcast_sub_baseval(a2)
1239         jmp      zero,(ra)
1240
1241         .end    asm_getclassvalues_atomic
1242
1243     .data
1244
1245 asm_criticalsections:
1246 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
1247     .quad   _crit_begin1
1248     .quad   _crit_end1
1249     .quad   _crit_restart1
1250     .quad   _crit_begin2
1251     .quad   _crit_end2
1252     .quad   _crit_restart2
1253 #endif
1254     .quad   0
1255
1256
1257 /*
1258  * These are local overrides for various environment variables in Emacs.
1259  * Please do not remove this and leave it at the end of the file, where
1260  * Emacs will automagically detect them.
1261  * ---------------------------------------------------------------------
1262  * Local variables:
1263  * mode: asm
1264  * indent-tabs-mode: t
1265  * c-basic-offset: 4
1266  * tab-width: 4
1267  * End:
1268  */