GNU header update.
[cacao.git] / src / vm / jit / mips / asmpart.S
index e8eec972f0c0a9a79c0be03fa0051e52f90dde20..3966740d8bdf95336420f1951b7c8248e9a08588 100644 (file)
@@ -1,20 +1,40 @@
-/* -*- mode: asm; tab-width: 4 -*- */
-/****************************** asmpart.c **************************************
-*                                                                              *
-*   is an assembly language file, but called .c to fake the preprocessor.      *
-*   It contains the Java-C interface functions for Alpha processors.           *
-*                                                                              *
-*   Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst              *
-*                                                                              *
-*   See file COPYRIGHT for information on usage and disclaimer of warranties   *
-*                                                                              *
-*   Authors: Andreas  Krall      EMAIL: cacao@complang.tuwien.ac.at            *
-*                                                                              *
-*   Last Change: 1998/11/23                                                    *
-*                                                                              *
-*******************************************************************************/
+/* vm/jit/mips/asmpart.S - Java-C interface functions for mips
+
+   Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+   R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
+   C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
+   Institut f. Computersprachen - TU Wien
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.
+
+   Contact: cacao@complang.tuwien.ac.at
+
+   Authors: Andreas Krall
+
+   $Id: asmpart.S 1735 2004-12-07 14:33:27Z twisti $
+
+*/
+
+
+#include "config.h"
+#include "vm/jit/mips/offsets.h"
+#include "vm/jit/mips/asmoffsets.h"
 
-#include "offsets.h"
 
 #define zero    $0
 #define itmp1   $1
@@ -43,7 +63,7 @@
 #define s6      $22
 #define s7      $23
 
-#define t4      $24
+#define t8      $24
 #define itmp3   $25
 #define k0      $26
 #define k1      $27
 #define asll    dsll
 #define ashift  3
 
-#define MethodPointer   -8
-#define FrameSize       -12
-#define IsSync          -16
-#define IsLeaf          -20
-#define IntSave         -24
-#define FltSave         -28
-#define ExTableSize     -32
-#define ExTableStart    -32
-
-#define ExEntrySize     -32
-#define ExStartPC       -8
-#define ExEndPC         -16
-#define ExHandlerPC     -24
-#define ExCatchType     -32
-
 
        .text
        .set    noat
 
 /********************* exported functions and variables ***********************/
 
-       .globl has_no_x_instr_set
-       .globl synchronize_caches
        .globl asm_calljavafunction
+       .globl asm_calljavafunction2
+       .globl asm_calljavafunction2long
+       .globl asm_calljavafunction2double
        .globl asm_call_jit_compiler
        .globl asm_dumpregistersandcall
        .globl asm_handle_exception
        .globl asm_handle_nat_exception
+       .globl asm_check_clinit
        .globl asm_builtin_checkarraycast
        .globl asm_builtin_checkcast
        .globl asm_builtin_aastore
        .globl asm_perform_threadswitch
        .globl asm_initialize_thread_stack
        .globl asm_switchstackandcall
-       .globl asm_getcallingmethod
+       .globl asm_builtin_trace
+       .globl asm_builtin_exittrace
+       .globl asm_getclassvalues_atomic
+       .globl asm_criticalsections
+
+       .globl compare_and_swap
 
 
 /*************************** imported functions *******************************/
 
        .globl jit_compile
+       .globl _exceptionptr
        .globl builtin_monitorexit
        .globl builtin_throw_exception
        .globl builtin_trace_exception
        .globl class_java_lang_Object
 
 
-/*********************** function has_no_x_instr_set ***************************
-*                                                                              *
-*   determines if the byte support instruction set (21164a and higher)         *
-*   is available.                                                              *
-*                                                                              *
-*******************************************************************************/
-
-       .ent    has_no_x_instr_set
-has_no_x_instr_set:
-
-       move    v0,zero                   /* result code 0 (not used for MIPS)    */
-       j       ra                        /* return                               */
-
-       .end    has_no_x_instr_set
-
-
-/********************* function synchronize_caches ****************************/
-
-       .ent    synchronize_caches
-synchronize_caches:
-
-/*     li      a0,BCACHE          */     /* flush both caches                    */
-/*     li      v0,SYS_cacheflush  */     /* Syscall number for cacheflush()      */
-/*     syscall                    */     /* call cacheflush()                    */
-       j       ra                        /* return                               */
-
-       .end    synchronize_caches
-
-
-#if 0
-
-/********************* function asm_calljavafunction ****************************
+/********************* function asm_calljavafunction ***************************
 *                                                                              *
 *   This function calls a Java-method (which possibly needs compilation)       *
 *   with up to 4 address parameters.                                           *
@@ -219,24 +201,21 @@ synchronize_caches:
        .ent    asm_calljavafunction
 
 call_name:
-
-       .ascii  "calljavafunction\0\0"
-
        .align  3
+
        .dword  0                         /* catch type all                       */
        .dword  calljava_xhandler         /* handler pc                           */
        .dword  calljava_xhandler         /* end pc                               */
