-/*
- * cfold.c: Constant folding support
+/**
+ * \file
+ * Constant folding support
*
* Author:
* Paolo Molaro (lupus@ximian.com)
*
* (C) 2003 Ximian, Inc. http://www.ximian.com
*/
+#include <config.h>
+
#include "mini.h"
#include "ir-emit.h"
+/* WTF is this doing here?!?!? */
int
mono_is_power_of_two (guint32 val)
{
} \
} while (0)
+#ifndef DISABLE_JIT
+
/**
* mono_constant_fold_ins:
*
case OP_INEG:
if (arg1->opcode == OP_ICONST) {
/* INEG sets cflags on x86, and the LNEG decomposition depends on that */
- if ((ins->opcode == OP_INEG) && ins->next && (ins->next->opcode == OP_ADC_IMM))
+#if SIZEOF_REGISTER == 4
+ if (ins->opcode == OP_INEG)
return NULL;
+#endif
ALLOC_DEST (cfg, dest, ins);
switch (ins->opcode) {
FOLD_UNOP (OP_INEG,-);
dest->inst_c0 = res;
}
break;
+ case OP_COND_EXC_EQ:
+ res = arg1->inst_c0 == arg2->inst_c0;
+ if (!res) {
+ if (overwrite) {
+ NULLIFY_INS (ins);
+ NULLIFY_INS (next);
+ } else {
+ ALLOC_DEST (cfg, dest, ins);
+ dest->opcode = OP_ICONST;
+ dest->inst_c0 = res;
+ }
+ }
+ break;
case OP_NOP:
case OP_BR:
/* This happens when a conditional branch is eliminated */
return NULL;
}
}
+ if ((arg1->opcode == OP_PCONST) && (arg2->opcode == OP_PCONST) && ins->next) {
+ MonoInst *next = ins->next;
+
+ if (next->opcode == OP_LCEQ) {
+ gboolean res = arg1->inst_p0 == arg2->inst_p0;
+ if (overwrite) {
+ NULLIFY_INS (ins);
+ next->opcode = OP_ICONST;
+ next->inst_c0 = res;
+ MONO_INST_NULLIFY_SREGS (next);
+ } else {
+ ALLOC_DEST (cfg, dest, ins);
+ dest->opcode = OP_ICONST;
+ dest->inst_c0 = res;
+ }
+ break;
+ }
+ }
break;
}
case OP_FMOVE:
return dest;
}
+
+
+#endif /* DISABLE_JIT */