1
0
mirror of https://github.com/cc65/cc65.git synced 2024-06-27 12:29:33 +00:00

Check also sreg in OptSize1. Added information about shortcut functions for

longs that clear the high word of the right operand on entry.


git-svn-id: svn://svn.cc65.org/cc65/trunk@4024 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
uz 2009-08-15 21:00:27 +00:00
parent b1f772e9be
commit 582506b7fc
4 changed files with 668 additions and 70 deletions

View File

@ -164,6 +164,7 @@ static const FuncInfo FuncInfoTable[] = {
{ "mulax9", REG_AX, REG_AX | REG_PTR1 }, { "mulax9", REG_AX, REG_AX | REG_PTR1 },
{ "negax", REG_AX, REG_AX }, { "negax", REG_AX, REG_AX },
{ "push0", REG_NONE, REG_AXY }, { "push0", REG_NONE, REG_AXY },
{ "push0ax", REG_AX, REG_Y | REG_SREG },
{ "push1", REG_NONE, REG_AXY }, { "push1", REG_NONE, REG_AXY },
{ "push2", REG_NONE, REG_AXY }, { "push2", REG_NONE, REG_AXY },
{ "push3", REG_NONE, REG_AXY }, { "push3", REG_NONE, REG_AXY },
@ -210,6 +211,7 @@ static const FuncInfo FuncInfoTable[] = {
{ "steaxysp", REG_EAXY, REG_Y }, { "steaxysp", REG_EAXY, REG_Y },
{ "subeq0sp", REG_AX, REG_AXY }, { "subeq0sp", REG_AX, REG_AXY },
{ "subeqysp", REG_AXY, REG_AXY }, { "subeqysp", REG_AXY, REG_AXY },
{ "tosadd0ax", REG_AX, REG_EAXY | REG_TMP1 },
{ "tosadda0", REG_A, REG_AXY }, { "tosadda0", REG_A, REG_AXY },
{ "tosaddax", REG_AX, REG_AXY }, { "tosaddax", REG_AX, REG_AXY },
{ "tosaddeax", REG_EAX, REG_EAXY | REG_TMP1 }, { "tosaddeax", REG_EAX, REG_EAXY | REG_TMP1 },
@ -219,9 +221,10 @@ static const FuncInfo FuncInfoTable[] = {
{ "tosasleax", REG_EAX, REG_EAXY | REG_TMP1 }, { "tosasleax", REG_EAX, REG_EAXY | REG_TMP1 },
{ "tosasrax", REG_AX, REG_AXY | REG_TMP1 }, { "tosasrax", REG_AX, REG_AXY | REG_TMP1 },
{ "tosasreax", REG_EAX, REG_EAXY | REG_TMP1 }, { "tosasreax", REG_EAX, REG_EAXY | REG_TMP1 },
{ "tosdiv0ax", REG_AX, REG_ALL },
{ "tosdiva0", REG_AY, REG_ALL }, { "tosdiva0", REG_AY, REG_ALL },
{ "tosdivax", REG_AXY, REG_ALL }, { "tosdivax", REG_AXY, REG_ALL },
{ "tosdiveax", REG_EAXY, REG_ALL }, { "tosdiveax", REG_EAX, REG_ALL },
{ "toseq00", REG_NONE, REG_AXY | REG_SREG }, { "toseq00", REG_NONE, REG_AXY | REG_SREG },
{ "toseqa0", REG_A, REG_AXY | REG_SREG }, { "toseqa0", REG_A, REG_AXY | REG_SREG },
{ "toseqax", REG_AX, REG_AXY | REG_SREG }, { "toseqax", REG_AX, REG_AXY | REG_SREG },
@ -245,6 +248,9 @@ static const FuncInfo FuncInfoTable[] = {
{ "toslta0", REG_A, REG_AXY | REG_SREG }, { "toslta0", REG_A, REG_AXY | REG_SREG },
{ "tosltax", REG_AX, REG_AXY | REG_SREG }, { "tosltax", REG_AX, REG_AXY | REG_SREG },
{ "toslteax", REG_EAX, REG_AXY | REG_PTR1 }, { "toslteax", REG_EAX, REG_AXY | REG_PTR1 },
{ "tosmod0ax", REG_AX, REG_ALL },
{ "tosmodeax", REG_EAX, REG_ALL },
{ "tosmul0ax", REG_AX, REG_ALL },
{ "tosmula0", REG_AX, REG_ALL }, { "tosmula0", REG_AX, REG_ALL },
{ "tosmulax", REG_AX, REG_ALL }, { "tosmulax", REG_AX, REG_ALL },
{ "tosmuleax", REG_EAX, REG_ALL }, { "tosmuleax", REG_EAX, REG_ALL },
@ -258,9 +264,11 @@ static const FuncInfo FuncInfoTable[] = {
{ "tosshleax", REG_A, REG_EAXY | REG_TMP1 }, { "tosshleax", REG_A, REG_EAXY | REG_TMP1 },
{ "tosshrax", REG_A, REG_AXY | REG_TMP1 }, { "tosshrax", REG_A, REG_AXY | REG_TMP1 },
{ "tosshreax", REG_A, REG_EAXY | REG_TMP1 }, { "tosshreax", REG_A, REG_EAXY | REG_TMP1 },
{ "tossub0ax", REG_AX, REG_EAXY },
{ "tossuba0", REG_A, REG_AXY }, { "tossuba0", REG_A, REG_AXY },
{ "tossubax", REG_AX, REG_AXY }, { "tossubax", REG_AX, REG_AXY },
{ "tossubeax", REG_EAX, REG_EAXY }, { "tossubeax", REG_EAX, REG_EAXY },
{ "tosudiv0ax", REG_AX, REG_ALL & ~REG_SAVE },
{ "tosudiva0", REG_A, REG_EAXY | REG_PTR1 }, /* also ptr4 */ { "tosudiva0", REG_A, REG_EAXY | REG_PTR1 }, /* also ptr4 */
{ "tosudivax", REG_AX, REG_EAXY | REG_PTR1 }, /* also ptr4 */ { "tosudivax", REG_AX, REG_EAXY | REG_PTR1 }, /* also ptr4 */
{ "tosudiveax", REG_EAX, REG_ALL & ~REG_SAVE }, { "tosudiveax", REG_EAX, REG_ALL & ~REG_SAVE },
@ -280,9 +288,11 @@ static const FuncInfo FuncInfoTable[] = {
{ "tosulta0", REG_A, REG_AXY | REG_SREG }, { "tosulta0", REG_A, REG_AXY | REG_SREG },
{ "tosultax", REG_AX, REG_AXY | REG_SREG }, { "tosultax", REG_AX, REG_AXY | REG_SREG },
{ "tosulteax", REG_EAX, REG_AXY | REG_PTR1 }, { "tosulteax", REG_EAX, REG_AXY | REG_PTR1 },
{ "tosumod0ax", REG_AX, REG_ALL & ~REG_SAVE },
{ "tosumoda0", REG_A, REG_EAXY | REG_PTR1 }, /* also ptr4 */ { "tosumoda0", REG_A, REG_EAXY | REG_PTR1 }, /* also ptr4 */
{ "tosumodax", REG_AX, REG_EAXY | REG_PTR1 }, /* also ptr4 */ { "tosumodax", REG_AX, REG_EAXY | REG_PTR1 }, /* also ptr4 */
{ "tosumodeax", REG_EAX, REG_ALL & ~REG_SAVE }, { "tosumodeax", REG_EAX, REG_ALL & ~REG_SAVE },
{ "tosumul0ax", REG_AX, REG_ALL },
{ "tosumula0", REG_AX, REG_ALL }, { "tosumula0", REG_AX, REG_ALL },
{ "tosumulax", REG_AX, REG_ALL }, { "tosumulax", REG_AX, REG_ALL },
{ "tosumuleax", REG_EAX, REG_ALL }, { "tosumuleax", REG_EAX, REG_ALL },

View File

@ -1554,6 +1554,7 @@ static unsigned RunOptGroup6 (CodeSeg* S)
* may have opened new oportunities. * may have opened new oportunities.
*/ */
Changes += RunOptFunc (S, &DOptUnusedLoads, 1); Changes += RunOptFunc (S, &DOptUnusedLoads, 1);
Changes += RunOptFunc (S, &DOptUnusedStores, 1);
Changes += RunOptFunc (S, &DOptJumpTarget1, 5); Changes += RunOptFunc (S, &DOptJumpTarget1, 5);
Changes += RunOptFunc (S, &DOptStore5, 1); Changes += RunOptFunc (S, &DOptStore5, 1);
} }

View File

@ -898,7 +898,9 @@ unsigned OptUnusedStores (CodeSeg* S)
/* Remember, we had changes */ /* Remember, we had changes */
++Changes; ++Changes;
/* Continue with next insn */
continue;
} }
} }