-       .dword  asm_calljavafunction        /* start pc                             */
+       .dword  asm_calljavafunction      /* start pc                             */
        .word   1                         /* extable size                         */
        .word   0                         /* fltsave                              */
        .word   0                         /* intsave                              */
        .word   0                         /* isleaf                               */
        .word   0                         /* IsSync                               */
-       .word   80                        /* frame size                           */
+       .word   10*8                      /* frame size                           */
        .dword  0                         /* method pointer (pointer to name)     */
 
 asm_calljavafunction:
-
        aaddiu  sp,sp,-10*8               /* allocate stack space                 */
        sd      ra,0(sp)                  /* save return address                  */
 
@@ -272,12 +251,13 @@ call_java_pc:
        jalr    pv                        /* call JIT compiler                    */
        nop
        aaddiu  pv,ra,-23*4               /* recompute procedure vector           */
+#if 0
        move    v0,zero                   /* clear return value (exception ptr)   */
+#else
+       nop
+#endif
 
-       .set    reorder
-       
 calljava_return:
-
        ld      ra,0(sp)                  /* restore return address               */
        ld      pv,3*8(sp)                /* restore procedure vector             */
 
@@ -287,18 +267,155 @@ calljava_return:
        ldc1    fss3,7*8(sp)
        ldc1    fss4,8*8(sp)
        ldc1    fss5,9*8(sp)
-       aaddiu  sp,sp,10*8                /* free stack space                     */
        j       ra                        /* return                               */
+       aaddiu  sp,sp,10*8                /* free stack space                     */
 
+       .set    reorder
+       
 calljava_xhandler:
-
        move    a0,itmp1                  
        jal     builtin_throw_exception
        b       calljava_return
 
        .end    asm_calljavafunction
 
