*** empty log message ***
[cacao.git] / src / vm / jit / codegen.inc
index a2300e621348f624d2e5c61d010db077d0561045..352af7972d2a18c606e9bf1d7be0886d6771e6f8 100644 (file)
@@ -1,10 +1,9 @@
 /* vm/jit/codegen.inc - architecture independent code generator
 
-   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.
 
@@ -29,6 +28,7 @@
             Andreas  Krall
 
    Changes: Christian Thalinger
+            Joseph Wenninger
 
    All functions assume the following code area / data area layout:
 
@@ -47,7 +47,7 @@
    memory. All functions writing values into the data area return the offset
    relative the begin of the code area (start of procedure).   
 
-   $Id: codegen.inc 1680 2004-12-04 12:02:08Z jowenn $
+   $Id: codegen.inc 1953 2005-02-17 13:42:23Z christian $
 
 */
 
@@ -314,6 +314,7 @@ static s4 dseg_adds8(codegendata *cd, s8 value)
 #endif
 
 
+#if !defined(__XDSPCORE__)
 static s4 dseg_addfloat_increase(codegendata *cd, float value)
 {
        dseg_increase(cd);
@@ -364,6 +365,7 @@ static s4 dseg_adddouble(codegendata *cd, double value)
 
        return -(cd->dseglen);
 }
+#endif /* !defined(__XDSPCORE__) */
 
 
 static void dseg_addtarget(codegendata *cd, basicblock *target)
