* src/vm/jits/390/codegen.c (codegen_emit): In ICMD_F2I and ICMD_D2I correct handling of corner cases, ICMD_LALOAD fix.
* src/vm/jit/s390/md.c (md_dump_context): Include information on java method in dump.
* src/vm/jits/390/tests/dacapo.status: Noted dacapo eclipse results.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: codegen.c 7966 2007-05-25 12:41:03Z pm $
+ $Id: codegen.c 8068 2007-06-12 15:50:35Z pm $
*/
#endif
#define OOPS() assert(0);
+#define SUPPORT_HERCULES 1
void panic() { }
M_IADD(REG_ITMP1, d);
}
- *(u4 *)ref |= (u4)(cd->mcodeptr - ref) / 2;
+ N_BRC_BACK_PATCH(ref);
M_SRA_IMM(iptr->sx.val.i, d);
break;
case ICMD_F2I: /* ..., value ==> ..., (int) value */
- s1 = emit_load_s1(jd, iptr, REG_FTMP1);
- d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
- M_CVTFI(s1, d);
- emit_store_dst(jd, iptr, d);
- /* TODO: corner cases ? */
- break;
+ case ICMD_D2I:
+ {
+ u1 *ref1;
+#ifdef SUPPORT_HERCULES
+ u1 *ref2, *ref3;
+#endif
- case ICMD_D2I: /* ..., value ==> ..., (int) value */
- s1 = emit_load_s1(jd, iptr, REG_FTMP1);
- d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
- M_CVTDI(s1, d);
- emit_store_dst(jd, iptr, d);
- /* TODO: corner cases ? */
- break;
+ s1 = emit_load_s1(jd, iptr, REG_FTMP1);
+ d = codegen_reg_of_dst(jd, iptr, REG_ITMP3);
+
+ /* Test if NAN */
+
+ switch (iptr->opc) {
+ case ICMD_F2I:
+ N_LTEBR(s1, s1);
+ break;
+ case ICMD_D2I:
+ N_LTDBR(s1, s1);
+ break;
+ }
+ N_BRC(DD_0 | DD_1 | DD_2, SZ_BRC + SZ_LHI + SZ_BRC); /* Non a NaN */
+ N_LHI(d, 0); /* Load 0 */
+ ref1 = cd->mcodeptr;
+ N_BRC(DD_ANY, 0); /* Exit */
+
+ /* Convert */
+
+ switch (iptr->opc) {
+ case ICMD_F2I:
+ M_CVTFI(s1, d);
+ break;
+ case ICMD_D2I:
+ M_CVTDI(s1, d);
+ break;
+ }
+
+#ifdef SUPPORT_HERCULES
+ /* Hercules does the conversion using a plain C conversion.
+ * According to manual, real hardware should *NOT* require this.
+ *
+ * Corner case: Positive float leads to INT_MIN (overflow).
+ */
+
+ switch (iptr->opc) {
+ case ICMD_F2I:
+ N_LTEBR(s1, s1);
+ break;
+ case ICMD_D2I:
+ N_LTDBR(s1, s1);
+ break;
+ }
+
+ ref2 = cd->mcodeptr;
+ N_BRC(DD_0 | DD_1 | DD_3, 0); /* If operand is positive, continue */
+
+ M_TEST(d);
+
+ ref3 = cd->mcodeptr;
+ M_BGE(0); /* If integer result is negative, continue */
+
+ disp = dseg_add_s4(cd, 0x7fffffff); /* Load INT_MAX */
+ M_ILD(d, REG_PV, disp);
+#endif
+ N_BRC_BACK_PATCH(ref1);
+#ifdef SUPPORT_HERCULES
+ N_BRC_BACK_PATCH(ref2);
+ N_BRC_BACK_PATCH(ref3);
+#endif
+ emit_store_dst(jd, iptr, d);
+ }
break;
case ICMD_F2D: /* ..., value ==> ..., (double) value */
M_INTMOVE(s2, REG_ITMP2);
M_SLL_IMM(3, REG_ITMP2); /* scale index by 8 */
+ /* We need to preserve the array address after the first load */
+
+ if (GET_HIGH_REG(d) == s1) {
+ M_INTMOVE(s1, REG_ITMP3);
+ s1 = REG_ITMP3;
+ }
+
N_L(GET_HIGH_REG(d) /* evntl. itmp1 */, OFFSET(java_intarray, data[0]), REG_ITMP2, s1);
N_L(GET_LOW_REG(d) /* evntl. itmp2 */, OFFSET(java_intarray, data[0]) + 4, REG_ITMP2, s1);
emit_store_dst(jd, iptr, d);
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id: codegen.h 7966 2007-05-25 12:41:03Z pm $
+ $Id: codegen.h 8068 2007-06-12 15:50:35Z pm $
*/
#define DD_NO 14
#define DD_ANY 15
+#define DD_0 8
+#define DD_1 4
+#define DD_2 2
+#define DD_3 1
+
/* Misc */
/* Trap instruction.
# define N_J(i2) N_BRC(DD_ANY, i2)
# define SZ_BRC SZ_RI
# define SZ_J SZ_RI
+# define N_BRC_BACK_PATCH(brc_pos) \
+ do { \
+ *(u4 *)(brc_pos) |= (u4)(cd->mcodeptr - (brc_pos)) / 2; \
+ } while (0)
#define N_BRCT(r1, i2) N_RI(0xA7, 0x6, r1, (i2) / 2)
#define N_BRXH(r1, r3, i2) N_RSI(0x84, r1, r3, (i2) / 2)
#define N_BRXLE(r1, r3, i2) N_RSI(0x85, r1, r2, (i2) / 2)
#define N_LDXBR(r1, r2) N_RRE(0xB345, r1, r2)
#define N_LEXBR(r1, r2) N_RRE(0xB346, r1, r2)
+#define N_LTEBR(r1, r2) N_RRE(0xB302, r1, r2)
+#define N_LTDBR(r1, r2) N_RRE(0xB312, r1, r2)
+#define N_LTXBR(r1, r2) N_RRE(0xB342, r1, r2)
+
#define N_MEEBR(r1, r2) N_RRE(0xB317, r1, r2)
#define N_MDBR(r1, r2) N_RRE(0xB31C, r1, r2)
#define N_MXBR(r1, r2) N_RRE(0xB34C, r1, r2)
#define M_DSUB(a, dest) N_SDBR(dest, a)
#define M_DADD(a, dest) N_ADBR(dest, a)
#define M_DDIV(a, dest) N_DDBR(dest, a)
-#define M_CVTFI(src, dst) N_CFEBR(dst, 5, src)
-#define M_CVTDI(src, dst) N_CFDBR(dst, 5, src)
+#define M_CVTFI(src, dst) N_CFEBR(dst, 4, src)
+#define M_CVTDI(src, dst) N_CFDBR(dst, 4, src)
#define M_IADD(a, dest) N_AR(dest, a)
#define M_AADD(a, dest) N_AR(dest, a)
#define M_ISUB(a, dest) N_SR(dest, a)
Changes: Edwin Steiner
- $Id: md.c 7966 2007-05-25 12:41:03Z pm $
+ $Id: md.c 8068 2007-06-12 15:50:35Z pm $
*/
#include "vm/exceptions.h"
#include "vm/signallocal.h"
#include "vm/jit/asmpart.h"
+#include "vm/jit/methodheader.h"
#include "vm/jit/stacktrace.h"
#if !defined(NDEBUG) && defined(ENABLE_DISASSEMBLER)
void md_dump_context(u1 *pc, mcontext_t *mc) {
int i;
+ u1 *pv;
+ methodinfo *m;
union {
u8 l;
log_println("Program counter: 0x%08X", pc);
+ pv = codegen_get_pv_from_pc_nocheck(pc);
+ if (pv == NULL) {
+ log_println("No java method found at location.");
+ } else {
+ m = ((codeinfo *)(pv + CodeinfoPointer))->m;
+ log_println(
+ "Java method: class %s, method %s, descriptor %s.",
+ utf_bytes(m->class->name), utf_bytes(m->name), utf_bytes(m->descriptor)
+ );
+ }
+
#if defined(ENABLE_DISASSEMBLER)
log_println("Printing instruction at program counter:");
disassinstr(pc);
eclipse
* executes some of the (non-gui) jdt performance tests for the Eclipse IDE
+ * Mon Jun 11 22:20:00 CEST 2007: ===== DaCapo eclipse PASSED in 1647658 msec =====
fop