From 6adfad2e33417f2c885c460984cd150ca34bba9d Mon Sep 17 00:00:00 2001 From: Stefan Ring Date: Mon, 12 Jul 2010 21:06:21 +0200 Subject: [PATCH] Fixes icedtea/PR 513. * src/vm/jit/arm/codegen.h [ENABLE_SOFTFLOAT]: Define M_FMOV and M_DMOV. * src/vm/jit/codegen-common.cpp [ENABLE_SOFTFLOAT]: Use only integer registers for argument and return value passing when compiling for softfloat. --- src/vm/jit/arm/codegen.h | 11 +++++++- src/vm/jit/codegen-common.cpp | 50 ++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/vm/jit/arm/codegen.h b/src/vm/jit/arm/codegen.h index 59ee5c27e..c18e324a9 100644 --- a/src/vm/jit/arm/codegen.h +++ b/src/vm/jit/arm/codegen.h @@ -1,6 +1,6 @@ /* src/vm/jit/arm/codegen.h - code generation macros and definitions for ARM - Copyright (C) 1996-2005, 2006, 2007, 2008 + Copyright (C) 1996-2005, 2006, 2007, 2008, 2010 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -1164,6 +1164,15 @@ do { \ #define M_FST(a,b,c) M_STFS(a,b,c) #define M_DST(a,b,c) M_STFD(a,b,c) +#else /* !defined(ENABLE_SOFTFLOAT) */ + +#define M_FMOV(s,d) M_MOV((d), (s)) +#define M_DMOV(s,d) \ + { \ + M_MOV(GET_LOW_REG(d), GET_LOW_REG(s)); \ + M_MOV(GET_HIGH_REG(d), GET_HIGH_REG(s)); \ + } + #endif /* !defined(ENABLE_SOFTFLOAT) */ diff --git a/src/vm/jit/codegen-common.cpp b/src/vm/jit/codegen-common.cpp index 5536ba819..6408466d7 100644 --- a/src/vm/jit/codegen-common.cpp +++ b/src/vm/jit/codegen-common.cpp @@ -1,6 +1,6 @@ /* src/vm/jit/codegen-common.cpp - architecture independent code generator stuff - Copyright (C) 1996-2005, 2006, 2007, 2008, 2009 + Copyright (C) 1996-2005, 2006, 2007, 2008, 2009, 2010 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO Copyright (C) 2009 Theobroma Systems Ltd. @@ -1547,13 +1547,20 @@ bool codegen_emit(jitdata *jd) M_ALD(d, REG_ITMP1, 0); break; case TYPE_INT: +#if defined(ENABLE_SOFTFLOAT) + case TYPE_FLT: +#endif d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); M_ILD(d, REG_ITMP1, 0); break; case TYPE_LNG: +#if defined(ENABLE_SOFTFLOAT) + case TYPE_DBL: +#endif d = codegen_reg_of_dst(jd, iptr, REG_LTMP23); M_LLD(d, REG_ITMP1, 0); break; +#if !defined(ENABLE_SOFTFLOAT) case TYPE_FLT: d = codegen_reg_of_dst(jd, iptr, REG_FTMP1); M_FLD(d, REG_ITMP1, 0); @@ -1562,6 +1569,7 @@ bool codegen_emit(jitdata *jd) d = codegen_reg_of_dst(jd, iptr, REG_FTMP1); M_DLD(d, REG_ITMP1, 0); break; +#endif } emit_store_dst(jd, iptr, d); break; @@ -1610,13 +1618,20 @@ bool codegen_emit(jitdata *jd) M_AST(s1, REG_ITMP1, 0); break; case TYPE_INT: +#if defined(ENABLE_SOFTFLOAT) + case TYPE_FLT: +#endif s1 = emit_load_s1(jd, iptr, REG_ITMP2); M_IST(s1, REG_ITMP1, 0); break; case TYPE_LNG: +#if defined(ENABLE_SOFTFLOAT) + case TYPE_DBL: +#endif s1 = emit_load_s1(jd, iptr, REG_LTMP23); M_LST(s1, REG_ITMP1, 0); break; +#if !defined(ENABLE_SOFTFLOAT) case TYPE_FLT: s1 = emit_load_s1(jd, iptr, REG_FTMP2); M_FST(s1, REG_ITMP1, 0); @@ -1625,6 +1640,7 @@ bool codegen_emit(jitdata *jd) s1 = emit_load_s1(jd, iptr, REG_FTMP2); M_DST(s1, REG_ITMP1, 0); break; +#endif } #if defined(USES_PATCHABLE_MEMORY_BARRIER) codegen_emit_patchable_barrier(iptr, cd, pr, fi); @@ -1840,6 +1856,9 @@ bool codegen_emit(jitdata *jd) goto nowperformreturn; case ICMD_IRETURN: /* ..., retvalue ==> ... */ +#if defined(ENABLE_SOFTFLOAT) + case ICMD_FRETURN: +#endif REPLACEMENT_POINT_RETURN(cd, iptr); s1 = emit_load_s1(jd, iptr, REG_RESULT); @@ -1848,6 +1867,9 @@ bool codegen_emit(jitdata *jd) goto nowperformreturn; case ICMD_LRETURN: /* ..., retvalue ==> ... */ +#if defined(ENABLE_SOFTFLOAT) + case ICMD_DRETURN: +#endif REPLACEMENT_POINT_RETURN(cd, iptr); s1 = emit_load_s1(jd, iptr, REG_LRESULT); @@ -1855,6 +1877,7 @@ bool codegen_emit(jitdata *jd) emit_lmove(cd, s1, REG_LRESULT); goto nowperformreturn; +#if !defined(ENABLE_SOFTFLOAT) case ICMD_FRETURN: /* ..., retvalue ==> ... */ REPLACEMENT_POINT_RETURN(cd, iptr); @@ -1876,6 +1899,7 @@ bool codegen_emit(jitdata *jd) M_CAST_D2L(s1, REG_LRESULT); #endif goto nowperformreturn; +#endif nowperformreturn: #if !defined(NDEBUG) @@ -1983,15 +2007,22 @@ gen_method: switch (var->type) { case TYPE_ADR: case TYPE_INT: +#if defined(ENABLE_SOFTFLOAT) + case TYPE_FLT: +#endif s1 = emit_load(jd, iptr, var, d); emit_imove(cd, s1, d); break; case TYPE_LNG: +#if defined(ENABLE_SOFTFLOAT) + case TYPE_DBL: +#endif s1 = emit_load(jd, iptr, var, d); emit_lmove(cd, s1, d); break; +#if !defined(ENABLE_SOFTFLOAT) case TYPE_FLT: #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS) s1 = emit_load(jd, iptr, var, d); @@ -2011,6 +2042,7 @@ gen_method: M_CAST_D2L(s1, d); #endif break; +#endif } } else { @@ -2025,6 +2057,9 @@ gen_method: break; case TYPE_INT: +#if defined(ENABLE_SOFTFLOAT) + case TYPE_FLT: +#endif #if SIZEOF_VOID_P == 4 s1 = emit_load(jd, iptr, var, REG_ITMP1); M_IST(s1, REG_SP, d); @@ -2034,12 +2069,16 @@ gen_method: #endif case TYPE_LNG: +#if defined(ENABLE_SOFTFLOAT) + case TYPE_DBL: +#endif s1 = emit_load(jd, iptr, var, REG_LTMP12); // XXX Sparc64: Here this actually was: // M_STX(s1, REG_SP, JITSTACK + d); M_LST(s1, REG_SP, d); break; +#if !defined(ENABLE_SOFTFLOAT) case TYPE_FLT: #if SIZEOF_VOID_P == 4 s1 = emit_load(jd, iptr, var, REG_FTMP1); @@ -2055,6 +2094,7 @@ gen_method: // M_DST(s1, REG_SP, JITSTACK + d); M_DST(s1, REG_SP, d); break; +#endif } } } @@ -2084,6 +2124,9 @@ gen_method: switch (md->returntype.type) { case TYPE_INT: case TYPE_ADR: +#if defined(ENABLE_SOFTFLOAT) + case TYPE_FLT: +#endif s1 = codegen_reg_of_dst(jd, iptr, REG_RESULT); // XXX Sparc64: This should actually be REG_RESULT_CALLER, fix this! emit_imove(cd, REG_RESULT, s1); @@ -2091,12 +2134,16 @@ gen_method: break; case TYPE_LNG: +#if defined(ENABLE_SOFTFLOAT) + case TYPE_DBL: +#endif s1 = codegen_reg_of_dst(jd, iptr, REG_LRESULT); // XXX Sparc64: This should actually be REG_RESULT_CALLER, fix this! emit_lmove(cd, REG_LRESULT, s1); emit_store_dst(jd, iptr, s1); break; +#if !defined(ENABLE_SOFTFLOAT) case TYPE_FLT: #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS) s1 = codegen_reg_of_dst(jd, iptr, REG_FRESULT); @@ -2118,6 +2165,7 @@ gen_method: #endif emit_store_dst(jd, iptr, s1); break; +#endif case TYPE_VOID: break; -- 2.25.1