@@ -550,7 +552,7 @@ static void codegen_addclinitref(codegendata *cd,
 
 static void codegen_createlinenumbertable(codegendata *cd)
 {
-#ifdef __I386__
+#if defined(__I386__) || defined(__ALPHA__)
        linenumberref *lr;
 
        for (lr = cd->linenumberreferences; lr != NULL; lr = lr->next) {
@@ -680,6 +682,46 @@ functionptr codegen_findmethod(functionptr pc)
 }
 #endif
 
+#if defined(__ALPHA__)
+/*perhaps in the end I'll have to go for the tree version on alpha too, since this is insecure for eg segfault signals in native code,
+since it will still return an adress of a datasegment, but which will not be a valid one of a java method. This version is faster though (jowenn)*/
+void *codegen_findmethod(void *returnAdress)
+ {
+        void *result;
+        s8 d;
+        void *dataseg;
+        d=*((s4*)returnAdress);
+        d=d<<48;
+        d=d>>48;
+        dataseg=returnAdress+d;
+        d=*(((s4*)returnAdress)+1);
+        d=d>>16;
+        d=d-0x177b;
+        if (d==0) {
+                d=*(((s4*)returnAdress)+1);
+                d=d<<16;
+                dataseg=dataseg+d;
+        }
+        return dataseg;
+#if 0
+        ldl     t0,0(ra)              /* load instruction LDA PV,xxx(RA)          */
+        sll     t0,48,t0
+        sra     t0,48,t0              /* isolate offset                           */
+        addq    t0,ra,pv              /* compute update address                   */
+        ldl     t0,4(ra)              /* load instruction LDAH PV,xxx(PV)         */
+        srl     t0,16,t0              /* isolate instruction code                 */
+        lda     t0,-0x177b(t0)        /* test for LDAH                            */
+        bne     t0,ex_stack_loop
+        ldl     t0,4(ra)              /* load instruction LDAH PV,xxx(RA)         */
+        sll     t0,16,t0              /* compute high offset                      */
+        addl    t0,0,t0               /* sign extend high offset                  */
+        addq    t0,pv,pv              /* compute update address                   */
+        br      ex_stack_loop
+#endif
+}
+
+#endif
+
 
 static void codegen_finish(methodinfo *m, codegendata *cd, s4 mcodelen)
 {
@@ -720,7 +762,7 @@ static void codegen_finish(methodinfo *m, codegendata *cd, s4 mcodelen)
                jr = jr->next;
        }
 
-#ifdef __I386__
+#if defined(__I386__) || defined(__ALPHA__)
        /* line number table resolving */
        {
                linenumberref *lr;
@@ -816,43 +858,57 @@ static int reg_of_var(registerdata *rd, stackptr v, int tempregnum)
                if (!(v->flags & INMEMORY))
                        return(v->regoff);
                break;
+
        case STACKVAR:
                var = &(rd->interfaces[v->varnum][v->type]);
                v->regoff = var->regoff;
                if (!(var->flags & INMEMORY))
                        return(var->regoff);
                break;
+
        case LOCALVAR:
                var = &(rd->locals[v->varnum][v->type]);
                v->regoff = var->regoff;
                if (!(var->flags & INMEMORY))
                        return(var->regoff);
                break;
+
        case ARGVAR:
                v->regoff = v->varnum;
                if (IS_FLT_DBL_TYPE(v->type)) {
-                       if (v->varnum < rd->fltreg_argnum) {
+                       if (v->varnum < FLT_ARG_CNT) {
                                v->regoff = rd->argfltregs[v->varnum];
                                return(rd->argfltregs[v->varnum]);
                        }
 
+#if defined(__POWERPC__)
+                       v->regoff += 6;
+#else
+                       v->regoff -= FLT_ARG_CNT;
+#endif
+
                } else {
 #if defined(__POWERPC__)
-                       if (v->varnum < rd->intreg_argnum - (IS_2_WORD_TYPE(v->type) != 0)) {
+                       if (v->varnum < INT_ARG_CNT - (IS_2_WORD_TYPE(v->type) != 0)) {
 #else
-                       if (v->varnum < rd->intreg_argnum) {
+                       if (v->varnum < INT_ARG_CNT) {
 #endif
                                v->regoff = rd->argintregs[v->varnum];
                                return (rd->argintregs[v->varnum]);
                        }
-               }
+
 #if defined(__POWERPC__)
-               v->regoff += 6;
+                       v->regoff += 6;
 #else
-               v->regoff -= rd->intreg_argnum;
+                       v->regoff -= INT_ARG_CNT;
 #endif
+               }
                break;
        }
+#ifdef STATISTICS
+       if (opt_stat)
+               count_spills_read++;
+#endif
        v->flags |= INMEMORY;
        return tempregnum;
 }
@@ -966,13 +1022,20 @@ static void codegen_resolve_native(methodinfo *m,void **insertionPoint,void *jmp
        void *lib;
        void *sym;
 
+#if defined(USE_THREADS)
   builtin_monitorenter((java_objectheader*) m);
+#endif
+
 #if defined(__X86_64__)
   if ((*((s4*)jmpPatchTarget))==((s4)jmpTarget)) {
 #else
   if ((*jmpPatchTarget)==jmpTarget) {
 #endif
+
+#if defined(USE_THREADS)
     builtin_monitorexit((java_objectheader*) m);
+#endif
+
     return;
   }
   /*log_text("trying to resolve a native method");
@@ -1037,7 +1100,11 @@ static void codegen_resolve_native(methodinfo *m,void **insertionPoint,void *jmp
 #else
       (*jmpPatchTarget)=jmpTarget;
 #endif
+
+#if defined(USE_THREADS)
       builtin_monitorexit((java_objectheader *) m );
+#endif
+
       return;
     }
 
@@ -1052,7 +1119,10 @@ static void codegen_resolve_native(methodinfo *m,void **insertionPoint,void *jmp
     info=(char*)MNEW(char,slen);
     sprintf(info,"%s.%s%s",m->class->name->text,m->name->text,m->descriptor->text);
     
+#if defined(USE_THREADS)
     builtin_monitorexit((java_objectheader *) m );
+#endif
+
     throw_cacao_exception_exit(string_java_lang_LinkageError,
                                                        info);
   }