GNU header update.
[cacao.git] / src / vm / jit / mips / asmpart.S
index c73b36727b06e1ec13433223d13d033ac71201ee..3966740d8bdf95336420f1951b7c8248e9a08588 100644 (file)
@@ -1,10 +1,9 @@
-/* jit/mips/asmpart.S - Java-C interface functions for mips
+/* vm/jit/mips/asmpart.S - Java-C interface functions for mips
 
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   Institut f. Computersprachen, TU Wien
-   R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
-   S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
-   J. Wenninger
+   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.
 
 
    Authors: Andreas Krall
 
-   $Id: asmpart.S 1281 2004-07-05 22:03:43Z twisti $
+   $Id: asmpart.S 1735 2004-12-07 14:33:27Z twisti $
 
 */
 
 
 #include "config.h"
-#include "offsets.h"
+#include "vm/jit/mips/offsets.h"
+#include "vm/jit/mips/asmoffsets.h"
 
 
 #define zero    $0
@@ -63,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 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
 
        .globl asm_getclassvalues_atomic
        .globl asm_criticalsections
 
-       .globl atomic_swap
        .globl compare_and_swap
 
 
        .ent    asm_calljavafunction
 
 call_name:
-       .ascii  "calljavafunction\0\0"
-
        .align  3
-       .quad   0                         /* catch type all                       */
-       .quad   calljava_xhandler         /* handler pc                           */
-       .quad   calljava_xhandler         /* end pc                               */
-       .quad   asm_calljavafunction      /* start pc                             */
-       .long   1                         /* extable size                         */
-       .long   0                         /* fltsave                              */
-       .long   0                         /* intsave                              */
-       .long   0                         /* isleaf                               */
-       .long   0                         /* IsSync                               */
-       .long   10*8                      /* frame size                           */
-       .quad   0                         /* method pointer (pointer to name)     */
+
+       .dword  0                         /* catch type all                       */
+       .dword  calljava_xhandler         /* handler pc                           */
+       .dword  calljava_xhandler         /* end pc                               */
+       .dword  asm_calljavafunction      /* start pc                             */
+       .word   1                         /* extable size                         */
+       .word   0                         /* fltsave                              */
+       .word   0                         /* intsave                              */
+       .word   0                         /* isleaf                               */
+       .word   0                         /* IsSync                               */
+       .word   10*8                      /* frame size                           */
+       .dword  0                         /* method pointer (pointer to name)     */
 
 asm_calljavafunction:
        aaddiu  sp,sp,-10*8               /* allocate stack space                 */
@@ -301,20 +283,19 @@ calljava_xhandler:
        .ent    asm_calljavafunction2
 
 call_name2:
-       .ascii  "calljavafunction2\0\0"
-
        .align  3
-       .quad   0                         /* catch type all                       */
-       .quad   calljava_xhandler2        /* handler pc                           */
-       .quad   calljava_xhandler2        /* end pc                               */
-       .quad   asm_calljavafunction2     /* start pc                             */
-       .long   1                         /* extable size                         */
-       .long   0                         /* fltsave                              */
-       .long   1                         /* intsave                              */
-       .long   0                         /* isleaf                               */
-       .long   0                         /* IsSync                               */
-       .long   96                        /* frame size                           */
-       .quad   0                         /* method pointer (pointer to name)     */
+
+       .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:
@@ -382,12 +363,12 @@ call_java_pc2:
        daddi   s7,s7,-1
                
 calljava_argsloaded:
-    move    t4,sp
+    move    t8,sp
        blez    s7,calljava_nocopy
        subu    t1,zero,s7
        sll     t2,t1,3
        daddu   sp,sp,t2
-       daddu   t2,t2,t4
+       daddu   t2,t2,t8
 
 calljava_copyloop:
     ald     t3,offjniitem+sizejniblock*8(t0)
@@ -398,11 +379,11 @@ calljava_copyloop:
        bnez    t1,calljava_copyloop
 
 calljava_nocopy:
-       ala     itmp1,32(t4)              /* pass pointer to methodptr via itmp1  */
+       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(t4)                /* set method pointer                   */
+       ala     mptr,8(t8)                /* set method pointer                   */
 
        .set    noreorder
        
@@ -563,7 +544,7 @@ asm_handle_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)
@@ -687,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)
@@ -792,11 +773,10 @@ ex_flt2:
     .ent    asm_check_clinit
 
 asm_check_clinit:
