X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Farm%2Fcodegen.c;h=f96ee749c441bcf2d081eb4fab84f6121053786f;hb=4ace3f4e68529dcf1572e56eace426ad26feed8b;hp=bb6418f4a1e37081d6f47460feba86bfb4a5de1f;hpb=8b1896a0eef0945f802ea2dbd5edb25ee853b810;p=cacao.git diff --git a/src/vm/jit/arm/codegen.c b/src/vm/jit/arm/codegen.c index bb6418f4a..f96ee749c 100644 --- a/src/vm/jit/arm/codegen.c +++ b/src/vm/jit/arm/codegen.c @@ -1,6 +1,6 @@ /* src/vm/jit/arm/codegen.c - machine code generator for Arm - Copyright (C) 1996-2005, 2006, 2007, 2008, 2009 + Copyright (C) 1996-2011 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -248,6 +248,7 @@ void codegen_emit_instruction(jitdata* jd, instruction* iptr) { varinfo* var; builtintable_entry* bte; + methoddesc* md; methodinfo* lm; // Local methodinfo for ICMD_INVOKE*. unresolved_method* um; fieldinfo* fi; @@ -257,7 +258,6 @@ void codegen_emit_instruction(jitdata* jd, instruction* iptr) int32_t disp; // Get required compiler data. - codeinfo* code = jd->code; codegendata* cd = jd->cd; /* the big switch */ @@ -1209,39 +1209,6 @@ void codegen_emit_instruction(jitdata* jd, instruction* iptr) M_STR_INTERN(s3, REG_ITMP1, OFFSET(java_objectarray_t, data[0])); break; - case ICMD_GETSTATIC: /* ... ==> ..., value */ - switch (fieldtype) { - case TYPE_INT: -#if defined(ENABLE_SOFTFLOAT) - case TYPE_FLT: -#endif - case TYPE_ADR: - d = codegen_reg_of_dst(jd, iptr, REG_ITMP1); - M_ILD_INTERN(d, REG_ITMP3, 0); - break; - case TYPE_LNG: -#if defined(ENABLE_SOFTFLOAT) - case TYPE_DBL: -#endif - d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED); - M_LLD_INTERN(d, REG_ITMP3, 0); - break; -#if !defined(ENABLE_SOFTFLOAT) - case TYPE_FLT: - d = codegen_reg_of_dst(jd, iptr, REG_FTMP1); - M_FLD_INTERN(d, REG_ITMP3, 0); - break; - case TYPE_DBL: - d = codegen_reg_of_dst(jd, iptr, REG_FTMP1); - M_DLD_INTERN(d, REG_ITMP3, 0); - break; -#endif - default: - assert(0); - } - emit_store_dst(jd, iptr, d); - break; - case ICMD_GETFIELD: /* ..., objectref, value ==> ... */ s1 = emit_load_s1(jd, iptr, REG_ITMP3); @@ -1727,6 +1694,7 @@ void codegen_emit_instruction(jitdata* jd, instruction* iptr) case ICMD_BUILTIN: bte = iptr->sx.s23.s3.bte; + md = bte->md; if (bte->stub == NULL) { disp = dseg_add_functionptr(cd, bte->fp); } else { @@ -1741,6 +1709,8 @@ void codegen_emit_instruction(jitdata* jd, instruction* iptr) M_MOV(REG_PC, REG_PV); #if !defined(__SOFTFP__) + d = md->returntype.type; + /* TODO: this is only a hack, since we use R0/R1 for float return! this depends on gcc; it is independent from our ENABLE_SOFTFLOAT define */ @@ -2405,14 +2375,14 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s /* calculate stackframe size */ cd->stackframesize = - 4 + /* return address */ - sizeof(stackframeinfo_t) + /* stackframeinfo */ - sizeof(localref_table) + /* localref_table */ - nmd->memuse * 4; /* stack arguments */ + 1 + /* return address */ + sizeof(stackframeinfo_t) / SIZEOF_VOID_P + /* stackframeinfo */ + sizeof(localref_table) / SIZEOF_VOID_P + /* localref_table */ + nmd->memuse; /* stack arguments */ /* align stack to 8-byte */ - cd->stackframesize = (cd->stackframesize + 4) & ~4; + cd->stackframesize = (cd->stackframesize + 1) & ~1; /* create method header */ @@ -2425,7 +2395,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s /* generate stub code */ M_STMFD(1<stackframesize / 4 - 1); + M_SUB_IMM_EXT_MUL4(REG_SP, REG_SP, cd->stackframesize * 2 - 1); #if defined(ENABLE_GC_CACAO) /* Save callee saved integer registers in stackframeinfo (GC may @@ -2498,7 +2468,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s } } else { - s1 = md->params[i].regoff + cd->stackframesize; + s1 = md->params[i].regoff + cd->stackframesize * 8; s2 = nmd->params[j].regoff; if (IS_2_WORD_TYPE(t)) { @@ -2583,7 +2553,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s /* finish stub code, but do not yet return to caller */ - M_ADD_IMM_EXT_MUL4(REG_SP, REG_SP, cd->stackframesize / 4 - 1); + M_ADD_IMM_EXT_MUL4(REG_SP, REG_SP, cd->stackframesize * 2 - 1); M_LDMFD(1<