View File

@ -59,7 +59,7 @@
typedef struct CallDesc CallDesc; typedef struct CallDesc CallDesc;
struct CallDesc { struct CallDesc {
const char* LongFunc; /* Long function name */ const char* LongFunc; /* Long function name */
short A, X, Y; /* Register contents */ RegContents Regs; /* Register contents */
unsigned Flags; /* Flags from above */ unsigned Flags; /* Flags from above */
const char* ShortFunc; /* Short function name */ const char* ShortFunc; /* Short function name */
}; };
@ -68,85 +68,655 @@ struct CallDesc {
* name, entries are sorted best match first, so when searching linear for * name, entries are sorted best match first, so when searching linear for
* a match, the first one can be used because it is also the best one (or * a match, the first one can be used because it is also the best one (or
* at least none of the following ones are better). * at least none of the following ones are better).
* Note^2: Ptr1 and Tmp1 aren't evaluated, because runtime routines don't
* expect parameters here.
*/ */
static const CallDesc CallTable [] = { static const CallDesc CallTable [] = {
/* Name A register X register Y register flags replacement */ /* Name A register X register Y register flags replacement */
{ "addeqysp", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, F_NONE, "addeq0sp" }, {
{ "laddeqysp", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, F_NONE, "laddeq0sp" }, "addeqysp",
{ "ldaxidx", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 1, F_NONE, "ldaxi" }, {
{ "ldaxysp", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 1, F_NONE, "ldax0sp" }, /* A X Y SRegLo */
{ "ldeaxidx", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 3, F_NONE, "ldeaxi" }, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL,
{ "ldeaxysp", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 3, F_NONE, "ldeax0sp" }, /* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
{ "lsubeqysp", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, F_NONE, "lsubeq0sp" }, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
{ "pusha", 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL, F_SLOWER, "pushc0" }, },
{ "pusha", 1, UNKNOWN_REGVAL, UNKNOWN_REGVAL, F_SLOWER, "pushc1" }, F_NONE,
{ "pusha", 2, UNKNOWN_REGVAL, UNKNOWN_REGVAL, F_SLOWER, "pushc2" }, "addeq0sp"
{ "pushax", 0, 0, UNKNOWN_REGVAL, F_NONE, "push0" }, },{
{ "pushax", 1, 0, UNKNOWN_REGVAL, F_SLOWER, "push1" }, "laddeqysp",
{ "pushax", 2, 0, UNKNOWN_REGVAL, F_SLOWER, "push2" }, {
{ "pushax", 3, 0, UNKNOWN_REGVAL, F_SLOWER, "push3" }, /* A X Y SRegLo */
{ "pushax", 4, 0, UNKNOWN_REGVAL, F_SLOWER, "push4" }, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL,
{ "pushax", 5, 0, UNKNOWN_REGVAL, F_SLOWER, "push5" }, /* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
{ "pushax", 6, 0, UNKNOWN_REGVAL, F_SLOWER, "push6" }, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
{ "pushax", 7, 0, UNKNOWN_REGVAL, F_SLOWER, "push7" }, },
{ "pushax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "pusha0" }, F_NONE,
{ "pushax", UNKNOWN_REGVAL, 0xFF, UNKNOWN_REGVAL, F_SLOWER, "pushaFF" }, "laddeq0sp"
{ "pushaysp", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, F_NONE, "pusha0sp" }, },{
{ "pushwidx", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 1, F_NONE, "pushw" }, "ldaxidx",
{ "pushwysp", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 3, F_NONE, "pushw0sp" }, {
{ "staxysp", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, F_NONE, "stax0sp" }, /* A X Y SRegLo */
{ "steaxysp", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, F_NONE, "steax0sp" }, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 1, UNKNOWN_REGVAL,
{ "subeqysp", UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, F_NONE, "subeq0sp" }, /* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
{ "tosaddax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosadda0" }, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
{ "tosandax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosanda0" }, },
{ "tosdivax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosdiva0" }, F_NONE,
{ "toseqax", 0, 0, UNKNOWN_REGVAL, F_NONE, "toseq00" }, "ldaxi"
{ "toseqax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "toseqa0" }, },{
{ "tosgeax", 0, 0, UNKNOWN_REGVAL, F_NONE, "tosge00" }, "ldaxysp",
{ "tosgeax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosgea0" }, {
{ "tosgtax", 0, 0, UNKNOWN_REGVAL, F_NONE, "tosgt00" }, /* A X Y SRegLo */
{ "tosgtax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosgta0" }, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 1, UNKNOWN_REGVAL,
{ "tosicmp", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosicmp0" }, /* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
{ "tosleax", 0, 0, UNKNOWN_REGVAL, F_NONE, "tosle00" }, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
{ "tosleax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "toslea0" }, },
{ "tosltax", 0, 0, UNKNOWN_REGVAL, F_NONE, "toslt00" }, F_NONE,
{ "tosltax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "toslta0" }, "ldax0sp"
{ "tosmodax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosmoda0" }, },{
{ "tosmulax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosmula0" }, "ldeaxidx",
{ "tosneax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosnea0" }, {
{ "tosorax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosora0" }, /* A X Y SRegLo */
{ "tosrsubax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosrsuba0" }, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 3, UNKNOWN_REGVAL,
{ "tossubax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tossuba0" }, /* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
{ "tosudivax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosudiva0" }, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
{ "tosugeax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosugea0" }, },
{ "tosugtax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosugta0" }, F_NONE,
{ "tosuleax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosulea0" }, "ldeaxi"
{ "tosultax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosulta0" }, },{
{ "tosumodax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosumoda0" }, "ldeaxysp",
{ "tosumulax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosumula0" }, {
{ "tosxorax", UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, F_NONE, "tosxora0" }, /* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, 3, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"ldeax0sp"
},{
"lsubeqysp",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"lsubeq0sp"
},{
"pusha",
{
/* A X Y SRegLo */
0, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_SLOWER,
"pushc0"
},{
"pusha",
{
/* A X Y SRegLo */
1, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_SLOWER,
"pushc1"
},{
"pusha",
{
/* A X Y SRegLo */
2, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_SLOWER,
"pushc2"
},{
"pushax",
{
/* A X Y SRegLo */
0, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"push0"
},{
"pushax",
{
/* A X Y SRegLo */
1, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_SLOWER,
"push1"
},{
"pushax",
{
/* A X Y SRegLo */
2, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_SLOWER,
"push2"
},{
"pushax",
{
/* A X Y SRegLo */
3, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_SLOWER,
"push3"
},{
"pushax",
{
/* A X Y SRegLo */
4, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_SLOWER,
"push4"
},{
"pushax",
{
/* A X Y SRegLo */
5, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_SLOWER,
"push5"
},{
"pushax",
{
/* A X Y SRegLo */
6, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_SLOWER,
"push6"
},{
"pushax",
{
/* A X Y SRegLo */
7, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_SLOWER,
"push7"
},{
"pushax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"pusha0"
},{
"pushax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0xFF, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_SLOWER,
"pushaFF"
},{
"pushaysp",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"pusha0sp"
},{
"pusheax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
0, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"push0ax"
},{
"pushwidx",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, 1, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"pushw"
},{
"pushwysp",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, 3, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"pushw0sp"
},{
"staxysp",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"stax0sp"
},{
"steaxysp",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"steax0sp"
},{
"subeqysp",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"subeq0sp"
},{
"tosaddax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosadda0"
},{
"tosaddeax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
0, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosadd0ax"
},{
"tosandax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosanda0"
},{
"tosdivax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosdiva0"
},{
"tosdiveax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
0, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosdiv0ax"
},{
"toseqax",
{
/* A X Y SRegLo */
0, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"toseq00"
},{
"toseqax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"toseqa0"
},{
"tosgeax",
{
/* A X Y SRegLo */
0, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosge00"
},{
"tosgeax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosgea0"
},{
"tosgtax",
{
/* A X Y SRegLo */
0, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosgt00"
},{
"tosgtax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosgta0"
},{
"tosicmp",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosicmp0"
},{
"tosleax",
{
/* A X Y SRegLo */
0, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosle00"
},{
"tosleax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"toslea0"
},{
"tosltax",
{
/* A X Y SRegLo */
0, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"toslt00"
},{
"tosltax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"toslta0"
},{
"tosmodax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosmoda0"
},{
"tosmodeax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
0, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosmod0ax"
},{
"tosmulax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosmula0"
},{
"tosmuleax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
0, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosmul0ax"
},{
"tosneax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosnea0"
},{
"tosorax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosora0"
},{
"tosrsubax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosrsuba0"
},{
"tossubax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tossuba0"
},{
"tossubeax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
0, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tossub0ax"
},{
"tosudivax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosudiva0"
},{
"tosudiveax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
0, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosudiv0ax"
},{
"tosugeax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosugea0"
},{
"tosugtax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosugta0"
},{
"tosuleax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosulea0"
},{
"tosultax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosulta0"
},{
"tosumodax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosumoda0"
},{
"tosumodeax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
0, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosumod0ax"
},{
"tosumulax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosumula0"
},{
"tosumuleax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, 0,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
0, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosumul0ax"
},{
"tosxorax",
{
/* A X Y SRegLo */
UNKNOWN_REGVAL, 0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
/* SRegHi Ptr1Lo Ptr1Hi Tmp1 */
UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
},
F_NONE,
"tosxora0"
},
#if 0 #if 0
"tosadd0ax", /* tosaddeax, sreg = 0 */
"laddeqa", /* laddeq, sreg = 0, x = 0 */ "laddeqa", /* laddeq, sreg = 0, x = 0 */
"laddeq1", /* laddeq, sreg = 0, x = 0, a = 1 */ "laddeq1", /* laddeq, sreg = 0, x = 0, a = 1 */
"tosand0ax", /* tosandeax, sreg = 0 */ "tosand0ax", /* tosandeax, sreg = 0 */
"tosdiv0ax", /* tosdiveax, sreg = 0 */
"tosmod0ax", /* tosmodeax, sreg = 0 */
"tosmul0ax", /* tosmuleax, sreg = 0 */
"tosumul0ax", /* tosumuleax, sreg = 0 */
"tosor0ax", /* tosoreax, sreg = 0 */ "tosor0ax", /* tosoreax, sreg = 0 */
"push0ax", /* pusheax, sreg = 0 */
"tosrsub0ax", /* tosrsubeax, sreg = 0 */ "tosrsub0ax", /* tosrsubeax, sreg = 0 */
"tosshl0ax", /* tosshleax, sreg = 0 */ "tosshl0ax", /* tosshleax, sreg = 0 */
"tosasl0ax", /* tosasleax, sreg = 0 */ "tosasl0ax", /* tosasleax, sreg = 0 */
"tosshr0ax", /* tosshreax, sreg = 0 */ "tosshr0ax", /* tosshreax, sreg = 0 */
"tosasr0ax", /* tosasreax, sreg = 0 */ "tosasr0ax", /* tosasreax, sreg = 0 */
"tossub0ax", /* tossubeax, sreg = 0 */
"lsubeqa", /* lsubeq, sreg = 0, x = 0 */ "lsubeqa", /* lsubeq, sreg = 0, x = 0 */
"lsubeq1", /* lsubeq, sreg = 0, x = 0, a = 1 */ "lsubeq1", /* lsubeq, sreg = 0, x = 0, a = 1 */
"tosudiv0ax", /* tosudiveax, sreg = 0 */
"tosumod0ax", /* tosumodeax, sreg = 0 */
"tosxor0ax", /* tosxoreax, sreg = 0 */ "tosxor0ax", /* tosxoreax, sreg = 0 */
#endif #endif
}; };
@ -196,6 +766,16 @@ static const CallDesc* FindCall (const char* Name)
static int RegMatch (short Expected, short Actual)
/* Check for a register match. If Expected has a value, it must be identical
* to Actual.
*/
{
return RegValIsUnknown (Expected) || (Expected == Actual);
}
/*****************************************************************************/ /*****************************************************************************/
/* Code */ /* Code */
/*****************************************************************************/ /*****************************************************************************/
@ -230,6 +810,9 @@ unsigned OptSize1 (CodeSeg* S)
/* Check if it's a subroutine call */ /* Check if it's a subroutine call */
if (E->OPC == OP65_JSR && (D = FindCall (E->Arg)) != 0) { if (E->OPC == OP65_JSR && (D = FindCall (E->Arg)) != 0) {
/* Get input register info for this insn */
const RegContents* In = &E->RI->In;
/* FindCall finds the first entry that matches our function name. /* FindCall finds the first entry that matches our function name.
* The names are listed in "best match" order, so search for the * The names are listed in "best match" order, so search for the
* first one, that fulfills our conditions. * first one, that fulfills our conditions.
@ -239,10 +822,12 @@ unsigned OptSize1 (CodeSeg* S)
/* Check the registers and allow slower code only if /* Check the registers and allow slower code only if
* optimizing for size. * optimizing for size.
*/ */
if ((D->A < 0 || D->A == E->RI->In.RegA) && if ((OptForSize || (D->Flags & F_SLOWER) == 0) &&
(D->X < 0 || D->X == E->RI->In.RegX) && RegMatch (D->Regs.RegA, In->RegA) &&
(D->Y < 0 || D->Y == E->RI->In.RegY) && RegMatch (D->Regs.RegX, In->RegX) &&
(OptForSize || (D->Flags & F_SLOWER) == 0)) { RegMatch (D->Regs.RegY, In->RegY) &&
RegMatch (D->Regs.SRegLo, In->SRegLo) &&
RegMatch (D->Regs.SRegHi, In->SRegHi)) {
/* Ok, match for all conditions */ /* Ok, match for all conditions */
CodeEntry* X; CodeEntry* X;