-       lw      itmp2,offclassinit(itmp1)
-       bnez    itmp2,L_is_initialized
-       
-       daddiu  sp,sp,-18*8
-       sd      ra,0*8(sp)
+       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)
@@ -805,19 +785,48 @@ asm_check_clinit:
        sd      a5,6*8(sp)
        sd      a6,7*8(sp)
        sd      a7,8*8(sp)
-       sdc1    fa0,9*8(sp)
-       sdc1    fa1,10*8(sp)
-       sdc1    fa2,11*8(sp)
-       sdc1    fa3,12*8(sp)
-       sdc1    fa4,13*8(sp)
-       sdc1    fa5,14*8(sp)
-       sdc1    fa6,15*8(sp)
-       sdc1    fa7,16*8(sp)
-
-       move    a0,itmp1
+
+       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
                
-       ld      ra,0*8(sp)
+       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)
@@ -826,41 +835,63 @@ asm_check_clinit:
        ld      a5,6*8(sp)
        ld      a6,7*8(sp)
        ld      a7,8*8(sp)
-       ldc1    fa0,9*8(sp)
-       ldc1    fa1,10*8(sp)
-       ldc1    fa2,11*8(sp)
-       ldc1    fa3,12*8(sp)
-       ldc1    fa4,13*8(sp)
-       ldc1    fa5,14*8(sp)
-       ldc1    fa6,15*8(sp)
-       ldc1    fa7,16*8(sp)
-       daddiu  sp,sp,18*8
 
-       beqz    v0,L_initializererror
+       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)
 
-L_is_initialized:
-       move    itmp1,ra              /* now patch the calling code               */
-       daddiu  itmp1,itmp1,-4*4      /* go back 4 instructions                   */
-       lui     itmp2,0x1000          /* b                                        */
-       daddiu  itmp2,itmp2,3         /* jump over 3 instructions                 */
-       sw      itmp2,0(itmp1)        /* store the new branch: br +3              */
-       sw      zero,4(itmp1)         /* and a nop delay slot                     */
+       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)
 
-       j       ra
+       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)
-       daddiu  sp,sp,-1*8
-       sd      ra,0*8(sp)
        jal     builtin_asm_get_exceptionptrptr
-       move    xptr,v0
-       ld      ra,0*8(sp)
-       daddiu  sp,sp,1*8
 #else
-       la      itmp3,_exceptionptr
-       ld      xptr,0(itmp3)
-       sd      zero,0(itmp3)
+       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
@@ -882,13 +913,13 @@ asm_builtin_monitorenter:
        j       t9
 
 nb_monitorenter:
-       daddiu  sp,sp,-1*8
+       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,1*8
+       daddiu  sp,sp,2*8
 
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
@@ -910,13 +941,12 @@ asm_builtin_monitorexit:
        j       t9
 
 nb_monitorexit:
-       daddiu  sp,sp,-1*8
+       daddiu  sp,sp,-2*8
        sd      ra,0*8(sp)
-       ald     a0,string_java_lang_NullPointerException
-       jal     new_exception
+       jal     new_nullpointerexception
        move    xptr,v0
        ld      ra,0*8(sp)
-       daddiu  sp,sp,1*8
+       daddiu  sp,sp,2*8
 
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
@@ -938,14 +968,12 @@ asm_builtin_idiv:
        j       itmp3
 
 nb_idiv:
-       daddiu  sp,sp,-1*8
+       daddiu  sp,sp,-2*8
        sd      ra,0*8(sp)
-       ald     a0,string_java_lang_ArithmeticException
-       ald     a1,string_java_lang_ArithmeticException_message
-       jal     new_exception_message
+       jal     new_arithmeticexception
        move    xptr,v0
        ld      ra,0*8(sp)
-       daddiu  sp,sp,1*8
+       daddiu  sp,sp,2*8
 
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
@@ -967,14 +995,12 @@ asm_builtin_ldiv:
        j       itmp3
 
 nb_ldiv:
-       daddiu  sp,sp,-1*8
+       daddiu  sp,sp,-2*8
        sd      ra,0*8(sp)
-       ald     a0,string_java_lang_ArithmeticException
-       ald     a1,string_java_lang_ArithmeticException_message
-       jal     new_exception_message
+       jal     new_arithmeticexception
        move    xptr,v0
        ld      ra,0*8(sp)
-       daddiu  sp,sp,1*8
+       daddiu  sp,sp,2*8
 
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
@@ -996,14 +1022,12 @@ asm_builtin_irem:
        j       t9
 
 nb_irem:
-       daddiu  sp,sp,-1*8
+       daddiu  sp,sp,-2*8
        sd      ra,0*8(sp)
-       ald     a0,string_java_lang_ArithmeticException
-       ald     a1,string_java_lang_ArithmeticException_message
-       jal     new_exception_message
+       jal     new_arithmeticexception
        move    xptr,v0
        ld      ra,0*8(sp)
