X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fmcs51%2Fmain.c;h=bbe4921c6319352360ddfebce789653669531596;hb=022ad5f4b7e62ee89ae9723242d3ecc459391711;hp=c9f6cd7f5633b60fc10928b5e70fd9ceb0c9d868;hpb=b4d69dfd516f175255aa87b18b59dcf309d98b46;p=fw%2Fsdcc diff --git a/src/mcs51/main.c b/src/mcs51/main.c index c9f6cd7f..bbe4921c 100644 --- a/src/mcs51/main.c +++ b/src/mcs51/main.c @@ -39,6 +39,7 @@ static char *_mcs51_keywords[] = "_xdata", "_pdata", "_idata", + "_naked", NULL }; @@ -83,32 +84,7 @@ _mcs51_parseOptions (int *pargc, char **argv, int *i) static void _mcs51_finaliseOptions (void) { - /* Hack-o-matic: if we are using the flat24 model, - * adjust pointer sizes. - */ - if (options.model == MODEL_FLAT24) - { - - fprintf (stderr, "*** WARNING: you should use the '-mds390' option " - "for DS80C390 support. This code generator is " - "badly out of date and probably broken.\n"); - - port->s.fptr_size = 3; - port->s.gptr_size = 4; - port->stack.isr_overhead++; /* Will save dpx on ISR entry. */ -#if 1 - port->stack.call_overhead++; /* This acounts for the extra byte - * of return addres on the stack. - * but is ugly. There must be a - * better way. - */ -#endif - fReturn = fReturn390; - fReturnSize = 5; - } - - if (options.model == MODEL_LARGE) - { + if (options.model == MODEL_LARGE) { port->mem.default_local_map = xdata; port->mem.default_globl_map = xdata; } @@ -117,25 +93,6 @@ _mcs51_finaliseOptions (void) port->mem.default_local_map = data; port->mem.default_globl_map = data; } - - if (options.stack10bit) - { - if (options.model != MODEL_FLAT24) - { - fprintf (stderr, - "*** warning: 10 bit stack mode is only supported in flat24 model.\n"); - fprintf (stderr, "\t10 bit stack mode disabled.\n"); - options.stack10bit = 0; - } - else - { - /* Fixup the memory map for the stack; it is now in - * far space and requires a FPOINTER to access it. - */ - istack->fmap = 1; - istack->ptrType = FPOINTER; - } - } } static void @@ -154,45 +111,35 @@ _mcs51_getRegName (struct regs *reg) static void _mcs51_genAssemblerPreamble (FILE * of) { - if (options.model == MODEL_FLAT24) - { - fputs (".flat24 on\t\t; 24 bit flat addressing\n", of); - fputs ("dpx = 0x93\t\t; dpx register unknown to assembler\n", of); - fputs ("dps = 0x86\t\t; dps register unknown to assembler\n", of); - fputs ("dpl1 = 0x84\t\t; dpl1 register unknown to assembler\n", of); - fputs ("dph1 = 0x85\t\t; dph1 register unknown to assembler\n", of); - fputs ("dpx1 = 0x95\t\t; dpx1 register unknown to assembler\n", of); - } } /* Generate interrupt vector table. */ static int _mcs51_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts) { - int i; - - if (options.model != MODEL_FLAT24) - { - /* Let the default code handle it. */ - return FALSE; - } - - fprintf (of, "\tajmp\t__sdcc_gsinit_startup\n"); + return FALSE; +} - /* now for the other interrupts */ - for (i = 0; i < maxInterrupts; i++) - { - if (interrupts[i]) - { - fprintf (of, "\tljmp\t%s\n\t.ds\t4\n", interrupts[i]->rname); - } - else - { - fprintf (of, "\treti\n\t.ds\t7\n"); - } +/* Do CSE estimation */ +static bool cseCostEstimation (iCode *ic, iCode *pdic) +{ + operand *result = IC_RESULT(ic); + sym_link *result_type = operandType(result); + + /* if it is a pointer then return ok for now */ + if (IC_RESULT(ic) && IS_PTR(result_type)) return 1; + + /* if bitwise | add & subtract then no since mcs51 is pretty good at it + so we will cse only if they are local (i.e. both ic & pdic belong to + the same basic block */ + if (IS_BITWISE_OP(ic) || ic->op == '+' || ic->op == '-') { + /* then if they are the same Basic block then ok */ + if (ic->eBBlockNum == pdic->eBBlockNum) return 1; + else return 0; } - - return TRUE; + + /* for others it is cheaper to do the cse */ + return 1; } /** $1 is always the basename. @@ -203,33 +150,38 @@ _mcs51_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts) */ static const char *_linkCmd[] = { - "aslink", "-nf", "$1", NULL + "{bindir}{sep}aslink", "-nf", "$1", NULL }; +/* $3 is replaced by assembler.debug_opts resp. port->assembler.plain_opts */ static const char *_asmCmd[] = { - "asx8051", "-plosgffc", "$1.asm", NULL + "asx8051", "$l", "$3", "$1.asm", NULL }; /* Globals */ PORT mcs51_port = { + TARGET_ID_MCS51, "mcs51", "MCU 8051", /* Target name */ { TRUE, /* Emit glue around main */ - MODEL_SMALL | MODEL_LARGE | MODEL_FLAT24, + MODEL_SMALL | MODEL_LARGE, MODEL_SMALL }, { _asmCmd, + NULL, "-plosgffc", /* Options with debug */ "-plosgff", /* Options without debug */ - 0 + 0, + ".asm" }, { _linkCmd, NULL, + NULL, ".rel" }, { @@ -237,7 +189,7 @@ PORT mcs51_port = }, { /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */ - 1, 1, 2, 4, 1, 2, 3, 1, 4, 4 + 1, 2, 2, 4, 1, 2, 3, 1, 4, 4 }, { "XSEG (XDATA)", @@ -261,7 +213,7 @@ PORT mcs51_port = }, /* mcs51 has an 8 bit mul */ { - 1, 0 + 1, -1 }, "_", _mcs51_init, @@ -276,6 +228,8 @@ PORT mcs51_port = _mcs51_reset_regparm, _mcs51_regparm, NULL, + NULL, + NULL, FALSE, 0, /* leave lt */ 0, /* leave gt */ @@ -283,5 +237,8 @@ PORT mcs51_port = 1, /* transform >= to ! < */ 1, /* transform != to !(a == b) */ 0, /* leave == */ + FALSE, /* No array initializer support. */ + cseCostEstimation, + NULL, /* no builtin functions */ PORT_MAGIC };