-#endif
+
+       .ent    asm_calljavafunction2
+
+call_name2:
+       .align  3
+
+       .dword  0                         /* catch type all                       */
+       .dword  calljava_xhandler2        /* handler pc                           */
+       .dword  calljava_xhandler2        /* end pc                               */
+       .dword  asm_calljavafunction2     /* start pc                             */
+       .word   1                         /* extable size                         */
+       .word   0                         /* fltsave                              */
+       .word   1                         /* intsave                              */
+       .word   0                         /* isleaf                               */
+       .word   0                         /* IsSync                               */
+       .word   12*8                      /* frame size                           */
+       .dword  0                         /* method pointer (pointer to name)     */
+
+asm_calljavafunction2:
+asm_calljavafunction2double:
+asm_calljavafunction2long:
+       aaddiu  sp,sp,-12*8               /* allocate stack space (only 11 needed)*/
+       sd      ra,0(sp)                  /* save return address                  */
+
+       .set    noreorder
+       bal     call_java_pc2
+       sd      pv,1*8(sp)                /* procedure vector                     */
+call_java_pc2:
+       aaddiu  pv,ra,-4*4
+       sd      s7,3*8(sp)
+
+       .set    reorder
+       
+       sdc1    fss0,5*8(sp)              /* save non JavaABI saved flt registers */
+       sdc1    fss1,6*8(sp)
+       sdc1    fss2,7*8(sp)
+       sdc1    fss3,8*8(sp)
+       sdc1    fss4,9*8(sp)
+       sdc1    fss5,10*8(sp)
+       sd      a0,4*8(sp)                /* save method pointer for compiler     */
+       move    t0,a3
+       move    s7,a1
+
+       blez    s7,calljava_argsloaded
+       ald     a0,offjniitem(t0)
+       ldc1    fa0,offjniitem(t0)
+       daddi   s7,s7,-1
+       blez    s7,calljava_argsloaded
+
+       ald     a1,offjniitem+sizejniblock*1(t0)
+       ldc1    fa1,offjniitem+sizejniblock*1(t0)
+       daddi   s7,s7,-1
+       blez    s7,calljava_argsloaded
+
+       ald     a2,offjniitem+sizejniblock*2(t0)
+       ldc1    fa2,offjniitem+sizejniblock*2(t0)
+       daddi   s7,s7,-1
+       blez    s7,calljava_argsloaded
+
+       ald     a3,offjniitem+sizejniblock*3(t0)
+       ldc1    fa3,offjniitem+sizejniblock*3(t0)
+       daddi   s7,s7,-1
+       blez    s7,calljava_argsloaded
+
+       ald     a4,offjniitem+sizejniblock*4(t0)
+       ldc1    fa4,offjniitem+sizejniblock*4(t0)
+       daddi   s7,s7,-1
+       blez    s7,calljava_argsloaded
+
+       ald     a5,offjniitem+sizejniblock*5(t0)
+       ldc1    fa5,offjniitem+sizejniblock*5(t0)
+       daddi   s7,s7,-1
+       blez    s7,calljava_argsloaded
+
+       ald     a6,offjniitem+sizejniblock*6(t0)
+       ldc1    fa6,offjniitem+sizejniblock*6(t0)
+       daddi   s7,s7,-1
+       blez    s7,calljava_argsloaded
+
+       ald     a7,offjniitem+sizejniblock*7(t0)
+       ldc1    fa7,offjniitem+sizejniblock*7(t0)
+       daddi   s7,s7,-1
+               
+calljava_argsloaded:
+    move    t8,sp
+       blez    s7,calljava_nocopy
+       subu    t1,zero,s7
+       sll     t2,t1,3
+       daddu   sp,sp,t2
+       daddu   t2,t2,t8
+
+calljava_copyloop:
+    ald     t3,offjniitem+sizejniblock*8(t0)
+       ast     t3,0(t2)
+       ala     t1,1(t1)
+       ala     t0,sizejniblock(t0)
+       ala     t2,8(t2)
+       bnez    t1,calljava_copyloop
+
+calljava_nocopy:
+       ala     itmp1,32(t8)              /* pass pointer to methodptr via itmp1  */
+
+       ala     mptr,asm_call_jit_compiler/* fake virtual function call (2 instr) */
+       ast     mptr,16(sp)               /* store function address               */
+       ala     mptr,8(t8)                /* set method pointer                   */
+
+       .set    noreorder
+       
+       ald     pv,8(mptr)                /* method call as in Java               */
+       jalr    pv                        /* call JIT compiler                    */
+       nop
+       aaddiu  pv,ra,-76*4               /* recompute procedure vector           */
+
+calljava_return2:
+       ld      ra,0(sp)                  /* restore return address               */
+       ld      pv,8(sp)                  /* restore procedure vector             */
+       ld      s7,24(sp)
+
+       ldc1    fss0,5*8(sp)              /* restore non JavaABI saved flt regs   */
+       ldc1    fss1,6*8(sp)
+       ldc1    fss2,7*8(sp)
+       ldc1    fss3,8*8(sp)
+       ldc1    fss4,9*8(sp)
+       ldc1    fss5,10*8(sp)
+       j       ra                        /* return                               */
+       aaddiu  sp,sp,12*8                /* free stack space                     */
+
+       .set    reorder
+       
+calljava_xhandler2:
+    sll     s7,s7,3
+       aaddu   sp,s7,sp
+       move    a0,itmp1                  
+       jal     builtin_throw_exception
+       b       calljava_return2
+
+       .end    asm_calljavafunction2
 
 
 /****************** function asm_call_jit_compiler *****************************
@@ -326,8 +443,8 @@ calljava_xhandler:
 
 
        .ent    asm_call_jit_compiler
-asm_call_jit_compiler:
 
+asm_call_jit_compiler:
        lw      t0,-12(ra)            /* load instruction LD PV,xxx($y)           */
        srl     t0,t0,21              /* shift right register number $y           */
        and     t0,t0,31              /* isolate register number                  */
@@ -340,7 +457,6 @@ asm_call_jit_compiler:
        aaddu   mptr,t0,ra            /* compute update address                   */
 
 noregchange:
-
        aaddiu  sp,sp,-18*8           /* allocate stack space                     */
        sd      a0,0*8(sp)            /* save all argument registers              */
        sd      a1,1*8(sp)            /* they could be used by method             */
@@ -381,7 +497,7 @@ noregchange:
        ldc1    fa6,14*8(sp)
        ldc1    fa7,15*8(sp)
        ld      mptr,16*8(sp)         /* restore method pointer                   */
-       ld      ra,17*8(sp)           /* restore return address                      */
+       ld      ra,17*8(sp)           /* restore return address                   */
        aaddiu  sp,sp,18*8            /* deallocate stack area                    */
 
        lw      t0,-12(ra)            /* load instruction LDQ PV,xxx($yy)         */
@@ -399,44 +515,6 @@ noregchange:
        .end    asm_call_jit_compiler
 
 
