/* src/vm/jit/arm/codegen.c - machine code generator for Arm
- Copyright (C) 1996-2005, 2006, 2007, 2008, 2009, 2010
+ Copyright (C) 1996-2011
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
{
varinfo* var;
builtintable_entry* bte;
+ methoddesc* md;
methodinfo* lm; // Local methodinfo for ICMD_INVOKE*.
unresolved_method* um;
fieldinfo* fi;
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);
case ICMD_BUILTIN:
bte = iptr->sx.s23.s3.bte;
+ md = bte->md;
if (bte->stub == NULL) {
disp = dseg_add_functionptr(cd, bte->fp);
} else {
M_MOV(REG_LR, REG_PC);
M_MOV(REG_PC, REG_PV);
-#if !defined(__SOFTFP__)
- /* 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 */
- if (d != TYPE_VOID && IS_FLT_DBL_TYPE(d)) {
-#if 0 && !defined(NDEBUG)
- dolog("BUILTIN that returns float or double (%s.%s)", m->clazz->name->text, m->name->text);
-#endif
- /* we cannot use this macro, since it is not defined
- in ENABLE_SOFTFLOAT M_CAST_FLT_TO_INT_TYPED(d,
- REG_FRESULT, REG_RESULT_TYPED(d)); */
- if (IS_2_WORD_TYPE(d)) {
- DCD(0xed2d8102); /* stfd f0, [sp, #-8]! */
- M_LDRD_UPDATE(REG_RESULT_PACKED, REG_SP, 8);
- } else {
- DCD(0xed2d0101); /* stfs f0, [sp, #-4]!*/
- M_LDR_UPDATE(REG_RESULT, REG_SP, 4);
- }
- }
-#endif
break;
case ICMD_INVOKESPECIAL:
emit_recompute_pv(cd);
-#if !defined(__SOFTFP__)
- /* 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 */
- if (md->returntype.type != TYPE_VOID && IS_FLT_DBL_TYPE(md->returntype.type)) {
-#if 0 && !defined(NDEBUG)
- dolog("NATIVESTUB that returns float or double (%s.%s)", m->clazz->name->text, m->name->text);
-#endif
- /* we cannot use this macro, since it is not defined in ENABLE_SOFTFLOAT */
- /* M_CAST_FLT_TO_INT_TYPED(md->returntype.type, REG_FRESULT, REG_RESULT_TYPED(md->returntype.type)); */
- if (IS_2_WORD_TYPE(md->returntype.type)) {
- DCD(0xed2d8102); /* stfd f0, [sp, #-8]! */
- M_LDRD_UPDATE(REG_RESULT_PACKED, REG_SP, 8);
- } else {
- DCD(0xed2d0101); /* stfs f0, [sp, #-4]!*/
- M_LDR_UPDATE(REG_RESULT, REG_SP, 4);
- }
- }
-#endif
-
/* remove native stackframe info */
/* TODO: improve this store/load */