X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fcodeent.c;h=b4a567b72bda399dda749764b029c807985256a3;hb=b9e04d5242618b83d78016d57b032e2518ddba17;hp=14bab06393a42336caabc71ffa88a3b8d289de30;hpb=486640200baa9dfd84029c76f40fd118b63aee86;p=cc65 diff --git a/src/cc65/codeent.c b/src/cc65/codeent.c index 14bab0639..b4a567b72 100644 --- a/src/cc65/codeent.c +++ b/src/cc65/codeent.c @@ -39,6 +39,7 @@ /* common */ #include "chartype.h" #include "check.h" +#include "debugflag.h" #include "xmalloc.h" #include "xsprintf.h" @@ -224,7 +225,7 @@ const char* MakeHexArg (unsigned Num) */ { static char Buf[16]; - xsprintf (Buf, sizeof (Buf), "$%02X", (char) Num); + xsprintf (Buf, sizeof (Buf), "$%02X", (unsigned char) Num); return Buf; } @@ -376,6 +377,45 @@ int CE_KnownImm (const CodeEntry* E) +int CE_UseLoadFlags (const CodeEntry* E) +/* Return true if the instruction uses any flags that are set by a load of + * a register (N and Z). + */ +{ + /* A branch will use the flags */ + if (E->Info & OF_FBRA) { + return 1; + } + + /* Call of a boolean transformer routine will also use the flags */ + if (E->OPC == OP65_JSR) { + /* Get the condition that is evaluated and check it */ + switch (FindBoolCmpCond (E->Arg)) { + case CMP_EQ: + case CMP_NE: + case CMP_GT: + case CMP_GE: + case CMP_LT: + case CMP_LE: + case CMP_UGT: + case CMP_ULE: + /* Will use the N or Z flags */ + return 1; + + + case CMP_UGE: /* Uses only carry */ + case CMP_ULT: /* Dito */ + default: /* No bool transformer subroutine */ + return 0; + } + } + + /* Anything else */ + return 0; +} + + + void CE_FreeRegInfo (CodeEntry* E) /* Free an existing register info struct */ { @@ -422,11 +462,11 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) /* We don't know the value of the carry, so the result is * always unknown. */ - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; break; case OP65_AND: - if (In->RegA >= 0) { + if (RegValIsKnown (In->RegA)) { if (CE_KnownImm (E)) { Out->RegA = In->RegA & (short) E->Num; } else if (E->AM == AM65_ZP) { @@ -441,11 +481,11 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) Out->RegA = In->RegA & In->SRegHi; break; default: - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; break; } } else { - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; } } break; @@ -526,7 +566,7 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; case OP65_DEA: - if (In->RegA >= 0) { + if (RegValIsKnown (In->RegA)) { Out->RegA = (In->RegA - 1) & 0xFF; } break; @@ -553,19 +593,19 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; case OP65_DEX: - if (In->RegX >= 0) { + if (RegValIsKnown (In->RegX)) { Out->RegX = (In->RegX - 1) & 0xFF; } break; case OP65_DEY: - if (In->RegY >= 0) { + if (RegValIsKnown (In->RegY)) { Out->RegY = (In->RegY - 1) & 0xFF; } break; case OP65_EOR: - if (In->RegA >= 0) { + if (RegValIsKnown (In->RegA)) { if (CE_KnownImm (E)) { Out->RegA = In->RegA ^ (short) E->Num; } else if (E->AM == AM65_ZP) { @@ -580,17 +620,17 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) Out->RegA = In->RegA ^ In->SRegHi; break; default: - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; break; } } else { - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; } } break; case OP65_INA: - if (In->RegA >= 0) { + if (RegValIsKnown (In->RegA)) { Out->RegA = (In->RegA + 1) & 0xFF; } break; @@ -617,13 +657,13 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; case OP65_INX: - if (In->RegX >= 0) { + if (RegValIsKnown (In->RegX)) { Out->RegX = (In->RegX + 1) & 0xFF; } break; case OP65_INY: - if (In->RegY >= 0) { + if (RegValIsKnown (In->RegY)) { Out->RegY = (In->RegY + 1) & 0xFF; } break; @@ -653,24 +693,24 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) /* Get the code info for the function */ GetFuncInfo (E->Arg, &Use, &Chg); if (Chg & REG_A) { - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; } if (Chg & REG_X) { - Out->RegX = -1; + Out->RegX = UNKNOWN_REGVAL; } if (Chg & REG_Y) { - Out->RegY = -1; + Out->RegY = UNKNOWN_REGVAL; } if (Chg & REG_TMP1) { - Out->Tmp1 = -1; + Out->Tmp1 = UNKNOWN_REGVAL; } if (Chg & REG_SREG_LO) { - Out->SRegLo = -1; + Out->SRegLo = UNKNOWN_REGVAL; } if (Chg & REG_SREG_HI) { - Out->SRegHi = -1; + Out->SRegHi = UNKNOWN_REGVAL; } - /* Quick hack for some known functions: */ + /* ## FIXME: Quick hack for some known functions: */ if (strcmp (E->Arg, "tosandax") == 0) { if (In->RegA == 0) { Out->RegA = 0; @@ -685,6 +725,8 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) if (In->RegX == 0xFF) { Out->RegX = 0xFF; } + } else if (FindBoolCmpCond (E->Arg) != CMP_INV) { + Out->RegX = 0; } break; @@ -709,12 +751,12 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) Out->RegA = In->SRegHi; break; default: - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; break; } } else { /* A is now unknown */ - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; } break; @@ -733,12 +775,12 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) Out->RegX = In->SRegHi; break; default: - Out->RegX = -1; + Out->RegX = UNKNOWN_REGVAL; break; } } else { /* X is now unknown */ - Out->RegX = -1; + Out->RegX = UNKNOWN_REGVAL; } break; @@ -757,12 +799,12 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) Out->RegY = In->SRegHi; break; default: - Out->RegY = -1; + Out->RegY = UNKNOWN_REGVAL; break; } } else { /* Y is now unknown */ - Out->RegY = -1; + Out->RegY = UNKNOWN_REGVAL; } break; @@ -791,7 +833,7 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; case OP65_ORA: - if (In->RegA >= 0) { + if (RegValIsKnown (In->RegA)) { if (CE_KnownImm (E)) { Out->RegA = In->RegA | (short) E->Num; } else if (E->AM == AM65_ZP) { @@ -806,12 +848,12 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) Out->RegA = In->RegA | In->SRegHi; break; default: - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; break; } } else { /* A is now unknown */ - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; } } break; @@ -846,17 +888,17 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) case OP65_ROL: /* We don't know the value of the carry bit */ if (E->AM == AM65_ACC) { - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; } else if (E->AM == AM65_ZP) { switch (GetKnownReg (E->Chg, In)) { case REG_TMP1: - Out->Tmp1 = -1; + Out->Tmp1 = UNKNOWN_REGVAL; break; case REG_SREG_LO: - Out->SRegLo = -1; + Out->SRegLo = UNKNOWN_REGVAL; break; case REG_SREG_HI: - Out->SRegHi = -1; + Out->SRegHi = UNKNOWN_REGVAL; break; } } else if (E->AM == AM65_ZPX) { @@ -868,17 +910,17 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) case OP65_ROR: /* We don't know the value of the carry bit */ if (E->AM == AM65_ACC) { - Out->RegA = -1; + Out->RegA = UNKNOWN_REGVAL; } else if (E->AM == AM65_ZP) { switch (GetKnownReg (E->Chg, In)) { case REG_TMP1: - Out->Tmp1 = -1; + Out->Tmp1 = UNKNOWN_REGVAL; break; case REG_SREG_LO: - Out->SRegLo = -1; + Out->SRegLo = UNKNOWN_REGVAL; break; case REG_SREG_HI: - Out->SRegHi = -1; + Out->SRegHi = UNKNOWN_REGVAL; break; } } else if (E->AM == AM65_ZPX) { @@ -1011,13 +1053,13 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) } else { switch (GetKnownReg (E->Chg, In)) { case REG_TMP1: - Out->Tmp1 = -1; + Out->Tmp1 = UNKNOWN_REGVAL; break; case REG_SREG_LO: - Out->SRegLo = -1; + Out->SRegLo = UNKNOWN_REGVAL; break; case REG_SREG_HI: - Out->SRegHi = -1; + Out->SRegHi = UNKNOWN_REGVAL; break; } } @@ -1044,13 +1086,13 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) } else { switch (GetKnownReg (E->Chg, In)) { case REG_TMP1: - Out->Tmp1 = -1; + Out->Tmp1 = UNKNOWN_REGVAL; break; case REG_SREG_LO: - Out->SRegLo = -1; + Out->SRegLo = UNKNOWN_REGVAL; break; case REG_SREG_HI: - Out->SRegHi = -1; + Out->SRegHi = UNKNOWN_REGVAL; break; } } @@ -1058,7 +1100,7 @@ void CE_GenRegInfo (CodeEntry* E, RegContents* InputRegs) break; case OP65_TSX: - Out->RegX = -1; + Out->RegX = UNKNOWN_REGVAL; break; case OP65_TXA: @@ -1094,6 +1136,7 @@ static char* RegInfoDesc (unsigned U, char* Buf) strcat (Buf, U & REG_PTR1? "1" : "_"); strcat (Buf, U & REG_PTR2? "2" : "_"); strcat (Buf, U & REG_SAVE? "V" : "_"); + strcat (Buf, U & REG_SP? "S" : "_"); return Buf; } @@ -1188,7 +1231,7 @@ void CE_Output (const CodeEntry* E, FILE* F) char Use [128]; char Chg [128]; fprintf (F, - "%*s; USE: %-20s CHG: %-20s SIZE: %u\n", + "%*s; USE: %-12s CHG: %-12s SIZE: %u\n", 30-Chars, "", RegInfoDesc (E->Use, Use), RegInfoDesc (E->Chg, Chg),