-       daddiu  sp,sp,1*8
+       daddiu  sp,sp,2*8
 
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
@@ -1025,14 +1049,12 @@ asm_builtin_lrem:
        j       t9
 
 nb_lrem:
-       daddiu  sp,sp,-1*8
+       daddiu  sp,sp,-2*8
        sd      ra,0*8(sp)
-       ald     a0,string_java_lang_ArithmeticException
-       ald     a1,string_java_lang_ArithmeticException_message
-       jal     new_exception_message
+       jal     new_arithmeticexception
        move    xptr,v0
        ld      ra,0*8(sp)
-       daddiu  sp,sp,1*8
+       daddiu  sp,sp,2*8
 
        aaddiu  xpc,ra,-4                 /* faulting address is return adress - 4*/
        b       asm_handle_nat_exception
@@ -1060,8 +1082,7 @@ asm_builtin_checkarraycast:
        j       ra                        /* return                               */
 
 nb_carray_throw:
-       ald     a0,string_java_lang_ClassCastException
-       jal     new_exception
+       jal     new_classcastexception
        move    xptr,v0
 
        ld      ra,0(sp)                  /* restore return address               */
@@ -1092,8 +1113,7 @@ asm_builtin_checkcast:
        j       ra                        /* return                               */
 
 nb_ccast_throw:
-       ald     a0,string_java_lang_ClassCastException
-       jal     new_exception
+       jal     new_classcastexception
        move    xptr,v0
 
        ld      ra,0(sp)                  /* restore return address               */
@@ -1135,38 +1155,36 @@ asm_builtin_aastore:
        j       ra                        /* return                               */
 
 nb_aastore_null:
-       daddiu  sp,sp,-1*8
+       daddiu  sp,sp,-2*8
        sd      ra,0*8(sp)
-       ald     a0,string_java_lang_NullPointerException
-       jal     new_exception
+       jal     new_nullpointerexception
        move    xptr,v0
        ld      ra,0*8(sp)
-       daddiu  sp,sp,1*8
+       daddiu  sp,sp,2*8
        
        move    xpc,ra                    /* faulting address is return adress    */
        b       asm_handle_nat_exception
 
 nb_aastore_bound:
-       daddiu  sp,sp,-1*8
+       daddiu  sp,sp,-2*8
        sd      ra,0*8(sp)
-       ald     a0,string_java_lang_ArrayIndexOutOfBoundsException
-       jal     new_exception_int         /* a1 already contains the index        */
+       move    a0,a1                     /* move index into a0                   */
+       jal     new_arrayindexoutofboundsexception
        move    xptr,v0
        ld      ra,0*8(sp)
-       daddiu  sp,sp,1*8
+       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_store:
-       daddiu  sp,sp,-1*8
+       daddiu  sp,sp,-2*8
        sd      ra,0*8(sp)
-       ald     a0,string_java_lang_ArrayStoreException
-       jal     new_exception
+       jal     new_arraystoreexception
        move    xptr,v0
        ld      ra,0*8(sp)
-       daddiu  sp,sp,1*8
+       daddiu  sp,sp,2*8
 
        move    xpc,ra                    /* faulting address is return adress    */
        b       asm_handle_nat_exception
@@ -1308,38 +1326,28 @@ _crit_end2:
 
 asm_criticalsections:
 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
-    .quad   _crit_begin1
-    .quad   _crit_end1
-    .quad   _crit_restart1
-    .quad   _crit_begin2
-    .quad   _crit_end2
-    .quad   _crit_restart2
+    .dword  _crit_begin1
+    .dword  _crit_end1
+    .dword  _crit_restart1
+    .dword  _crit_begin2
+    .dword  _crit_end2
+    .dword  _crit_restart2
 #endif
-    .quad   0
+    .dword  0
 
 
        .text
 
-       .ent    atomic_swap
-atomic_swap:
+       .ent    compare_and_swap
+compare_and_swap:
 1:
        lld             v0,0(a0)
-       move    t0,a1
+       bne             v0,a1,2f
+       move    t0,a2
        scd             t0,0(a0)
        beqz    t0,1b
-       j               ra
-       .end    atomic_swap
-
-       .ent    compare_and_swap
-compare_and_swap:
-       move    v0,zero
-1:
-       lld             t0,0(a0)
-       bne             t0,a1,2f
-       move    v0,a2
-       scd             v0,0(a0)
-       beqz    v0,1b
 2:
+       sync
        j               ra
        .end    compare_and_swap
 /*