-/****************** function asm_dumpregistersandcall **************************
-*                                                                              *
-*   This funtion saves all callee saved (address) registers and calls the      *
-*   function which is passed as parameter.                                     *
-*                                                                              *
-*   This function is needed by the garbage collector, which needs to access    *
-*   all registers which are stored on the stack. Unused registers are          *
-*   cleared to avoid interferances with the GC.                                *
-*                                                                              *
-*   void asm_dumpregistersandcall (functionptr f);                             *
-*                                                                              *
-*******************************************************************************/
-
-       .ent    asm_dumpregistersandcall
-asm_dumpregistersandcall:
-       aaddiu  sp,sp,-10*8           /* allocate stack                           */
-       sd      ra,0(sp)              /* save return address                      */
-
-       sd      s0,1*8(sp)            /* save all callee saved registers          */
-       sd      s1,2*8(sp)
-       sd      s2,3*8(sp)
-       sd      s3,4*8(sp)
-       sd      s4,5*8(sp)
-       sd      s5,6*8(sp)
-       sd      s6,7*8(sp)
-       sd      s7,8*8(sp)
-       sd      s8,9*8(sp)
-
-       move    itmp3,a0
-       jalr    itmp3                 /* and call function                        */
-
-       ld      ra,0(sp)              /* restore return address                   */
-       aaddiu  sp,sp,10*8            /* deallocate stack                         */
-       j       ra                    /* return                                   */
-
-       .end    asm_dumpregistersandcall
-
-
 /********************* function asm_handle_exception ***************************
 *                                                                              *
 *   This function handles an exception. It does not use the usual calling      *
@@ -450,23 +528,23 @@ asm_dumpregistersandcall:
 *******************************************************************************/
 
        .ent    asm_handle_nat_exception
-asm_handle_nat_exception:
 
+asm_handle_nat_exception:
        lw      t0,0(ra)              /* load instruction LDA PV,xxx(RA)          */
        sll     t0,t0,16
        sra     t0,t0,16              /* isolate offset                           */
        aaddu   pv,t0,ra              /* compute update address                   */
 
        .aent    asm_handle_exception
-asm_handle_exception:
 
+asm_handle_exception:
        aaddiu  sp,sp,-14*8           /* allocate stack                           */
        sd      v0,0*8(sp)            /* save possible used registers             */
        sd      t0,1*8(sp)            /* also registers used by trace_exception   */
        sd      t1,2*8(sp)
        sd      t2,3*8(sp)
        sd      t3,4*8(sp)
-       sd      t4,5*8(sp)
+       sd      t8,5*8(sp)
        sd      a0,6*8(sp)
        sd      a1,7*8(sp)
        sd      a2,8*8(sp)
@@ -488,7 +566,9 @@ ex_stack_loop:
        move    a0,xptr
        ald     a1,MethodPointer(pv)
        move    a2,xpc
-       move    a3,t3
+/*     move    a3,t3 */
+       move    a3,zero
+       addu    a4,zero,1
        jal     builtin_trace_exception /* trace_exception(xptr,methodptr)        */
        
        ld      xptr,0*8(sp)          /* restore used register                    */
@@ -504,25 +584,81 @@ ex_stack_loop:
 
 ex_table_loop:
        ald     t2,ExStartPC(t1)      /* t2 = exception start pc                  */
-       slt     t2,xpc,t2             /* t2 = (xpc < startpc)                     */
-       bnez    t2,ex_table_cont      /* if (true) continue                       */
+       sle     t2,t2,xpc             /* t2 = (startpc <= xpc)                    */
+       beqz    t2,ex_table_cont      /* if (false) continue                      */
        ald     t2,ExEndPC(t1)        /* t2 = exception end pc                    */
        slt     t2,xpc,t2             /* t2 = (xpc < endpc)                       */
        beqz    t2,ex_table_cont      /* if (false) continue                      */
        ald     a1,ExCatchType(t1)    /* arg1 = exception catch type              */
        beqz    a1,ex_handle_it       /* NULL catches everything                  */
 
+       lw      itmp3,offclassloaded(a1)
+       bnez    itmp3,L_class_loaded
+
+       aaddiu  sp,sp,-8*8            /* allocate stack                           */
+       sd      t0,0*8(sp)            /* save used register                       */
+       sd      t1,1*8(sp)
+       sd      t3,2*8(sp)
+       sd      xptr,3*8(sp)
+       sd      xpc,4*8(sp)
+       sd      pv,5*8(sp)
+       sd      ra,6*8(sp)
+       sd      a1,7*8(sp)
+               
+       move    a0,a1
+       jal     class_load
+               
+       ld      t0,0*8(sp)            /* restore used register                    */
+       ld      t1,1*8(sp)
+       ld      t3,2*8(sp)
+       ld      xptr,3*8(sp)
+       ld      xpc,4*8(sp)
+       ld      pv,5*8(sp)
+       ld      ra,6*8(sp)
+       ld      a1,7*8(sp)
+       aaddiu  sp,sp,8*8             /* deallocate stack                         */
+       
+L_class_loaded:
+       lw      itmp3,offclasslinked(a1)
+       aaddiu  sp,sp,-8*8            /* allocate stack                           */
+       sd      a1,7*8(sp)
+       bnez    itmp3,L_class_linked
+
+       sd      t0,0*8(sp)            /* save used register                       */
+       sd      t1,1*8(sp)
+       sd      t3,2*8(sp)
+       sd      xptr,3*8(sp)
+       sd      xpc,4*8(sp)
+       sd      pv,5*8(sp)
+       sd      ra,6*8(sp)
+               
+       move    a0,a1
+       jal     class_link
+               
+       ld      t0,0*8(sp)            /* restore used register                    */
+       ld      t1,1*8(sp)
+       ld      t3,2*8(sp)
+       ld      xptr,3*8(sp)
+       ld      xpc,4*8(sp)
+       ld      pv,5*8(sp)
+       ld      ra,6*8(sp)
+
+L_class_linked:
+_crit_restart1:
+       ld      a1,7*8(sp)
+_crit_begin1:
        ald     a0,offobjvftbl(xptr)  /* a0 = vftblptr(xptr)                      */
