/* 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.
Andreas Krall
Changes: Christian Thalinger
+ Joseph Wenninger
All functions assume the following code area / data area layout:
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 $
*/
#endif
+#if !defined(__XDSPCORE__)
static s4 dseg_addfloat_increase(codegendata *cd, float value)
{
dseg_increase(cd);
return -(cd->dseglen);
}
+#endif /* !defined(__XDSPCORE__) */
static void dseg_addtarget(codegendata *cd, basicblock *target)
static void codegen_createlinenumbertable(codegendata *cd)
{
-#ifdef __I386__
+#if defined(__I386__) || defined(__ALPHA__)
linenumberref *lr;
for (lr = cd->linenumberreferences; lr != NULL; lr = lr->next) {
}
#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)
{
jr = jr->next;
}
-#ifdef __I386__
+#if defined(__I386__) || defined(__ALPHA__)
/* line number table resolving */
{
linenumberref *lr;
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;
}
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");
#else
(*jmpPatchTarget)=jmpTarget;
#endif
+
+#if defined(USE_THREADS)
builtin_monitorexit((java_objectheader *) m );
+#endif
+
return;
}
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);
}