X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Farm%2Femit.c;h=26393f68ab8f16ba55431f5d6a83978229f13a29;hb=219e4a46e3d127d3c0883ee2e8635b4fe3c94d60;hp=6b69432aeb7c55ce8ee5fe42b8ec7edeb034b90e;hpb=e9a425806b5e301bedb5f0fa1ef6a6a1246af874;p=cacao.git diff --git a/src/vm/jit/arm/emit.c b/src/vm/jit/arm/emit.c index 6b69432ae..26393f68a 100644 --- a/src/vm/jit/arm/emit.c +++ b/src/vm/jit/arm/emit.c @@ -1,9 +1,7 @@ /* src/vm/jit/arm/emit.c - Arm code emitter functions - Copyright (C) 1996-2005, 2006, 2007 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 + Copyright (C) 1996-2005, 2006, 2007, 2008 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -40,16 +38,16 @@ #include "threads/lock-common.h" -#include "vm/exceptions.h" #include "vm/global.h" #include "vm/jit/abi.h" #include "vm/jit/asmpart.h" -#include "vm/jit/emit-common.h" -#include "vm/jit/jit.h" -#include "vm/jit/patcher-common.h" -#include "vm/jit/replace.h" -#include "vm/jit/trace.h" +#include "vm/jit/emit-common.hpp" +#include "vm/jit/jit.hpp" +#include "vm/jit/patcher-common.hpp" +#include "vm/jit/replace.hpp" +#include "vm/jit/trace.hpp" +#include "vm/jit/trap.h" #include "toolbox/logging.h" /* XXX for debugging only */ @@ -475,7 +473,7 @@ void emit_arithmetic_check(codegendata *cd, instruction *iptr, s4 reg) if (INSTRUCTION_MUST_CHECK(iptr)) { CHECK_INT_REG(reg); M_TEQ_IMM(reg, 0); - M_TRAPEQ(0, EXCEPTION_HARDWARE_ARITHMETIC); + M_TRAPEQ(0, TRAP_ArithmeticException); } } @@ -490,14 +488,14 @@ void emit_nullpointer_check(codegendata *cd, instruction *iptr, s4 reg) { if (INSTRUCTION_MUST_CHECK(iptr)) { M_TST(reg, reg); - M_TRAPEQ(0, EXCEPTION_HARDWARE_NULLPOINTER); + M_TRAPEQ(0, TRAP_NullPointerException); } } void emit_nullpointer_check_force(codegendata *cd, instruction *iptr, s4 reg) { M_TST(reg, reg); - M_TRAPEQ(0, EXCEPTION_HARDWARE_NULLPOINTER); + M_TRAPEQ(0, TRAP_NullPointerException); } @@ -512,7 +510,7 @@ void emit_arrayindexoutofbounds_check(codegendata *cd, instruction *iptr, s4 s1, if (INSTRUCTION_MUST_CHECK(iptr)) { M_ILD_INTERN(REG_ITMP3, s1, OFFSET(java_array_t, size)); M_CMP(s2, REG_ITMP3); - M_TRAPHS(s2, EXCEPTION_HARDWARE_ARRAYINDEXOUTOFBOUNDS); + M_TRAPHS(s2, TRAP_ArrayIndexOutOfBoundsException); } } @@ -527,7 +525,7 @@ void emit_arraystore_check(codegendata *cd, instruction *iptr) { if (INSTRUCTION_MUST_CHECK(iptr)) { M_TST(REG_RESULT, REG_RESULT); - M_TRAPEQ(0, EXCEPTION_HARDWARE_ARRAYSTORE); + M_TRAPEQ(0, TRAP_ArrayStoreException); } } @@ -543,15 +541,15 @@ void emit_classcast_check(codegendata *cd, instruction *iptr, s4 condition, s4 r if (INSTRUCTION_MUST_CHECK(iptr)) { switch (condition) { case BRANCH_EQ: - M_TRAPEQ(s1, EXCEPTION_HARDWARE_CLASSCAST); + M_TRAPEQ(s1, TRAP_ClassCastException); break; case BRANCH_LE: - M_TRAPLE(s1, EXCEPTION_HARDWARE_CLASSCAST); + M_TRAPLE(s1, TRAP_ClassCastException); break; case BRANCH_UGT: - M_TRAPHI(s1, EXCEPTION_HARDWARE_CLASSCAST); + M_TRAPHI(s1, TRAP_ClassCastException); break; default: @@ -570,7 +568,7 @@ void emit_exception_check(codegendata *cd, instruction *iptr) { if (INSTRUCTION_MUST_CHECK(iptr)) { M_TST(REG_RESULT, REG_RESULT); - M_TRAPEQ(0, EXCEPTION_HARDWARE_EXCEPTION); + M_TRAPEQ(0, TRAP_CHECK_EXCEPTION); } } @@ -588,9 +586,9 @@ uint32_t emit_trap(codegendata *cd) /* Get machine code which is patched back in later. The trap is 1 instruction word long. */ - mcode = *((u4 *) cd->mcodeptr); + mcode = *((uint32_t *) cd->mcodeptr); - M_TRAP(0, EXCEPTION_HARDWARE_PATCHER); + M_TRAP(0, TRAP_PATCHER); return mcode; } @@ -635,6 +633,19 @@ void emit_verbosecall_enter(jitdata *jd) if (!md->params[i].inmemory) { s = md->params[i].regoff; +#if defined(ENABLE_SOFTFLOAT) + switch (md->paramtypes[i].type) { + case TYPE_INT: + case TYPE_FLT: + case TYPE_ADR: + M_IST(s, REG_SP, i * 8); + break; + case TYPE_LNG: + case TYPE_DBL: + M_LST(s, REG_SP, i * 8); + break; + } +#else switch (md->paramtypes[i].type) { case TYPE_ADR: case TYPE_INT: @@ -650,6 +661,7 @@ void emit_verbosecall_enter(jitdata *jd) M_DST(s, REG_SP, i * 8); break; } +#endif } } @@ -665,6 +677,19 @@ void emit_verbosecall_enter(jitdata *jd) if (!md->params[i].inmemory) { s = md->params[i].regoff; +#if defined(ENABLE_SOFTFLOAT) + switch (md->paramtypes[i].type) { + case TYPE_INT: + case TYPE_FLT: + case TYPE_ADR: + M_ILD(s, REG_SP, i * 8); + break; + case TYPE_LNG: + case TYPE_DBL: + M_LLD(s, REG_SP, i * 8); + break; + } +#else switch (md->paramtypes[i].type) { case TYPE_ADR: case TYPE_INT: @@ -680,6 +705,7 @@ void emit_verbosecall_enter(jitdata *jd) M_DLD(s, REG_SP, i * 8); break; } +#endif } } @@ -727,7 +753,7 @@ void emit_verbosecall_exit(jitdata *jd) M_STMFD((1<returntype.type) { case TYPE_ADR: @@ -735,7 +761,6 @@ void emit_verbosecall_exit(jitdata *jd) case TYPE_FLT: M_IST(REG_RESULT, REG_SP, 0 * 8); break; - case TYPE_LNG: case TYPE_DBL: M_LST(REG_RESULT_PACKED, REG_SP, 0 * 8); @@ -747,7 +772,7 @@ void emit_verbosecall_exit(jitdata *jd) M_MOV(REG_A1, REG_SP); M_LONGBRANCH(trace_java_call_exit); - /* restore argument registers */ + /* restore return value */ switch (md->returntype.type) { case TYPE_ADR: @@ -755,14 +780,12 @@ void emit_verbosecall_exit(jitdata *jd) case TYPE_FLT: M_ILD(REG_RESULT, REG_SP, 0 * 8); break; - case TYPE_LNG: case TYPE_DBL: M_LLD(REG_RESULT_PACKED, REG_SP, 0 * 8); break; } - /* Keep stack 8-byte aligned. */ M_ADD_IMM(REG_SP, REG_SP, 1 * 8);