-       ald     a1,offobjvftbl(a1)    /* a1 = vftblptr(catchtype) class (not obj) */
+       ald     a1,offclassvftbl(a1)  /* a1 = vftblptr(catchtype) class (not obj) */
        lw      a0,offbaseval(a0)     /* a0 = baseval(xptr)                       */
        lw      v0,offbaseval(a1)     /* a2 = baseval(catchtype)                  */
        lw      a1,offdiffval(a1)     /* a1 = diffval(catchtype)                  */
+_crit_end1:
        subu    a0,a0,v0              /* a0 = baseval(xptr) - baseval(catchtype)  */
        sltu    v0,a1,a0              /* v0 = xptr is instanceof catchtype        */
+       aaddiu  sp,sp,8*8             /* deallocate stack                         */
        bnez    v0,ex_table_cont      /* if (false) continue                      */
 
 ex_handle_it:
-
        ald     xpc,ExHandlerPC(t1)   /* xpc = exception handler pc               */
 
        beqz    t3,ex_jump            /* if (!(no stack unwinding) skip           */
@@ -532,7 +668,7 @@ ex_handle_it:
        ld      t1,2*8(sp)
        ld      t2,3*8(sp)
        ld      t3,4*8(sp)
-       ld      t4,5*8(sp)
+       ld      t8,5*8(sp)
        ld      a0,6*8(sp)
        ld      a1,7*8(sp)
        ld      a2,8*8(sp)
@@ -628,6 +764,141 @@ ex_flt2:
        .end    asm_handle_nat_exception
 
 
+/********************* asm_check_clinit ****************************************
+*                                                                              *
+*   Checks if class is initialized. If not, do it right now.                   *
+*                                                                              *
+*******************************************************************************/
+               
+    .ent    asm_check_clinit
+
+asm_check_clinit:
+       daddiu  sp,sp,-24*8
+
+       sd      ra,0*8(sp)            /* save return address                      */
+
+       sd      a0,1*8(sp)            /* save argument registers for leaf funcs   */
+       sd      a1,2*8(sp)
+       sd      a2,3*8(sp)
+       sd      a3,4*8(sp)
+       sd      a4,5*8(sp)
+       sd      a5,6*8(sp)
+       sd      a6,7*8(sp)
+       sd      a7,8*8(sp)
+
+       sd      t0,9*8(sp)
+       sd      t1,10*8(sp)
+       sd      t2,11*8(sp)
+       sd      t3,12*8(sp)
+       sd      t8,13*8(sp)
+
+       sdc1    fa0,14*8(sp)
+       sdc1    fa1,15*8(sp)
+       sdc1    fa2,16*8(sp)
+       sdc1    fa3,17*8(sp)
+       sdc1    fa4,18*8(sp)
+       sdc1    fa5,19*8(sp)
+       sdc1    fa6,20*8(sp)
+       sdc1    fa7,21*8(sp)
+
+       sd      itmp2,22*8(sp)        /* save machine code                        */
+
+                                     /* check if class is initialized            */
+       lw      itmp3,offclassinit(itmp1)
+       bnez    itmp3,L_is_initialized
+       
+       move    a0,itmp1              /* move class pointer to a0                 */
+       jal     class_init
+               
+       beqz    v0,L_initializererror
+
+L_is_initialized:
+       ld      ra,0*8(sp)            /* get return address                       */
+       ld      itmp1,22*8(sp)        /* get machine code                         */
+
+       daddiu  ra,ra,-2*4            /* go back 2 instructions (jal + nop delay) */
+       sw      itmp1,0(ra)           /* patch first instruction                  */
+       dsrl32  itmp1,itmp1,0         /* get high 32 bit                          */
+       sw      itmp1,4(ra)           /* patch second instruction                 */
+
+       move    a0,ra                 /* start of flush area                      */
+       addiu   a1,zero,2*4           /* 2 instruction words long                 */
+       jal     docacheflush          /* flush!                                   */
+       
+       ld      ra,0*8(sp)            /* restore return address                   */
+
+       ld      a0,1*8(sp)            /* restore argument registers               */
+       ld      a1,2*8(sp)
+       ld      a2,3*8(sp)
+       ld      a3,4*8(sp)
+       ld      a4,5*8(sp)
+       ld      a5,6*8(sp)
+       ld      a6,7*8(sp)
+       ld      a7,8*8(sp)
+
+       ld      t0,9*8(sp)
+       ld      t1,10*8(sp)
+       ld      t2,11*8(sp)
+       ld      t3,12*8(sp)
+       ld      t8,13*8(sp)
+
+       ldc1    fa0,14*8(sp)
+       ldc1    fa1,15*8(sp)
+       ldc1    fa2,16*8(sp)
+       ldc1    fa3,17*8(sp)
+       ldc1    fa4,18*8(sp)
+       ldc1    fa5,19*8(sp)
+       ldc1    fa6,20*8(sp)
+       ldc1    fa7,21*8(sp)
+
+       daddiu  sp,sp,24*8
+
+       daddiu  ra,ra,-2*4            /* go back 2 instructions (jal + nop delay) */
+       jr      ra
+
+L_initializererror:
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+       jal     builtin_asm_get_exceptionptrptr
+#else
+       la      v0,_exceptionptr
+#endif
+       ld      xptr,0(v0)            /* get the exception pointer                */
+       sd      zero,0(v0)            /* clear the exception pointer              */
+
+       ld      ra,0*8(sp)            /* restore return address                   */
+
+       ld      a0,1*8(sp)            /* restore argument registers               */
+       ld      a1,2*8(sp)
+       ld      a2,3*8(sp)
+       ld      a3,4*8(sp)
+       ld      a4,5*8(sp)
+       ld      a5,6*8(sp)
+       ld      a6,7*8(sp)
+       ld      a7,8*8(sp)
+
+       ld      t0,9*8(sp)
+       ld      t1,10*8(sp)
+       ld      t2,11*8(sp)
+       ld      t3,12*8(sp)
+       ld      t8,13*8(sp)
+
+       ldc1    fa0,14*8(sp)
+       ldc1    fa1,15*8(sp)
+       ldc1    fa2,16*8(sp)
+       ldc1    fa3,17*8(sp)
+       ldc1    fa4,18*8(sp)
+       ldc1    fa5,19*8(sp)
+       ldc1    fa6,20*8(sp)
+       ldc1    fa7,21*8(sp)
+
+       daddiu  sp,sp,24*8
+
+       aaddiu  xpc,ra,-4             /* faulting address is return adress - 4    */
+       b       asm_handle_exception
+
+       .end    asm_check_clinit
+
+               
 /********************* function asm_builtin_monitorenter ***********************
 *                                                                              *
 *   Does null check and calls monitorenter or throws an exception              *
@@ -635,16 +906,24 @@ ex_flt2:
 *******************************************************************************/
 
        .ent    asm_builtin_monitorenter
