#include "z80.h"
+/* Flags to turn off optimisations.
+ */
enum
{
DISABLE_PACK_ACC = 0,
DISABLE_PACK_ASSIGN = 0,
- DISABLE_PACK_ONE_USE = 0,
+ /* Pack for one use is quite broken. */
+ DISABLE_PACK_ONE_USE = 1,
DISABLE_PACK_HL = 0,
- LIMITED_PACK_ACC = 1,
};
+/* Flags to turn on debugging code.
+ */
enum
{
D_ALLOC = 0,
if (ic->next != uic)
return;
+ if (ic->op == CAST && uic->op == IPUSH)
+ goto hluse;
if (ic->op == ADDRESS_OF && uic->op == IPUSH)
goto hluse;
if (ic->op == CALL && ic->parmBytes == 0 && (uic->op == '-' || uic->op == '+'))
{
if (uic->op == IFX)
{
+ /* If we've gotten this far then the thing to compare must be
+ small enough and must be in A.
+ */
return TRUE;
-
- if (getSize (operandType (IC_COND (uic))) == 1 &&
- IS_OP_LITERAL (IC_COND (uic)))
- {
- return TRUE;
- }
-
- D (D_ACCUSE2, (" + Dropping as operation is an IFX\n"));
- return FALSE;
}
if (uic->op == JUMPTABLE)
return FALSE;
}
- /*
- Bad:
- !IS_ARITHMETIC_OP(uic) (sub requires A)
- */
- if (
- uic->op != '+' &&
- !IS_BITWISE_OP (uic) &&
- uic->op != '=' &&
- uic->op != EQ_OP &&
- !POINTER_GET (uic) &&
- /*
- uic->op != LEFT_OP &&
- uic->op != RIGHT_OP && */
- 1
- )
- {
- D (D_ACCUSE2, (" + Dropping as 'its a bad op'\n"));
- return FALSE;
- }
-
- /* PENDING */
- if (!IC_LEFT (uic) || !IC_RESULT (ic))
- {
- D (D_ACCUSE2, (" + Dropping for some reason #1\n"));
- return FALSE;
- }
-
-/** This is confusing :) Guess for now */
- if (IC_LEFT (uic)->key == IC_RESULT (ic)->key &&
- (IS_ITEMP (IC_RIGHT (uic)) ||
- (IS_TRUE_SYMOP (IC_RIGHT (uic)))))
- {
- return TRUE;
- }
-
- if (IC_RIGHT (uic)->key == IC_RESULT (ic)->key &&
- (IS_ITEMP (IC_LEFT (uic)) ||
- (IS_TRUE_SYMOP (IC_LEFT (uic)))))
- {
- return TRUE;
- }
-
- D (D_ACCUSE2, (" + Dropping as hit default case\n"));
+ /* Disabled all of the old rules as they weren't verified and have
+ caused at least one problem.
+ */
return FALSE;
}
return;
}
- /* if shift operation make sure right side is not a literal.
- MLH: depends.
- */
-#if 0
- if (ic->op == RIGHT_OP &&
- (isOperandLiteral (IC_RIGHT (ic)) ||
- getSize (operandType (IC_RESULT (ic))) > 1))
- return;
-
- if (ic->op == LEFT_OP &&
- (isOperandLiteral (IC_RIGHT (ic)) ||
- getSize (operandType (IC_RESULT (ic))) > 1))
- return;
-#endif
-
/* has only one definition */
if (bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) > 1)
{
packRegsForSupport (ic, ebp);
#endif
-#if 0
- /* some cases the redundant moves can
- can be eliminated for return statements */
- if ((ic->op == RETURN || ic->op == SEND) &&
- !isOperandInFarSpace (IC_LEFT (ic)) &&
- !options.model)
- packRegsForOneuse (ic, IC_LEFT (ic), ebp);
-#endif
/* if pointer set & left has a size more than
one and right is not in far space */
if (!DISABLE_PACK_ONE_USE &&
packRegsForOneuse (ic, IC_LEFT (ic), ebp);
}
+
/* pack registers for accumulator use, when the result of an
arithmetic or bit wise operation has only one use, that use is
immediately following the defintion and the using iCode has
{
packRegsForHLUse (ic);
}
-#if 0
- if ((IS_ARITHMETIC_OP (ic)
- || IS_BITWISE_OP (ic)
- || ic->op == LEFT_OP || ic->op == RIGHT_OP
- ) &&
- IS_ITEMP (IC_RESULT (ic)) &&
- getSize (operandType (IC_RESULT (ic))) <= 2)
- packRegsForAccUse (ic);
-#else
+
if (!DISABLE_PACK_ACC && IS_ITEMP (IC_RESULT (ic)) &&
getSize (operandType (IC_RESULT (ic))) == 1)
{
packRegsForAccUse2 (ic);
}
-#endif
}
}
_G.dataExtend = 0;
}
- if (options.dump_rassgn)
+ if (options.dump_rassgn) {
dumpEbbsToFileExt (DUMP_RASSGN, ebbs, count);
+ dumpLiveRanges (DUMP_LRANGE, liveRanges);
+ }
/* after that create the register mask
for each of the instruction */