-asm_builtin_monitorenter:
 
+asm_builtin_monitorenter:
        beqz    a0,nb_monitorenter        /* if (null) throw exception            */
        ala     t9,builtin_monitorenter   /* else call builtin_monitorenter       */
        j       t9
 
 nb_monitorenter:
-       ald     xptr,proto_java_lang_NullPointerException
+       daddiu  sp,sp,-2*8
+       sd      ra,0*8(sp)
+       ald     a0,string_java_lang_NullPointerException
+       jal     new_exception
+       move    xptr,v0
+       ld      ra,0*8(sp)
+       daddiu  sp,sp,2*8
+
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
+
        .end    asm_builtin_monitorenter
 
 
@@ -655,16 +934,23 @@ nb_monitorenter:
 *******************************************************************************/
 
        .ent    asm_builtin_monitorexit
-asm_builtin_monitorexit:
 
+asm_builtin_monitorexit:
        beqz    a0,nb_monitorexit         /* if (null) throw exception            */
        ala     t9,builtin_monitorexit    /* else call builtin_monitorexit        */
        j       t9
 
 nb_monitorexit:
-       ald     xptr,proto_java_lang_NullPointerException
+       daddiu  sp,sp,-2*8
+       sd      ra,0*8(sp)
+       jal     new_nullpointerexception
+       move    xptr,v0
+       ld      ra,0*8(sp)
+       daddiu  sp,sp,2*8
+
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
+
        .end    asm_builtin_monitorexit
 
 
@@ -675,16 +961,23 @@ nb_monitorexit:
 *******************************************************************************/
 
        .ent    asm_builtin_idiv
-asm_builtin_idiv:
 
+asm_builtin_idiv:
        beqz    a1,nb_idiv                /* if (null) throw exception            */
        ala     itmp3,builtin_idiv        /* else call builtin_idiv               */
        j       itmp3
 
 nb_idiv:
-       ald     xptr,proto_java_lang_ArithmeticException
+       daddiu  sp,sp,-2*8
+       sd      ra,0*8(sp)
+       jal     new_arithmeticexception
+       move    xptr,v0
+       ld      ra,0*8(sp)
+       daddiu  sp,sp,2*8
+
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
+
        .end    asm_builtin_idiv
 
 
@@ -695,16 +988,23 @@ nb_idiv:
 *******************************************************************************/
 
        .ent    asm_builtin_ldiv
-asm_builtin_ldiv:
 
+asm_builtin_ldiv:
        beqz    a1,nb_ldiv                /* if (null) throw exception            */
        ala     itmp3,builtin_ldiv        /* else call builtin_ldiv               */
        j       itmp3
 
 nb_ldiv:
-       ald     xptr,proto_java_lang_ArithmeticException
+       daddiu  sp,sp,-2*8
+       sd      ra,0*8(sp)
+       jal     new_arithmeticexception
+       move    xptr,v0
+       ld      ra,0*8(sp)
+       daddiu  sp,sp,2*8
+
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
+
        .end    asm_builtin_ldiv
 
 
@@ -715,16 +1015,23 @@ nb_ldiv:
 *******************************************************************************/
 
        .ent    asm_builtin_irem
-asm_builtin_irem:
 
+asm_builtin_irem:
        beqz    a1,nb_irem                /* if (null) throw exception            */
        ala     t9,builtin_irem           /* else call builtin_irem               */
        j       t9
 
 nb_irem:
-       ald     xptr,proto_java_lang_ArithmeticException
+       daddiu  sp,sp,-2*8
+       sd      ra,0*8(sp)
+       jal     new_arithmeticexception
+       move    xptr,v0
+       ld      ra,0*8(sp)
+       daddiu  sp,sp,2*8
+
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
+
        .end    asm_builtin_irem
 
 
@@ -735,16 +1042,23 @@ nb_irem:
 *******************************************************************************/
 
        .ent    asm_builtin_lrem
-asm_builtin_lrem:
 
+asm_builtin_lrem:
        beqz    a1,nb_lrem                /* if (null) throw exception            */
        ala     t9,builtin_lrem           /* else call builtin_lrem               */
        j       t9
 
 nb_lrem:
-       ald     xptr,proto_java_lang_ArithmeticException
+       daddiu  sp,sp,-2*8
+       sd      ra,0*8(sp)
+       jal     new_arithmeticexception
+       move    xptr,v0
+       ld      ra,0*8(sp)
+       daddiu  sp,sp,2*8
+
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
+
        .end    asm_builtin_lrem
 
 
@@ -755,8 +1069,8 @@ nb_lrem:
 *******************************************************************************/
 
        .ent    asm_builtin_checkarraycast
-asm_builtin_checkarraycast:
 
+asm_builtin_checkarraycast:
        aaddiu  sp,sp,-16                 /* allocate stack space                 */
        sd      ra,0(sp)                  /* save return address                  */
        sd      a0,8(sp)                  /* save object pointer                  */
@@ -768,11 +1082,14 @@ asm_builtin_checkarraycast:
        j       ra                        /* return                               */
 
 nb_carray_throw:
-       ald     xptr,proto_java_lang_ClassCastException
+       jal     new_classcastexception
+       move    xptr,v0
+
        ld      ra,0(sp)                  /* restore return address               */
        aaddiu  sp,sp,16                  /* free stack space                     */
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
+
        .end    asm_builtin_checkarraycast
 
 
@@ -783,8 +1100,8 @@ nb_carray_throw:
 *******************************************************************************/
 
        .ent    asm_builtin_checkcast
-asm_builtin_checkcast:
 
+asm_builtin_checkcast:
        aaddiu  sp,sp,-16                 /* allocate stack space                 */
        sd      ra,0(sp)                  /* save return address                  */
        sd      a0,8(sp)                  /* save object pointer                  */
@@ -796,11 +1113,14 @@ asm_builtin_checkcast:
        j       ra                        /* return                               */
 
 nb_ccast_throw:
-       ald     xptr,proto_java_lang_ClassCastException
+       jal     new_classcastexception
+       move    xptr,v0
+
        ld      ra,0(sp)                  /* restore return address               */
        aaddiu  sp,sp,16                  /* free stack space                     */
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
+
        .end    asm_builtin_checkcast
 
 
@@ -812,8 +1132,8 @@ nb_ccast_throw:
 *******************************************************************************/
 
        .ent    asm_builtin_aastore
-asm_builtin_aastore:
 
+asm_builtin_aastore:
        beqz    a0,nb_aastore_null        /* if null pointer throw exception      */
        lw      t0,offarraysize(a0)       /* load size                            */
        aaddiu  sp,sp,-32                 /* allocate stack space                 */
@@ -830,23 +1150,42 @@ asm_builtin_aastore:
        ld      a0,8(sp)                  /* restore store position               */
        ld      a1,16(sp)                 /* restore object                       */
        aaddiu  sp,sp,32                  /* free stack space                     */
-       beqz    v0,nb_aastore_throw       /* if (false) throw exception           */
+       beqz    v0,nb_aastore_store       /* if (false) throw exception           */
        ast     a1,offobjarrdata(a0)      /* store objectptr in array             */
        j       ra                        /* return                               */
 
 nb_aastore_null:
-       ald     xptr,proto_java_lang_NullPointerException
+       daddiu  sp,sp,-2*8
+       sd      ra,0*8(sp)
+       jal     new_nullpointerexception
+       move    xptr,v0
+       ld      ra,0*8(sp)
+       daddiu  sp,sp,2*8
+       
        move    xpc,ra                    /* faulting address is return adress    */
        b       asm_handle_nat_exception
 
 nb_aastore_bound:
-       ald     xptr,proto_java_lang_ArrayIndexOutOfBoundsException
+       daddiu  sp,sp,-2*8
+       sd      ra,0*8(sp)
+       move    a0,a1                     /* move index into a0                   */
+       jal     new_arrayindexoutofboundsexception
+       move    xptr,v0
+       ld      ra,0*8(sp)
+       daddiu  sp,sp,2*8
+
        aaddiu  sp,sp,32                  /* free stack space                     */
        move    xpc,ra                    /* faulting address is return adress    */
        b       asm_handle_nat_exception
 
-nb_aastore_throw:
-       ald     xptr,proto_java_lang_ArrayStoreException
+nb_aastore_store:
+       daddiu  sp,sp,-2*8
+       sd      ra,0*8(sp)
+       jal     new_arraystoreexception
+       move    xptr,v0
+       ld      ra,0*8(sp)
+       daddiu  sp,sp,2*8
+
        move    xpc,ra                    /* faulting address is return adress    */
        b       asm_handle_nat_exception
 
@@ -862,8 +1201,8 @@ nb_aastore_throw:
 *******************************************************************************/
 
        .ent    asm_initialize_thread_stack
-asm_initialize_thread_stack:
 
+asm_initialize_thread_stack:
        aaddiu  a1,a1,-14*8     /* allocate save area                             */
        sd      zero, 0*8(a1)   /* s0 initalize thread area                       */
        sd      zero, 1*8(a1)   /* s1                                             */
@@ -881,6 +1220,7 @@ asm_initialize_thread_stack:
        sd      a0, 13*8(a1)
        move    v0,a1
        j       ra              /* return                                         */
+
        .end    asm_initialize_thread_stack
 
 
@@ -893,8 +1233,8 @@ asm_initialize_thread_stack:
 *******************************************************************************/
 
        .ent    asm_perform_threadswitch
-asm_perform_threadswitch:
 
+asm_perform_threadswitch:
        aaddiu  sp,sp,-14*8     /* allocate new stack                             */
        sd      s0,  0*8(sp)    /* save saved registers of old thread             */
        sd      s1,  1*8(sp)
@@ -930,6 +1270,7 @@ asm_perform_threadswitch:
        aaddiu  sp,sp,14*8      /* deallocate new stack                           */
        move    itmp3, ra
        j       ra              /* return                                         */
+
        .end    asm_perform_threadswitch
 
 
@@ -944,8 +1285,8 @@ asm_perform_threadswitch:
 *                                                                              *
 *******************************************************************************/
 
-
        .ent    asm_switchstackandcall
+
 asm_switchstackandcall:
        aaddiu  a0,a0,-16       /* allocate new stack                             */
        sd      ra,0(a0)        /* save return address on new stack               */
@@ -964,8 +1305,60 @@ asm_switchstackandcall:
 
        .end    asm_switchstackandcall
 
-       .ent    asm_getcallingmethod
-asm_getcallingmethod:
-       li      v0,0
+
+       .ent    asm_getclassvalues_atomic
+
+asm_getclassvalues_atomic:
+_crit_restart2:
+_crit_begin2:
+       lw      t0,offbaseval(a0)
+       lw      t1,offdiffval(a0)
+       lw      t2,offbaseval(a1)
+_crit_end2:
+       sw      t0,offcast_super_baseval(a2)
+       sw      t1,offcast_super_diffval(a2)
+       sw      t2,offcast_sub_baseval(a2)
        j       ra
-       .end    asm_getcallingmethod
+
+       .end    asm_getclassvalues_atomic
+
+    .data
+
+asm_criticalsections:
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
+    .dword  _crit_begin1
+    .dword  _crit_end1
+    .dword  _crit_restart1
+    .dword  _crit_begin2
+    .dword  _crit_end2
+    .dword  _crit_restart2
+#endif
+    .dword  0
+
+
+       .text
+
+       .ent    compare_and_swap
+compare_and_swap:
+1:
+       lld             v0,0(a0)
+       bne             v0,a1,2f
+       move    t0,a2
+       scd             t0,0(a0)
+       beqz    t0,1b
+2:
+       sync
+       j               ra
+       .end    compare_and_swap
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: asm
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */