From c446f6b6ad7298f2f8249f2874cd25e9d64bbf21 Mon Sep 17 00:00:00 2001 From: johanknol Date: Thu, 17 Jan 2002 14:23:49 +0000 Subject: [PATCH] Just to make sure I don't loose them again when syncing with cvs. It is useless for now. git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1809 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- configure | 4 +- src/xa51/Makefile | 2 + src/xa51/Makefile.bcc | 22 + src/xa51/Makefile.dep | 23 + src/xa51/gen.c | 1213 +++++++++++++++++++++++ src/xa51/gen.h | 65 ++ src/xa51/gen.o | Bin 0 -> 57164 bytes src/xa51/main.c | 285 ++++++ src/xa51/main.h | 8 + src/xa51/main.o | Bin 0 -> 29150 bytes src/xa51/peeph.def | 0 src/xa51/peeph.rul | 3 + src/xa51/port.a | Bin 0 -> 150245 bytes src/xa51/ralloc.c | 2163 +++++++++++++++++++++++++++++++++++++++++ src/xa51/ralloc.h | 81 ++ src/xa51/ralloc.o | Bin 0 -> 63429 bytes 16 files changed, 3867 insertions(+), 2 deletions(-) create mode 100644 src/xa51/Makefile create mode 100644 src/xa51/Makefile.bcc create mode 100644 src/xa51/Makefile.dep create mode 100755 src/xa51/gen.c create mode 100755 src/xa51/gen.h create mode 100644 src/xa51/gen.o create mode 100755 src/xa51/main.c create mode 100644 src/xa51/main.h create mode 100644 src/xa51/main.o create mode 100644 src/xa51/peeph.def create mode 100644 src/xa51/peeph.rul create mode 100644 src/xa51/port.a create mode 100755 src/xa51/ralloc.c create mode 100755 src/xa51/ralloc.h create mode 100644 src/xa51/ralloc.o diff --git a/configure b/configure index 39e206cb..8939cada 100755 --- a/configure +++ b/configure @@ -2801,9 +2801,9 @@ if test "$enable_xa51_port" = "no"; then EOF else - #echo xa51 >>ports.build // not yet + echo xa51 >>ports.build cat >> confdefs.h < peeph.rul + +# include clean.mk diff --git a/src/xa51/Makefile.dep b/src/xa51/Makefile.dep new file mode 100644 index 00000000..4635445b --- /dev/null +++ b/src/xa51/Makefile.dep @@ -0,0 +1,23 @@ +gen.o: gen.c ../SDCCglobl.h ../../sdccconf.h \ + ../../support/Util/SDCCerr.h ../../support/Util/newalloc.h \ + ../common.h ../SDCCmem.h ../SDCCast.h ../SDCCsymt.h ../SDCChasht.h \ + ../SDCCval.h ../SDCCset.h ../SDCCy.h ../SDCCbitv.h ../SDCCicode.h \ + ../SDCClabel.h ../SDCCBBlock.h ../SDCCloop.h ../SDCCcse.h \ + ../SDCCcflow.h ../SDCCdflow.h ../SDCClrange.h ../SDCCptropt.h \ + ../SDCCopt.h ../SDCCglue.h ../SDCCpeeph.h ../asm.h ../port.h ralloc.h \ + gen.h +main.o: main.c ../common.h ../SDCCglobl.h ../../sdccconf.h \ + ../../support/Util/SDCCerr.h ../SDCCmem.h ../SDCCast.h ../SDCCsymt.h \ + ../SDCChasht.h ../SDCCval.h ../SDCCset.h ../SDCCy.h ../SDCCbitv.h \ + ../SDCCicode.h ../SDCClabel.h ../SDCCBBlock.h ../SDCCloop.h \ + ../SDCCcse.h ../SDCCcflow.h ../SDCCdflow.h ../SDCClrange.h \ + ../SDCCptropt.h ../SDCCopt.h ../SDCCglue.h ../SDCCpeeph.h ../asm.h \ + ../port.h ../../support/Util/newalloc.h main.h ralloc.h gen.h \ + peeph.rul +ralloc.o: ralloc.c ../common.h ../SDCCglobl.h ../../sdccconf.h \ + ../../support/Util/SDCCerr.h ../SDCCmem.h ../SDCCast.h ../SDCCsymt.h \ + ../SDCChasht.h ../SDCCval.h ../SDCCset.h ../SDCCy.h ../SDCCbitv.h \ + ../SDCCicode.h ../SDCClabel.h ../SDCCBBlock.h ../SDCCloop.h \ + ../SDCCcse.h ../SDCCcflow.h ../SDCCdflow.h ../SDCClrange.h \ + ../SDCCptropt.h ../SDCCopt.h ../SDCCglue.h ../SDCCpeeph.h ../asm.h \ + ../port.h ../../support/Util/newalloc.h ralloc.h gen.h diff --git a/src/xa51/gen.c b/src/xa51/gen.c new file mode 100755 index 00000000..40427b9c --- /dev/null +++ b/src/xa51/gen.c @@ -0,0 +1,1213 @@ +/*------------------------------------------------------------------------- + SDCCgen51.c - source file for code generation for 8051 + + Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998) + and - Jean-Louis VERN.jlvern@writeme.com (1999) + Bug Fixes - Wojciech Stryjewski wstryj1@tiger.lsu.edu (1999 v2.1.9a) + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! + + Notes: + 000123 mlh Moved aopLiteral to SDCCglue.c to help the split + Made everything static +-------------------------------------------------------------------------*/ + +//#define D(x) +#define D(x) x + +#include +#include +#include +#include +#include "SDCCglobl.h" +#include "newalloc.h" + +#ifdef HAVE_SYS_ISA_DEFS_H +#include +#else +#ifdef HAVE_MACHINE_ENDIAN_H +#include +#else +#ifdef HAVE_ENDIAN_H +#include +#else +#if !defined(__BORLANDC__) && !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__CYGWIN__) +#warning "Cannot determine ENDIANESS of this machine assuming LITTLE_ENDIAN" +#warning "If you running sdcc on an INTEL 80x86 Platform you are okay" +#endif +#endif +#endif +#endif + +#include "common.h" +#include "SDCCpeeph.h" +#include "ralloc.h" +#include "gen.h" + +#if defined(__BORLANDC__) || defined(_MSC_VER) +#define STRCASECMP stricmp +#else +#define STRCASECMP strcasecmp +#endif + +extern int allocInfo; + +/* this is the down and dirty file with all kinds of + kludgy & hacky stuff. This is what it is all about + CODE GENERATION for a specific MCU . some of the + routines may be reusable, will have to see */ + +static struct + { + short inLine; + short debugLine; + short nRegsSaved; + set *sendSet; + } +_G; + +extern int xa51_ptrRegReq; +extern int xa51_nRegs; +extern FILE *codeOutFile; + +static lineNode *lineHead = NULL; +static lineNode *lineCurr = NULL; + +#define LSB 0 +#define MSB16 1 +#define MSB24 2 +#define MSB32 3 + +/*-----------------------------------------------------------------*/ +/* emitcode - writes the code into a file : for now it is simple */ +/*-----------------------------------------------------------------*/ +static void emitcode (char *inst, char *fmt,...) { + va_list ap; + char lb[INITIAL_INLINEASM]; + char *lbp = lb; + + va_start (ap, fmt); + + if (inst && *inst) + { + if (fmt && *fmt) + sprintf (lb, "%s\t", inst); + else + sprintf (lb, "%s", inst); + vsprintf (lb + (strlen (lb)), fmt, ap); + } + else + vsprintf (lb, fmt, ap); + + while (isspace ((int)*lbp)) + lbp++; + + if (lbp && *lbp) + lineCurr = (lineCurr ? + connectLine (lineCurr, newLineNode (lb)) : + (lineHead = newLineNode (lb))); + lineCurr->isInline = _G.inLine; + lineCurr->isDebug = _G.debugLine; + va_end (ap); +} + +/*-----------------------------------------------------------------*/ +/* newAsmop - creates a new asmOp */ +/*-----------------------------------------------------------------*/ +static asmop * +newAsmop (short type) +{ + asmop *aop; + + aop = Safe_calloc (1, sizeof (asmop)); + aop->type = type; + return aop; +} + +char *aopTypeName(asmop *aop) { + switch (aop->type) + { + case AOP_LIT: return "lit"; + case AOP_REG: return "reg"; + case AOP_DIR: return "dir"; + case AOP_FAR: return "far"; + case AOP_CODE: return "code"; + case AOP_STK: return "stack"; + case AOP_IMMD: return "imm"; + case AOP_CRY: return "bit"; + } + return "unknown"; +} + +/*-----------------------------------------------------------------*/ +/* aopForSym - for a true symbol */ +/*-----------------------------------------------------------------*/ +static asmop *aopForSym(symbol *sym, bool result) { + asmop *aop; + + sym->aop = aop = newAsmop(0); + aop->size=getSize(sym->type); + + // if it is in registers + if (sym->nRegs && sym->regs[0]) { + aop->type=AOP_REG; + if (sym->regs[1]) { + sprintf (aop->name[1], sym->regs[1]->name); + } + sprintf (aop->name[0], sym->regs[0]->name); + return aop; + } + + // if it is on stack + if (sym->onStack) { + aop->type=AOP_STK; + sprintf (aop->name[0], "[r7+%d+0+%d+%d]", sym->stack, + FUNC_ISISR(currFunc->type) ? 6 : 4, _G.nRegsSaved); + sprintf (aop->name[1], "[r7+%d+2+%d+%d]", sym->stack, + FUNC_ISISR(currFunc->type) ? 6 : 4, _G.nRegsSaved); + return aop; + } + + // if it has a spillLoc + if (sym->usl.spillLoc) { + return aopForSym (sym->usl.spillLoc, result); + } + + // if in bit space + if (IN_BITSPACE(SPEC_OCLS(sym->etype))) { + aop->type=AOP_CRY; + sprintf (aop->name[0], sym->rname); + return aop; + } + + // if in direct space + if (IN_DIRSPACE(SPEC_OCLS(sym->etype))) { + aop->type=AOP_DIR; + sprintf (aop->name[0], sym->rname); + sprintf (aop->name[1], "#0x%02x", POINTER); + return aop; + } + + // if in code space + if (IN_CODESPACE(SPEC_OCLS(sym->etype))) { + if (result) { + fprintf (stderr, "aopForSym: result can not be in code space\n"); + exit (1); + } + aop->type=AOP_CODE; + emitcode ("mov", "r0,#%s", sym->rname); + sprintf (aop->name[0], "r0"); + sprintf (aop->name[1], "#0x%02x", CPOINTER); + return aop; + } + + // if in far space + if (IN_FARSPACE(SPEC_OCLS(sym->etype))) { + aop->type=AOP_FAR; + emitcode ("mov", "r0,#%s", sym->rname); + sprintf (aop->name[0], "[r0]"); + if (result) { + sprintf (aop->name[1], "[r0+2]"); + } else { + sprintf (aop->name[1], "#0x%02x", FPOINTER); + } + return aop; + } + + // special case for a function + if (IS_FUNC (sym->type)) { + aop->type=AOP_IMMD; + sprintf (aop->name[0], sym->rname); + return aop; + } + + fprintf (stderr, "aopForSym (%s): What's up?\n", sym->name); + exit (1); +} + +/*-----------------------------------------------------------------*/ +/* aopForVal - for a value */ +/*-----------------------------------------------------------------*/ +static asmop *aopForVal(operand *op) { + asmop *aop; + long v=floatFromVal(OP_VALUE(op)); + + if (IS_OP_LITERAL(op)) { + op->aop = aop = newAsmop (AOP_LIT); + switch ((aop->size=getSize(operandType(op)))) + { + case 1: + sprintf (aop->name[0], "#0x%02lx", v); + break; + case 2: + sprintf (aop->name[0], "#0x%04lx", v); + break; + case 4: + sprintf (aop->name[0], "#(0x%08lx >> 16)", v); + sprintf (aop->name[1], "#(0x%08lx & 0xffff)", v); + break; + default: + fprintf (stderr, "aopForVal (lit): unknown size\n"); + exit (1); + } + return aop; + } + + // must be immediate + if (IS_SYMOP(op)) { + op->aop = aop = newAsmop (AOP_IMMD); + switch ((aop->size=getSize(OP_SYMBOL(op)->type))) + { + case 1: + case 2: + sprintf (aop->name[0], "#%s", OP_SYMBOL(op)->rname); + return aop; + case 3: // generic pointer + sprintf (aop->name[0], "#0x%02x", DCL_TYPE(operandType(op))); + sprintf (aop->name[1], "#%s", OP_SYMBOL(op)->rname); + return aop; + } + } + fprintf (stderr, "aopForVal: unknown type\n"); + exit (1); + return NULL; +} + +static void aopOp(operand *op, bool result) { + + if (IS_SYMOP(op)) { + op->aop=aopForSym (OP_SYMBOL(op), result); + return; + } + if (IS_VALOP(op)) { + if (result) { + fprintf (stderr, "aopOp: result can not be a value\n"); + exit (1); + } + aopForVal (op); + return; + } + + fprintf (stderr, "aopOp: unexpected operand\n"); + exit (1); +} + +char *opRegName(operand *op, int offset, char *opName) { + + if (IS_SYMOP(op)) { + if (OP_SYMBOL(op)->onStack) { + sprintf (aop->name[0], "[r7+%d+0+%d+%d]", sym->stack, + FUNC_ISISR(currFunc->type) ? 6 : 4, _G.nRegsSaved); + return opName; + } + if (IS_TRUE_SYMOP(op)) + return OP_SYMBOL(op)->rname; + else if (OP_SYMBOL(op)->regs[offset]) + return OP_SYMBOL(op)->regs[offset]->name; + else + return "NULL"; + } + + if (IS_VALOP(op)) { + switch (SPEC_NOUN(OP_VALUE(op)->type)) { + case V_BIT: + if (SPEC_CVAL(OP_VALUE(op)->type).v_int && + SPEC_CVAL(OP_VALUE(op)->type).v_int != 1) { + fprintf (stderr, "opRegName: invalid bit value (%d)\n", + SPEC_CVAL(OP_VALUE(op)->type).v_int); + exit (1); + } + // fall through + case V_CHAR: + sprintf (opName, "#0x%02x", SPEC_CVAL(OP_VALUE(op)->type).v_int); + break; + case V_INT: + if (SPEC_LONG(OP_VALUE(op)->type)) { + sprintf (opName, "#0x%02lx", SPEC_CVAL(OP_VALUE(op)->type).v_long); + } else { + sprintf (opName, "#0x%02x", SPEC_CVAL(OP_VALUE(op)->type).v_int); + } + break; + case V_FLOAT: + sprintf (opName, "#0x%02lx", SPEC_CVAL(OP_VALUE(op)->type).v_long); + break; + default: + fprintf (stderr, "opRegName: unexpected noun\n"); + exit (1); + } + return opName; + } + fprintf (stderr, "opRegName: unexpected operand type\n"); + exit (1); + return NULL; // to keep the compiler happy +} + +char * printOp (operand *op) { + static char line[132]; + bool isPtr = op->isPtr | op->isGptr; + + if (IS_SYMOP(op)) { + symbol *sym=OP_SYMBOL(op); + if (!sym->regs[0] && SYM_SPIL_LOC(sym)) { + sym=SYM_SPIL_LOC(sym); + } + if (isPtr) { + sprintf (line, "[%s]:", sym->name); + } else { + sprintf (line, "%s:", sym->name); + } + if (sym->regs[0]) { + strcat (line, sym->regs[0]->name); + if (sym->regs[1]) { + strcat (line, ","); + strcat (line, sym->regs[1]->name); + } + return line; + } + if (sym->onStack) { + sprintf (line+strlen(line), "stack+%d", sym->stack); + return line; + } + if (IN_FARSPACE(SPEC_OCLS(sym->etype))) { + strcat (line, "far"); + return line; + } + if (IN_BITSPACE(SPEC_OCLS(sym->etype))) { + strcat (line, "bit"); + return line; + } + if (IN_DIRSPACE(SPEC_OCLS(sym->etype))) { + strcat (line, "dir"); + return line; + } + strcat (line, "unknown"); + return line; + } else if (IS_VALOP(op)) { + opRegName(op, 0, line); + } else if (IS_TYPOP(op)) { + sprintf (line, "("); + // forget about static, volatile, ... for now + if (SPEC_USIGN(operandType(op))) strcat (line, "unsigned "); + if (SPEC_LONG(operandType(op))) strcat (line, "long "); + strcat (line, nounName(operandType(op))); + strcat (line, ")"); + } else { + fprintf (stderr, "printOp: unexpected operand type\n"); + exit (1); + } + return line; +} + +void printIc (char *op, iCode * ic, bool result, bool left, bool right) { + char line[132]; + + sprintf (line, "%s", op); + if (result) { + strcat (line, " result="); + strcat (line, printOp (IC_RESULT(ic))); + } + if (left) { + strcat (line, " left="); + strcat (line, printOp (IC_LEFT(ic))); + } + if (right) { + strcat (line, " right="); + strcat (line, printOp (IC_RIGHT(ic))); + } + emitcode (";", line); +} + +/*-----------------------------------------------------------------*/ +/* toBoolean - return bit for operand!=0 */ +/*-----------------------------------------------------------------*/ +static char *toBoolean (operand * op) { + switch (AOP_SIZE(op)) + { + case 1: + case 2: + emitcode ("cmp", "%s,#0", AOP_NAME(op)); + return "z"; + } + + fprintf (stderr, "toBoolean: unknown size %d\n", AOP_SIZE(op)); + exit (1); + return NULL; +} + +/*-----------------------------------------------------------------*/ +/* regsInCommon - two operands have some registers in common */ +/*-----------------------------------------------------------------*/ +static bool regsInCommon (operand * op1, operand * op2) { + symbol *sym1, *sym2; + int i; + + /* if they have registers in common */ + if (!IS_SYMOP (op1) || !IS_SYMOP (op2)) + return FALSE; + + sym1 = OP_SYMBOL (op1); + sym2 = OP_SYMBOL (op2); + + if (sym1->nRegs == 0 || sym2->nRegs == 0) + return FALSE; + + for (i = 0; i < sym1->nRegs; i++) + { + int j; + if (!sym1->regs[i]) + continue; + + for (j = 0; j < sym2->nRegs; j++) + { + if (!sym2->regs[j]) + continue; + + if (sym2->regs[j] == sym1->regs[i]) + return TRUE; + } + } + + return FALSE; +} + +/*-----------------------------------------------------------------*/ +/* resultRemat - result is rematerializable */ +/*-----------------------------------------------------------------*/ +static int resultRemat (iCode * ic) { + if (SKIP_IC (ic) || ic->op == IFX) + return 0; + + if (IC_RESULT (ic) && IS_ITEMP (IC_RESULT (ic))) + { + symbol *sym = OP_SYMBOL (IC_RESULT (ic)); + if (sym->remat && !POINTER_SET (ic)) + return 1; + } + + return 0; +} + +/*-----------------------------------------------------------------*/ +/* genNot - generate code for ! operation */ +/*-----------------------------------------------------------------*/ +static void genNot (iCode * ic) { + printIc("genNot:", ic, 1,1,0); +} + +/*-----------------------------------------------------------------*/ +/* genCpl - generate code for complement */ +/*-----------------------------------------------------------------*/ +static void genCpl (iCode * ic) { + printIc("genCpl", ic, 1,1,0); +} + +/*-----------------------------------------------------------------*/ +/* genUminus - unary minus code generation */ +/*-----------------------------------------------------------------*/ +static void genUminus (iCode * ic) { + printIc("genUminus", ic, 1,1,0); +} + +/*-----------------------------------------------------------------*/ +/* genIpush - genrate code for pushing this gets a little complex */ +/*-----------------------------------------------------------------*/ +static void genIpush (iCode * ic) { + printIc ("genIpush", ic, 0,1,0); +} + +/*-----------------------------------------------------------------*/ +/* genIpop - recover the registers: can happen only for spilling */ +/*-----------------------------------------------------------------*/ +static void genIpop (iCode * ic) { + printIc ("genIpop", ic, 0,1,0); +} + +/*-----------------------------------------------------------------*/ +/* genCall - generates a call statement */ +/*-----------------------------------------------------------------*/ +static void genCall (iCode * ic) { + emitcode (";", "genCall %s", OP_SYMBOL(IC_LEFT(ic))->name); +} + +/*-----------------------------------------------------------------*/ +/* genPcall - generates a call by pointer statement */ +/*-----------------------------------------------------------------*/ +static void +genPcall (iCode * ic) +{ + emitcode (";", "genPcall %s\n", OP_SYMBOL(IC_LEFT(ic))->name); +} + +/*-----------------------------------------------------------------*/ +/* genFunction - generated code for function entry */ +/*-----------------------------------------------------------------*/ +static void genFunction (iCode * ic) { + symbol *sym=OP_SYMBOL(IC_LEFT(ic)); + sym_link *type=sym->type; + + emitcode (";", "-----------------------------------------"); + emitcode (";", " function %s", sym->name); + emitcode (";", "-----------------------------------------"); + + emitcode ("", "%s:", sym->rname); + + if (IFFUNC_ISNAKED(type)) + { + emitcode(";", "naked function: no prologue."); + return; + } + + /* if critical function then turn interrupts off */ + if (IFFUNC_ISCRITICAL (type)) + emitcode ("clr", "ea"); + +} + +/*-----------------------------------------------------------------*/ +/* genEndFunction - generates epilogue for functions */ +/*-----------------------------------------------------------------*/ +static void +genEndFunction (iCode * ic) +{ + symbol *sym = OP_SYMBOL (IC_LEFT (ic)); + + if (IFFUNC_ISNAKED(sym->type)) + { + emitcode(";", "naked function: no epilogue."); + return; + } + + printIc ("genEndFunction", ic, 0,0,0); +} + +/*-----------------------------------------------------------------*/ +/* genRet - generate code for return statement */ +/*-----------------------------------------------------------------*/ +static void genRet (iCode * ic) { + emitcode (";", "genRet"); +} + +/*-----------------------------------------------------------------*/ +/* genLabel - generates a label */ +/*-----------------------------------------------------------------*/ +static void genLabel (iCode * ic) { + /* special case never generate */ + if (IC_LABEL (ic) == entryLabel) + return; + + emitcode (";", "genLabel %s", IC_LABEL(ic)->name); + emitcode ("", "%05d$:", (IC_LABEL (ic)->key + 100)); +} + +/*-----------------------------------------------------------------*/ +/* genGoto - generates a ljmp */ +/*-----------------------------------------------------------------*/ +static void genGoto (iCode * ic) { + emitcode (";", "genGoto %s", IC_LABEL(ic)->name); + emitcode ("ljmp", "%05d$", (IC_LABEL (ic)->key + 100)); +} + +/*-----------------------------------------------------------------*/ +/* genPlus - generates code for addition */ +/*-----------------------------------------------------------------*/ +static void genPlus (iCode * ic) { + printIc ("genPlus", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genMinus - generates code for subtraction */ +/*-----------------------------------------------------------------*/ +static void genMinus (iCode * ic) { + printIc ("genMinus", ic, 1,1,1); +} + + +/*-----------------------------------------------------------------*/ +/* genMult - generates code for multiplication */ +/*-----------------------------------------------------------------*/ +static void genMult (iCode * ic) { + printIc ("genMult", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genDiv - generates code for division */ +/*-----------------------------------------------------------------*/ +static void genDiv (iCode * ic) { + printIc ("genDiv", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genMod - generates code for division */ +/*-----------------------------------------------------------------*/ +static void genMod (iCode * ic) { + printIc ("genMod", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genCmpGt :- greater than comparison */ +/*-----------------------------------------------------------------*/ +static void genCmpGt (iCode * ic, iCode * ifx) { + printIc ("genCmpGt", ic, 1,1,1); +} +/*-----------------------------------------------------------------*/ +/* genCmpLt - less than comparisons */ +/*-----------------------------------------------------------------*/ +static void genCmpLt (iCode * ic, iCode * ifx) { + printIc ("genCmpLt", ic, 1,1,1); +} +/*-----------------------------------------------------------------*/ +/* genCmpEq - generates code for equal to */ +/*-----------------------------------------------------------------*/ +static void genCmpEq (iCode * ic, iCode * ifx) { + printIc ("genCmpEq", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* ifxForOp - returns the icode containing the ifx for operand */ +/*-----------------------------------------------------------------*/ +static iCode *ifxForOp (operand * op, iCode * ic) { + /* if true symbol then needs to be assigned */ + if (IS_TRUE_SYMOP (op)) + return NULL; + + /* if this has register type condition and + the next instruction is ifx with the same operand + and live to of the operand is upto the ifx only then */ + if (ic->next && + ic->next->op == IFX && + IC_COND (ic->next)->key == op->key && + OP_SYMBOL (op)->liveTo <= ic->next->seq) + return ic->next; + + return NULL; +} + +/*-----------------------------------------------------------------*/ +/* hasInc - operand is incremented before any other use */ +/*-----------------------------------------------------------------*/ +static iCode *hasInc (operand *op, iCode *ic, int osize) { + sym_link *type = operandType(op); + sym_link *retype = getSpec (type); + iCode *lic = ic->next; + int isize ; + + /* this could from a cast, e.g.: "(char xdata *) 0x7654;" */ + if (!IS_SYMOP(op)) return NULL; + + if (IS_BITVAR(retype)||!IS_PTR(type)) return NULL; + if (IS_AGGREGATE(type->next)) return NULL; + if (osize != (isize = getSize(type->next))) return NULL; + + while (lic) { + /* if operand of the form op = op + */ + if (lic->op == '+' && isOperandEqual(IC_LEFT(lic),op) && + isOperandEqual(IC_RESULT(lic),op) && + isOperandLiteral(IC_RIGHT(lic)) && + operandLitValue(IC_RIGHT(lic)) == isize) { + return lic; + } + /* if the operand used or deffed */ + if (bitVectBitValue(OP_USES(op),lic->key) || (unsigned) lic->defKey == op->key) { + return NULL; + } + /* if GOTO or IFX */ + if (lic->op == IFX || lic->op == GOTO || lic->op == LABEL) break; + lic = lic->next; + } + return NULL; +} + +/*-----------------------------------------------------------------*/ +/* genAndOp - for && operation */ +/*-----------------------------------------------------------------*/ +static void genAndOp (iCode * ic) { + printIc ("genAndOp(&&)", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genOrOp - for || operation */ +/*-----------------------------------------------------------------*/ +static void genOrOp (iCode * ic) { + printIc ("genOrOp(||)", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genAnd - code for and */ +/*-----------------------------------------------------------------*/ +static void genAnd (iCode * ic, iCode * ifx) { + printIc ("genAnd", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genOr - code for or */ +/*-----------------------------------------------------------------*/ +static void genOr (iCode * ic, iCode * ifx) { + printIc ("genOr", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genXor - code for xclusive or */ +/*-----------------------------------------------------------------*/ +static void genXor (iCode * ic, iCode * ifx) { + printIc ("genXor", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genInline - write the inline code out */ +/*-----------------------------------------------------------------*/ +static void genInline (iCode * ic) { + printIc ("genInline", ic, 0,0,0); +} + +/*-----------------------------------------------------------------*/ +/* genRRC - rotate right with carry */ +/*-----------------------------------------------------------------*/ +static void genRRC (iCode * ic) { + printIc ("genRRC", ic, 1,1,0); +} + +/*-----------------------------------------------------------------*/ +/* genRLC - generate code for rotate left with carry */ +/*-----------------------------------------------------------------*/ +static void genRLC (iCode * ic) { + printIc ("genRLC", ic, 1,1,0); +} + +/*-----------------------------------------------------------------*/ +/* genGetHbit - generates code get highest order bit */ +/*-----------------------------------------------------------------*/ +static void genGetHbit (iCode * ic) { + printIc ("genGetHbit", ic, 1,1,0); +} + +/*-----------------------------------------------------------------*/ +/* genLeftShift - generates code for left shifting */ +/*-----------------------------------------------------------------*/ +static void genLeftShift (iCode * ic) { + printIc ("genLeftShift", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genRightShift - generate code for right shifting */ +/*-----------------------------------------------------------------*/ +static void genRightShift (iCode * ic) { + printIc ("genRightShift", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genPointerGet - generate code for pointer get */ +/*-----------------------------------------------------------------*/ +static void genPointerGet (iCode * ic, iCode *pi) { + printIc ("genPointerGet", ic, 1,1,0); +} + +/*-----------------------------------------------------------------*/ +/* genPointerSet - stores the value into a pointer location */ +/*-----------------------------------------------------------------*/ +static void genPointerSet (iCode * ic, iCode *pi) { + printIc ("genPointerSet", ic, 1,0,1); +} + +/*-----------------------------------------------------------------*/ +/* genIfx - generate code for Ifx statement */ +/*-----------------------------------------------------------------*/ +static void genIfx (iCode * ic, iCode * popIc) { + bool trueOrFalse; + symbol *jlbl, *tlbl; + operand *cond=IC_COND(ic); + + emitcode (";", "genIfx cond=%s trueLabel:%s falseLabel:%s", + printOp(cond), + IC_TRUE(ic) ? IC_TRUE(ic)->name : "NULL", + IC_FALSE(ic) ? IC_FALSE(ic)->name : "NULL"); + + aopOp(cond,FALSE); + + if (IC_TRUE(ic)) { + trueOrFalse=TRUE; + jlbl=IC_TRUE(ic); + } else { + trueOrFalse=FALSE; + jlbl=IC_FALSE(ic); + } + + switch (AOP_TYPE(cond) ) + { + case AOP_CRY: + emitcode (trueOrFalse ? "jb" : "jbc", "%s,%05d$", + AOP_NAME(cond)[0], jlbl->key+100); + return; + case AOP_REG: + case AOP_DIR: + case AOP_FAR: + tlbl=newiTempLabel(NULL); + emitcode ("cmp", "%s,#0", AOP_NAME(cond)[0]); + emitcode (trueOrFalse ? "bne" : "beq", "%05d$", tlbl->key+100); + if (*AOP_NAME(cond)[1]) { + emitcode ("cmp", "%s,#0", AOP_NAME(cond)[1]); + emitcode (trueOrFalse ? "bne" : "beq", "%05d$", tlbl->key+100); + } + emitcode ("jmp", "%05d$", jlbl->key+100); + emitcode ("", "%05d$:", tlbl->key+100); + return; + } +} + +/*-----------------------------------------------------------------*/ +/* genAddrOf - generates code for address of */ +/*-----------------------------------------------------------------*/ +static void genAddrOf (iCode * ic) { + printIc ("genAddrOf", ic, 1,1,0); +} + +/*-----------------------------------------------------------------*/ +/* genAssign - generate code for assignment */ +/*-----------------------------------------------------------------*/ +static void genAssign (iCode * ic) { + operand *result=IC_RESULT(ic), *right=IC_RIGHT(ic); + + printIc ("genAssign", ic, 1,0,1); + + if (!IS_SYMOP(result)) { + fprintf (stderr, "genAssign: result is not a symbol\n"); + exit (1); + } + + aopOp(right, FALSE); + aopOp(result, TRUE); + + if (result->aop->type==AOP_REG || + right->aop->type==AOP_REG || + right->aop->type==AOP_LIT || + right->aop->type==AOP_IMMD) { + // everything will do + } else { + // they have to match + if (result->aop->type != right->aop->type) { + fprintf (stderr, "genAssign: types don't match (%s!=%s)\n", + aopTypeName(result->aop), aopTypeName(right->aop)); + exit (1); + } + } + + /* if result is a bit */ + if (AOP_TYPE(result) == AOP_CRY) { + /* if right is literal, we know what the value is */ + if (AOP_TYPE(right) == AOP_LIT) { + if (operandLitValue(right)) { + emitcode ("setb", AOP_NAME(result)[0]); + } else { + emitcode ("clr", AOP_NAME(result)[0]); + } + return; + } + /* if right is also a bit */ + if (AOP_TYPE(right) == AOP_CRY) { + emitcode ("mov", "c,%s", AOP_NAME(right)); + emitcode ("mov", "%s,c", AOP_NAME(result)); + return; + } + /* we need to or */ + emitcode ("mov", "%s,%s", AOP_NAME(result), toBoolean(right)); + return; + } + + /* general case */ + emitcode ("mov", "%s,%s", + result->aop->name[0], right->aop->name[0]); + if (IS_GENPTR(operandType(result))) { + emitcode ("mov", "%s,%s", + result->aop->name[1], right->aop->name[1]); + } + +} + +/*-----------------------------------------------------------------*/ +/* genJumpTab - genrates code for jump table */ +/*-----------------------------------------------------------------*/ +static void genJumpTab (iCode * ic) { + printIc ("genJumpTab", ic, 0,0,0); +} + +/*-----------------------------------------------------------------*/ +/* genCast - gen code for casting */ +/*-----------------------------------------------------------------*/ +static void genCast (iCode * ic) { + printIc ("genCast", ic, 1,1,1); +} + +/*-----------------------------------------------------------------*/ +/* genDjnz - generate decrement & jump if not zero instrucion */ +/*-----------------------------------------------------------------*/ +static bool genDjnz (iCode * ic, iCode * ifx) { + printIc ("genDjnz", ic, 0,0,0); + return FALSE; +} + +/*-----------------------------------------------------------------*/ +/* genReceive - generate code for a receive iCode */ +/*-----------------------------------------------------------------*/ +static void genReceive (iCode * ic) { + printIc ("genReceive", ic, 1,0,0); +} + +/*-----------------------------------------------------------------*/ +/* gen51Code - generate code for 8051 based controllers */ +/*-----------------------------------------------------------------*/ +void genXA51Code (iCode * lic) { + iCode *ic; + int cln = 0; + + fprintf (stderr, "genXA51Code\n"); + lineHead = lineCurr = NULL; + + /* print the allocation information */ + if (allocInfo) + printAllocInfo (currFunc, codeOutFile); + + /* if debug information required */ + if (options.debug && currFunc) + { + cdbSymbol (currFunc, cdbFile, FALSE, TRUE); + _G.debugLine = 1; + if (IS_STATIC (currFunc->etype)) + emitcode ("", "F%s$%s$0$0 ==.", moduleName, currFunc->name); + else + emitcode ("", "G$%s$0$0 ==.", currFunc->name); + _G.debugLine = 0; + } + + for (ic = lic; ic; ic = ic->next) { + if (cln != ic->lineno) { + if (options.debug) { + _G.debugLine = 1; + emitcode ("", "C$%s$%d$%d$%d ==.", + FileBaseName (ic->filename), ic->lineno, + ic->level, ic->block); + _G.debugLine = 0; + } + emitcode (";", "%s %d", ic->filename, ic->lineno); + cln = ic->lineno; + } + /* if the result is marked as + spilt and rematerializable or code for + this has already been generated then + do nothing */ + if (resultRemat (ic) || ic->generated) + continue; + + /* depending on the operation */ + switch (ic->op) + { + case '!': + genNot (ic); + break; + + case '~': + genCpl (ic); + break; + + case UNARYMINUS: + genUminus (ic); + break; + + case IPUSH: + genIpush (ic); + break; + + case IPOP: + /* IPOP happens only when trying to restore a + spilt live range, if there is an ifx statement + following this pop then the if statement might + be using some of the registers being popped which + would destory the contents of the register so + we need to check for this condition and handle it */ + if (ic->next && + ic->next->op == IFX && + regsInCommon (IC_LEFT (ic), IC_COND (ic->next))) + genIfx (ic->next, ic); + else + genIpop (ic); + break; + + case CALL: + genCall (ic); + break; + + case PCALL: + genPcall (ic); + break; + + case FUNCTION: + genFunction (ic); + break; + + case ENDFUNCTION: + genEndFunction (ic); + break; + + case RETURN: + genRet (ic); + break; + + case LABEL: + genLabel (ic); + break; + + case GOTO: + genGoto (ic); + break; + + case '+': + genPlus (ic); + break; + + case '-': + if (!genDjnz (ic, ifxForOp (IC_RESULT (ic), ic))) + genMinus (ic); + break; + + case '*': + genMult (ic); + break; + + case '/': + genDiv (ic); + break; + + case '%': + genMod (ic); + break; + + case '>': + genCmpGt (ic, ifxForOp (IC_RESULT (ic), ic)); + break; + + case '<': + genCmpLt (ic, ifxForOp (IC_RESULT (ic), ic)); + break; + + case LE_OP: + case GE_OP: + case NE_OP: + + /* note these two are xlated by algebraic equivalence + during parsing SDCC.y */ + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "got '>=' or '<=' shouldn't have come here"); + break; + + case EQ_OP: + genCmpEq (ic, ifxForOp (IC_RESULT (ic), ic)); + break; + + case AND_OP: + genAndOp (ic); + break; + + case OR_OP: + genOrOp (ic); + break; + + case '^': + genXor (ic, ifxForOp (IC_RESULT (ic), ic)); + break; + + case '|': + genOr (ic, ifxForOp (IC_RESULT (ic), ic)); + break; + + case BITWISEAND: + genAnd (ic, ifxForOp (IC_RESULT (ic), ic)); + break; + + case INLINEASM: + genInline (ic); + break; + + case RRC: + genRRC (ic); + break; + + case RLC: + genRLC (ic); + break; + + case GETHBIT: + genGetHbit (ic); + break; + + case LEFT_OP: + genLeftShift (ic); + break; + + case RIGHT_OP: + genRightShift (ic); + break; + + case GET_VALUE_AT_ADDRESS: + genPointerGet (ic, hasInc(IC_LEFT(ic), ic, getSize(operandType(IC_LEFT(ic))))); + break; + + case '=': + if (POINTER_SET (ic)) + genPointerSet (ic, hasInc(IC_RESULT(ic), ic, getSize(operandType(IC_RIGHT(ic))))); + else + genAssign (ic); + break; + + case IFX: + genIfx (ic, NULL); + break; + + case ADDRESS_OF: + genAddrOf (ic); + break; + + case JUMPTABLE: + genJumpTab (ic); + break; + + case CAST: + genCast (ic); + break; + + case RECEIVE: + genReceive (ic); + break; + + case SEND: + addSet (&_G.sendSet, ic); + break; + + default: + ic = ic; + } + } + + + /* now we are ready to call the + peep hole optimizer */ + if (!options.nopeep) + peepHole (&lineHead); + + /* now do the actual printing */ + printLine (lineHead, codeOutFile); + return; +} diff --git a/src/xa51/gen.h b/src/xa51/gen.h new file mode 100755 index 00000000..bd451241 --- /dev/null +++ b/src/xa51/gen.h @@ -0,0 +1,65 @@ +/*------------------------------------------------------------------------- + SDCCgen51.h - header file for code generation for 8051 + + Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998) + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! +-------------------------------------------------------------------------*/ + +#ifndef SDCCGEN51_H +#define SDCCGEN51_H + +enum + { + AOP_LIT = 1, + AOP_REG, + AOP_DIR, + AOP_FAR, + AOP_CODE, + AOP_STK, + AOP_IMMD, + AOP_CRY + }; + +/* type asmop : a homogenised type for + all the different spaces an operand can be + in */ +typedef struct asmop { + + short type; + /* can have values + AOP_LIT - operand is a literal value + AOP_REG - is in registers + AOP_DIR - direct, just a name + AOP_FAR - + AOP_CODE - + AOP_STK - on stack (with offset) + AOP_IMMD - immediate value for eg. remateriazable + AOP_CRY - carry contains the value of this + */ + short size; /* size of this aop */ + char name[2][64]; /* can be "r0" "r6h" [rxbw+y] "#..." */ +} asmop; + +#define AOP(x) x->aop +#define AOP_TYPE(x) x->aop->type +#define AOP_SIZE(x) x->aop->size +#define AOP_NAME(x) x->aop->name + +#endif diff --git a/src/xa51/gen.o b/src/xa51/gen.o new file mode 100644 index 0000000000000000000000000000000000000000..2105af63e2deacf863814d17c4e0ce14ee4492e6 GIT binary patch literal 57164 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
WQ3xlK@bM_U8?c^t+;>$lR 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 literal 0 HcmV?d00001 diff --git a/src/xa51/main.c b/src/xa51/main.c new file mode 100755 index 00000000..9021f599 --- /dev/null +++ b/src/xa51/main.c @@ -0,0 +1,285 @@ +/** @file main.c + xa51 specific general functions. + + Note that mlh prepended _xa51_ on the static functions. Makes + it easier to set a breakpoint using the debugger. +*/ +#include "common.h" +#include "main.h" +#include "ralloc.h" +#include "gen.h" + +static char _defaultRules[] = +{ +#include "peeph.rul" +}; + +/* list of key words used by xa51 */ +static char *_xa51_keywords[] = +{ + "at", + "bit", + "code", + "critical", + "data", + "far", + //"idata", + "interrupt", + "near", + //"pdata", + "reentrant", + "sfr", + "sbit", + "using", + //"xdata", + //"_data", + //"_code", + //"_generic", + //"_near", + //"_xdata", + //"_pdata", + //"_idata", + "_naked", + "_overlay", + NULL +}; + + +void xa51_assignRegisters (eBBlock ** ebbs, int count); + +static int regParmFlg = 0; /* determine if we can register a parameter */ + +static void +_xa51_init (void) +{ + asm_addTree (&asm_asxxxx_mapping); +} + +static void +_xa51_reset_regparm () +{ + regParmFlg = 0; +} + +static int +_xa51_regparm (sym_link * l) +{ + return 0; // for now + /* for this processor it is simple + can pass only the first parameter in a register */ + if (regParmFlg) + return 0; + + regParmFlg = 1; + return 1; +} + +static bool +_xa51_parseOptions (int *pargc, char **argv, int *i) +{ + /* TODO: allow port-specific command line options to specify + * segment names here. + */ + return FALSE; +} + +static void +_xa51_finaliseOptions (void) +{ + port->mem.default_local_map = istack; + port->mem.default_globl_map = xdata; +} + +static void +_xa51_setDefaultOptions (void) +{ + options.stackAuto=1; +} + +static const char * +_xa51_getRegName (struct regs *reg) +{ + if (reg) + return reg->name; + return "err"; +} + +static void +_xa51_genAssemblerPreamble (FILE * of) +{ +} + +/* Generate interrupt vector table. */ +static int +_xa51_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts) +{ + return FALSE; +} + +/* Generate code to copy XINIT to XISEG */ +static void _xa51_genXINIT (FILE * of) { + fprintf (of, "; _xa51_genXINIT() start\n"); + fprintf (of, " mov a,#l_XINIT\n"); + fprintf (of, " orl a,#l_XINIT>>8\n"); + fprintf (of, " jz 00003$\n"); + fprintf (of, " mov a,#s_XINIT\n"); + fprintf (of, " add a,#l_XINIT\n"); + fprintf (of, " mov r1,a\n"); + fprintf (of, " mov a,#s_XINIT>>8\n"); + fprintf (of, " addc a,#l_XINIT>>8\n"); + fprintf (of, " mov r2,a\n"); + fprintf (of, " mov dptr,#s_XINIT\n"); + fprintf (of, " mov r0,#s_XISEG\n"); + fprintf (of, " mov p2,#(s_XISEG >> 8)\n"); + fprintf (of, "00001$: clr a\n"); + fprintf (of, " movc a,@a+dptr\n"); + fprintf (of, " movx @r0,a\n"); + fprintf (of, " inc dptr\n"); + fprintf (of, " inc r0\n"); + fprintf (of, " cjne r0,#0,00002$\n"); + fprintf (of, " inc p2\n"); + fprintf (of, "00002$: mov a,dpl\n"); + fprintf (of, " cjne a,ar1,00001$\n"); + fprintf (of, " mov a,dph\n"); + fprintf (of, " cjne a,ar2,00001$\n"); + fprintf (of, " mov p2,#0xFF\n"); + fprintf (of, "00003$:\n"); + fprintf (of, "; _xa51_genXINIT() end\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 xa51 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; + } + + /* for others it is cheaper to do the cse */ + return 1; +} + +/** $1 is always the basename. + $2 is always the output file. + $3 varies + $l is the list of extra options that should be there somewhere... + MUST be terminated with a NULL. +*/ +static const char *_linkCmd[] = +{ + "{bindir}{sep}aslink", "-nf", "$1", NULL +}; + +/* $3 is replaced by assembler.debug_opts resp. port->assembler.plain_opts */ +static const char *_asmCmd[] = +{ + "xa_asm", "$l", "$3", "$1.asm", NULL +}; + +/* Globals */ +PORT xa51_port = +{ + TARGET_ID_XA51, + "xa51", + "MCU 80C51XA", /* Target name */ + { + TRUE, /* Emit glue around main */ + MODEL_LARGE, + MODEL_LARGE + }, + { + _asmCmd, + NULL, + "-plosgffc", /* Options with debug */ + "-plosgff", /* Options without debug */ + 0, + ".asm", + NULL /* no do_assemble function */ + }, + { + _linkCmd, + NULL, + NULL, + ".rel" + }, + { + _defaultRules + }, + { + /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */ + 1, 2, 2, 4, 1, 2, 3, 1, 4, 4 + }, + { + "XSEG (XDATA)", + "STACK (DATA)", + "CSEG (CODE)", + "DSEG (DATA)", + "ISEG (DATA)", + "XSEG (XDATA)", + "BSEG (BIT)", + "RSEG (DATA)", + "GSINIT (CODE)", + "OSEG (OVR,DATA)", + "GSFINAL (CODE)", + "HOME (CODE)", + "XISEG (XDATA)", // initialized xdata + "XINIT (CODE)", // a code copy of xiseg + NULL, // default local map + NULL, // default global map + 1 + }, + { + -1, // stack grows down + 0, // bank overhead NUY + 6, // isr overhead + 4, // function call overhead + 0, // reentrant overhead NUY + 0 // banked overhead NUY + }, + /* xa51 has an 16 bit mul */ + { + 2, -2 + }, + "_", + _xa51_init, + _xa51_parseOptions, + _xa51_finaliseOptions, + _xa51_setDefaultOptions, + xa51_assignRegisters, + _xa51_getRegName, + _xa51_keywords, + _xa51_genAssemblerPreamble, + NULL, /* no genAssemblerEnd */ + _xa51_genIVT, + _xa51_genXINIT, + _xa51_reset_regparm, + _xa51_regparm, + NULL, + NULL, + NULL, + FALSE, + 0, /* leave lt */ + 0, /* leave gt */ + 1, /* transform <= to ! > */ + 1, /* transform >= to ! < */ + 1, /* transform != to !(a == b) */ + 0, /* leave == */ + FALSE, /* No array initializer support. */ + cseCostEstimation, + NULL, /* no builtin functions */ + GPOINTER, /* treat unqualified pointers as "generic" pointers */ + 1, /* reset labelKey to 1 */ + 1, /* globals & local static allowed */ + PORT_MAGIC +}; diff --git a/src/xa51/main.h b/src/xa51/main.h new file mode 100644 index 00000000..65552254 --- /dev/null +++ b/src/xa51/main.h @@ -0,0 +1,8 @@ +#ifndef MAIN_INCLUDE +#define MAIN_INCLUDE + +bool x_parseOptions (char **argv, int *pargc); +void x_setDefaultOptions (void); +void x_finaliseOptions (void); + +#endif diff --git a/src/xa51/main.o b/src/xa51/main.o new file mode 100644 index 0000000000000000000000000000000000000000..305d8cdf630d2c1184a1bb6ec616e1bcdf9f10fa GIT binary patch literal 29150 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 literal 0 HcmV?d00001 diff --git a/src/xa51/peeph.def b/src/xa51/peeph.def new file mode 100644 index 00000000..e69de29b diff --git a/src/xa51/peeph.rul b/src/xa51/peeph.rul new file mode 100644 index 00000000..7e86f108 --- /dev/null +++ b/src/xa51/peeph.rul @@ -0,0 +1,3 @@ +/* Generated file, DO NOT Edit! */ +/* To Make changes to rules edit */ +/* /peeph.def instead. */ diff --git a/src/xa51/port.a b/src/xa51/port.a new file mode 100644 index 0000000000000000000000000000000000000000..5d6cc01b132418df8c2cddeedc62e5b267109bab GIT binary patch literal 150245 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, + xa51_regWithMask(regMask)->sym->name); + + exit(1); + return; + } +} + +char *regTypeToStr(short type) { + switch (type) + { + case REG_PTR: return "ptr"; break; // pointer + case REG_GPR: return "gpr"; break; // general purpose + case REG_CND: return "cnd"; break; // condition (bit) + case REG_STK: return "stk"; break; // stack + case REG_SCR: return "scr"; break; // scratch + default: return "???"; break; + } +} + +/*-----------------------------------------------------------------*/ +/* freeReg - frees a previous allocated register */ +/*-----------------------------------------------------------------*/ +static void freeReg (regs * reg, bool silent) { + + checkRegMask(__FUNCTION__); + + if (!reg) { + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "freeReg - freeing NULL register"); + return; + } + + if (!silent) { + fprintf (stderr, "freeReg: (%08x) %s ", xa51RegsInUse, reg->name); + } + + if (reg->isFree || ((xa51RegsInUse®->regMask)!=reg->regMask)) { + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "freeReg - freeing unused register(s)"); + return; + } + xa51RegsInUse &= ~reg->regMask; + reg->isFree = 1; + reg->sym = NULL; + if (!silent) fprintf (stderr, "(%08x)\n", xa51RegsInUse); + + checkRegMask(__FUNCTION__); +} + +/*-----------------------------------------------------------------*/ +/* allocReg - allocates register of given size (byte, word) */ +/* and type (ptr, gpr, cnd) */ +/*-----------------------------------------------------------------*/ +static bool allocReg (short size, short type, symbol *sym, + short offset, bool silent) { + int i; + + checkRegMask(__FUNCTION__); + + if (!silent) { + fprintf (stderr, "allocReg (0x%08x) for %s size:%d, type:%s ", + xa51RegsInUse, + sym->name, + size, regTypeToStr(type)); + } + + switch (size) + { + // TODO: gaps should be filled for dwords too + case 1: + // let's see if we can fill a gap + for (i=0; iregs[offset]=reg; + xa51RegsInUse |= mask; + reg->isFree=0; // redundant + reg->sym = sym; + if (!silent) { + fprintf (stderr, "(using gap) %s\n", reg->name); + } + checkRegMask(__FUNCTION__); + return TRUE; + } + } + } + // no we can't, fall through + case 2: + for (i=0; iregs[offset]=®sXA51[i]; + checkRegMask(__FUNCTION__); + return TRUE; + } + } + if (!silent) { + fprintf (stderr, "failed (%08x)\n", xa51RegsInUse); + } + checkRegMask(__FUNCTION__); + return FALSE; + break; + case 3: + // this must be a generic pointer + if (!silent) { + fprintf (stderr, "trying 2+1\n"); + } + // get the pointer part + if (allocReg (2, REG_PTR, sym, offset, silent)) { + // get the generic part + if ((xa51HasGprRegs && allocReg (1, REG_GPR, sym, offset+1, silent)) || + allocReg (1, REG_PTR, sym, offset+1, silent)) { + checkRegMask(__FUNCTION__); + return TRUE; + } + freeReg(sym->regs[offset], silent); + sym->regs[offset]=NULL; + } + checkRegMask(__FUNCTION__); + return FALSE; + break; + case 4: // this is a dword + if (!silent) { + fprintf (stderr, "trying 2+2\n"); + } + if ((xa51HasGprRegs && allocReg (2, REG_GPR, sym, offset, silent)) || + allocReg (2, REG_PTR, sym, offset, silent)) { + if ((xa51HasGprRegs && allocReg (2, REG_GPR, sym, offset+1, silent)) || + allocReg (2, REG_PTR, sym, offset+1, silent)) { + checkRegMask(__FUNCTION__); + return TRUE; + } + } + freeReg(sym->regs[offset], FALSE); + sym->regs[offset]=NULL; + checkRegMask(__FUNCTION__); + return FALSE; + break; + default: + fprintf (stderr, "\nallocReg: cannot allocate reg of size %d\n", size); + exit (1); + break; + } + // we should never come here + return FALSE; +} + +/*-------------------------------------------------------------------*/ +/* freeAllRegs - frees all registers */ +/*-------------------------------------------------------------------*/ +// just to be sure, this should not be needed +static void freeAllRegs (void) { + char regsFreed[132]; + int i; + int nfr = 0; + + checkRegMask(__FUNCTION__); + + regsFreed[0]=0; + for (i=0; isize; i++) + { + iCode *ic; + + if (bitVectBitValue (defs, i) && + (ic = hTabItemWithKey (iCodehTab, i)) && + (ic->seq >= fseq && ic->seq <= toseq)) + return FALSE; + } + return TRUE; +} + +/*-----------------------------------------------------------------*/ +/* computeSpillable - given a point find the spillable live ranges */ +/*-----------------------------------------------------------------*/ +static bitVect *computeSpillable (iCode * ic) { + bitVect *spillable; + + /* spillable live ranges are those that are live at this + point . the following categories need to be subtracted + from this set. + a) - those that are already spilt + b) - if being used by this one + c) - defined by this one */ + + spillable = bitVectCopy (ic->rlive); + spillable = + bitVectCplAnd (spillable, _G.spiltSet); /* those already spilt */ + spillable = + bitVectCplAnd (spillable, ic->uses); /* used in this one */ + bitVectUnSetBit (spillable, ic->defKey); /* defined by this one */ + spillable = bitVectIntersect (spillable, _G.regAssigned); + return spillable; + +} + +/*-----------------------------------------------------------------*/ +/* noSpilLoc - return true if a variable has no spil location */ +/*-----------------------------------------------------------------*/ +static int +noSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic) +{ + return (sym->usl.spillLoc ? 0 : 1); +} + +/*-----------------------------------------------------------------*/ +/* hasSpilLoc - will return 1 if the symbol has spil location */ +/*-----------------------------------------------------------------*/ +static int +hasSpilLoc (symbol * sym, eBBlock * ebp, iCode * ic) +{ + return (sym->usl.spillLoc ? 1 : 0); +} + +/*-----------------------------------------------------------------*/ +/* hasSpilLocnoUptr - will return 1 if the symbol has spil location */ +/* but is not used as a pointer */ +/*-----------------------------------------------------------------*/ +static int +hasSpilLocnoUptr (symbol * sym, eBBlock * ebp, iCode * ic) +{ + return ((sym->usl.spillLoc && !sym->uptr) ? 1 : 0); +} + +/*-----------------------------------------------------------------*/ +/* rematable - will return 1 if the remat flag is set */ +/*-----------------------------------------------------------------*/ +static int +rematable (symbol * sym, eBBlock * ebp, iCode * ic) +{ + return sym->remat; +} + +/*-----------------------------------------------------------------*/ +/* notUsedInBlock - not used in this block */ +/*-----------------------------------------------------------------*/ +static int +notUsedInBlock (symbol * sym, eBBlock * ebp, iCode * ic) +{ + return (!bitVectBitsInCommon (sym->defs, ebp->usesDefs) && + allDefsOutOfRange (sym->defs, ebp->fSeq, ebp->lSeq)); +/* return (!bitVectBitsInCommon(sym->defs,ebp->usesDefs)); */ +} + +/*-----------------------------------------------------------------*/ +/* notUsedInRemaining - not used or defined in remain of the block */ +/*-----------------------------------------------------------------*/ +static int +notUsedInRemaining (symbol * sym, eBBlock * ebp, iCode * ic) +{ + return ((usedInRemaining (operandFromSymbol (sym), ic) ? 0 : 1) && + allDefsOutOfRange (sym->defs, ebp->fSeq, ebp->lSeq)); +} + +/*-----------------------------------------------------------------*/ +/* allLRs - return true for all */ +/*-----------------------------------------------------------------*/ +static int +allLRs (symbol * sym, eBBlock * ebp, iCode * ic) +{ + return 1; +} + +/*-----------------------------------------------------------------*/ +/* liveRangesWith - applies function to a given set of live range */ +/*-----------------------------------------------------------------*/ +static set * +liveRangesWith (bitVect * lrs, int (func) (symbol *, eBBlock *, iCode *), + eBBlock * ebp, iCode * ic) +{ + set *rset = NULL; + int i; + + if (!lrs || !lrs->size) + return NULL; + + for (i = 1; i < lrs->size; i++) + { + symbol *sym; + if (!bitVectBitValue (lrs, i)) + continue; + + /* if we don't find it in the live range + hash table we are in serious trouble */ + if (!(sym = hTabItemWithKey (liveRanges, i))) + { + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "liveRangesWith could not find liveRange"); + exit (1); + } + + if (func (sym, ebp, ic) && bitVectBitValue (_G.regAssigned, sym->key)) + addSetHead (&rset, sym); + } + + return rset; +} + + +/*-----------------------------------------------------------------*/ +/* leastUsedLR - given a set determines which is the least used */ +/*-----------------------------------------------------------------*/ +static symbol * +leastUsedLR (set * sset) +{ + symbol *sym = NULL, *lsym = NULL; + + sym = lsym = setFirstItem (sset); + + if (!lsym) + return NULL; + + for (; lsym; lsym = setNextItem (sset)) + { + + /* if usage is the same then prefer + the spill the smaller of the two */ + if (lsym->used == sym->used) + if (getSize (lsym->type) < getSize (sym->type)) + sym = lsym; + + /* if less usage */ + if (lsym->used < sym->used) + sym = lsym; + + } + + setToNull ((void **) &sset); + sym->blockSpil = 0; + return sym; +} + +/*-----------------------------------------------------------------*/ +/* noOverLap - will iterate through the list looking for over lap */ +/*-----------------------------------------------------------------*/ +static int +noOverLap (set * itmpStack, symbol * fsym) +{ + symbol *sym; + + + for (sym = setFirstItem (itmpStack); sym; + sym = setNextItem (itmpStack)) + { + if (bitVectBitValue(sym->clashes,fsym->key)) return 0; + } + + return 1; +} + +/*-----------------------------------------------------------------*/ +/* isFree - will return 1 if the a free spil location is found */ +/*-----------------------------------------------------------------*/ +static +DEFSETFUNC (isFree) +{ + symbol *sym = item; + V_ARG (symbol **, sloc); + V_ARG (symbol *, fsym); + + /* if already found */ + if (*sloc) + return 0; + + /* if it is free && and the itmp assigned to + this does not have any overlapping live ranges + with the one currently being assigned and + the size can be accomodated */ + if (sym->isFree && + noOverLap (sym->usl.itmpStack, fsym) && + getSize (sym->type) >= getSize (fsym->type)) + { + *sloc = sym; + return 1; + } + + return 0; +} + +/*-----------------------------------------------------------------*/ +/* createStackSpil - create a location on the stack to spil */ +/*-----------------------------------------------------------------*/ +static symbol * +createStackSpil (symbol * sym) +{ + symbol *sloc = NULL; + int useXstack, model; + + char slocBuffer[30]; + + fprintf (stderr, " createStackSpil: %s\n", sym->name); + + /* first go try and find a free one that is already + existing on the stack */ + if (applyToSet (_G.stackSpil, isFree, &sloc, sym)) + { + /* found a free one : just update & return */ + sym->usl.spillLoc = sloc; + sym->stackSpil = 1; + sloc->isFree = 0; + addSetHead (&sloc->usl.itmpStack, sym); + return sym; + } + + /* could not then have to create one , this is the hard part + we need to allocate this on the stack : this is really a + hack!! but cannot think of anything better at this time */ + + if (sprintf (slocBuffer, "sloc%d", _G.slocNum++) >= sizeof (slocBuffer)) + { + fprintf (stderr, "***Internal error: slocBuffer overflowed: %s:%d\n", + __FILE__, __LINE__); + exit (1); + } + + sloc = newiTemp (slocBuffer); + + /* set the type to the spilling symbol */ + sloc->type = copyLinkChain (sym->type); + sloc->etype = getSpec (sloc->type); + SPEC_SCLS (sloc->etype) = S_STACK; + SPEC_EXTR (sloc->etype) = 0; + SPEC_STAT (sloc->etype) = 0; + SPEC_VOLATILE(sloc->etype) = 0; + SPEC_ABSA(sloc->etype) = 0; + + /* we don't allow it to be allocated` + onto the external stack since : so we + temporarily turn it off ; we also + turn off memory model to prevent + the spil from going to the external storage + */ + + useXstack = options.useXstack; + model = options.model; +/* noOverlay = options.noOverlay; */ +/* options.noOverlay = 1; */ + options.model = options.useXstack = 0; + + allocLocal (sloc); + + options.useXstack = useXstack; + options.model = model; +/* options.noOverlay = noOverlay; */ + sloc->isref = 1; /* to prevent compiler warning */ + + /* if it is on the stack then update the stack */ + if (IN_STACK (sloc->etype)) + { + currFunc->stack += getSize (sloc->type); + _G.stackExtend += getSize (sloc->type); + } + else + _G.dataExtend += getSize (sloc->type); + + /* add it to the _G.stackSpil set */ + addSetHead (&_G.stackSpil, sloc); + sym->usl.spillLoc = sloc; + sym->stackSpil = 1; + + /* add it to the set of itempStack set + of the spill location */ + addSetHead (&sloc->usl.itmpStack, sym); + return sym; +} + +/*-----------------------------------------------------------------*/ +/* spillThis - spils a specific operand */ +/*-----------------------------------------------------------------*/ +static void +spillThis (symbol * sym) +{ + int i; + + fprintf (stderr, " spillThis: %s\n", sym->name); + + /* if this is rematerializable or has a spillLocation + we are okay, else we need to create a spillLocation + for it */ + if (!(sym->remat || sym->usl.spillLoc)) + createStackSpil (sym); + + + /* mark it has spilt & put it in the spilt set */ + sym->isspilt = sym->spillA = 1; + _G.spiltSet = bitVectSetBit (_G.spiltSet, sym->key); + + bitVectUnSetBit (_G.regAssigned, sym->key); + bitVectUnSetBit (_G.totRegAssigned, sym->key); + + for (i = 0; i < sym->nRegs; i++) + + if (sym->regs[i]) + { + freeReg (sym->regs[i], FALSE); + } + + if (sym->usl.spillLoc && !sym->remat) + sym->usl.spillLoc->allocreq++; + return; +} + +/*-----------------------------------------------------------------*/ +/* selectSpil - select a iTemp to spil : rather a simple procedure */ +/*-----------------------------------------------------------------*/ +static symbol * +selectSpil (iCode * ic, eBBlock * ebp, symbol * forSym) +{ + bitVect *lrcs = NULL; + set *selectS; + symbol *sym; + + /* get the spillable live ranges */ + lrcs = computeSpillable (ic); + + /* get all live ranges that are rematerizable */ + if ((selectS = liveRangesWith (lrcs, rematable, ebp, ic))) + { + /* return the least used of these */ + return leastUsedLR (selectS); + } + + /* if the symbol is local to the block then */ + if (forSym->liveTo < ebp->lSeq) + { + + /* check if there are any live ranges allocated + to registers that are not used in this block */ + if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInBlock, ebp, ic))) + { + sym = leastUsedLR (selectS); + /* if this is not rematerializable */ + if (!sym->remat) + { + _G.blockSpil++; + sym->blockSpil = 1; + } + return sym; + } + + /* check if there are any live ranges that not + used in the remainder of the block */ + if (!_G.blockSpil && (selectS = liveRangesWith (lrcs, notUsedInRemaining, ebp, ic))) + { + sym = leastUsedLR (selectS); + if (sym != forSym) + { + if (!sym->remat) + { + sym->remainSpil = 1; + _G.blockSpil++; + } + return sym; + } + } + } + + /* find live ranges with spillocation && not used as pointers */ + if ((selectS = liveRangesWith (lrcs, hasSpilLocnoUptr, ebp, ic))) + { + + sym = leastUsedLR (selectS); + /* mark this as allocation required */ + sym->usl.spillLoc->allocreq++; + return sym; + } + + /* find live ranges with spillocation */ + if ((selectS = liveRangesWith (lrcs, hasSpilLoc, ebp, ic))) + { + + sym = leastUsedLR (selectS); + sym->usl.spillLoc->allocreq++; + return sym; + } + + /* couldn't find then we need to create a spil + location on the stack , for which one? the least + used ofcourse */ + if ((selectS = liveRangesWith (lrcs, noSpilLoc, ebp, ic))) + { + + /* return a created spil location */ + sym = createStackSpil (leastUsedLR (selectS)); + sym->usl.spillLoc->allocreq++; + return sym; + } + + /* this is an extreme situation we will spill + this one : happens very rarely but it does happen */ + spillThis (forSym); + return forSym; +} + +/*-----------------------------------------------------------------*/ +/* spillSomething - spil some variable & mark registers as free */ +/*-----------------------------------------------------------------*/ +static bool +spillSomething (iCode * ic, eBBlock * ebp, symbol * forSym) +{ + symbol *ssym; + int i; + + /* get something we can spil */ + ssym = selectSpil (ic, ebp, forSym); + + fprintf (stderr, " spillSomething: spilling %s\n", ssym->name); + + /* mark it as spilt */ + ssym->isspilt = ssym->spillA = 1; + _G.spiltSet = bitVectSetBit (_G.spiltSet, ssym->key); + + /* mark it as not register assigned & + take it away from the set */ + bitVectUnSetBit (_G.regAssigned, ssym->key); + bitVectUnSetBit (_G.totRegAssigned, ssym->key); + + /* mark the registers as free */ + for (i = 0; i < ssym->nRegs; i++) { + if (ssym->regs[i]) { + freeReg (ssym->regs[i], FALSE); + // dont NULL ssym->regs[i], it might be used later + } + } + + /* if this was a block level spil then insert push & pop + at the start & end of block respectively */ + if (ssym->blockSpil) + { + iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL); + /* add push to the start of the block */ + addiCodeToeBBlock (ebp, nic, (ebp->sch->op == LABEL ? + ebp->sch->next : ebp->sch)); + nic = newiCode (IPOP, operandFromSymbol (ssym), NULL); + /* add pop to the end of the block */ + addiCodeToeBBlock (ebp, nic, NULL); + } + + /* if spilt because not used in the remainder of the + block then add a push before this instruction and + a pop at the end of the block */ + if (ssym->remainSpil) + { + + iCode *nic = newiCode (IPUSH, operandFromSymbol (ssym), NULL); + /* add push just before this instruction */ + addiCodeToeBBlock (ebp, nic, ic); + + nic = newiCode (IPOP, operandFromSymbol (ssym), NULL); + /* add pop to the end of the block */ + addiCodeToeBBlock (ebp, nic, NULL); + } + + if (ssym == forSym) + return FALSE; + else + return TRUE; +} + +/*-----------------------------------------------------------------*/ +/* getRegPtr - will try for PTR if not a GPR type if not spil */ +/*-----------------------------------------------------------------*/ +static bool getRegPtr (iCode * ic, eBBlock * ebp, symbol * sym, short offset) { + + fprintf (stderr, "getRegPtr: %s ", sym->name); + printTypeChain(sym->type, stderr); + fprintf (stderr, "\n"); + +tryAgain: + /* try for a ptr type */ + if (allocReg (getSize(sym->type), REG_PTR, sym, offset, FALSE)) + return TRUE; + + /* try for gpr type */ + if (xa51HasGprRegs && allocReg (getSize(sym->type), + REG_GPR, sym, offset, FALSE)) + return TRUE; + + /* we have to spil */ + if (!spillSomething (ic, ebp, sym)) + return FALSE; + + /* this looks like an infinite loop but + in really selectSpil will abort */ + goto tryAgain; +} + +/*-----------------------------------------------------------------*/ +/* getRegGpr - will try for GPR if not spil */ +/*-----------------------------------------------------------------*/ +static bool getRegGpr (iCode * ic, eBBlock * ebp, symbol * sym, short offset) { + + fprintf (stderr, "getRegGpr: %s ", sym->name); + printTypeChain(sym->type, stderr); + fprintf (stderr, "\n"); + +tryAgain: + /* try for gpr type */ + if (xa51HasGprRegs && allocReg (getSize(sym->type), + REG_GPR, sym, offset, FALSE)) + return TRUE; + + if (allocReg (getSize(sym->type), REG_PTR, sym, offset, FALSE)) + return TRUE; + + /* we have to spil */ + if (!spillSomething (ic, ebp, sym)) + return FALSE; + + /* this looks like an infinite loop but + in really selectSpil will abort */ + goto tryAgain; +} + +/*-----------------------------------------------------------------*/ +/* deassignLRs - check the live to and if they have registers & are */ +/* not spilt then free up the registers */ +/*-----------------------------------------------------------------*/ +static void +deassignLRs (iCode * ic, eBBlock * ebp) +{ + symbol *sym; + int k; + + for (sym = hTabFirstItem (liveRanges, &k); sym; + sym = hTabNextItem (liveRanges, &k)) + { + /* if it does not end here */ + if (sym->liveTo > ic->seq) + continue; + + /* if it was spilt on stack then we can + mark the stack spil location as free */ + if (sym->isspilt) + { + if (sym->stackSpil) + { + sym->usl.spillLoc->isFree = 1; + sym->stackSpil = 0; + } + continue; + } + + if (!bitVectBitValue (_G.regAssigned, sym->key)) + continue; + + if (sym->nRegs) { + int i; + + bitVectUnSetBit (_G.regAssigned, sym->key); + + /* free the regs */ + for (i=0; i < sym->nRegs; i++) { + freeReg (sym->regs[i], FALSE); + } + } + } +} + +/*-----------------------------------------------------------------*/ +/* willCauseSpill - determines if allocating will cause a spill */ +/*-----------------------------------------------------------------*/ +static bool willCauseSpill (symbol *sym) { + int i; + // do it the rude way + if (allocReg (getSize(sym->type), sym->regType, sym, 0, TRUE) || + allocReg (getSize(sym->type), sym->regType==REG_PTR?REG_GPR:REG_PTR, + sym, 0, TRUE)) { + // so we can, but we won't + for (i=0; inRegs; i++) { + freeReg (sym->regs[i], TRUE); + sym->regs[i]=NULL; + } + return FALSE; + } + fprintf (stderr, " %s will cause a spill\n", sym->name); + return TRUE; +} + +/*-----------------------------------------------------------------*/ +/* positionRegs - the allocator can allocate same registers to res- */ +/* ult and operand, if this happens make sure they are in the same */ +/* position as the operand otherwise chaos results */ +/*-----------------------------------------------------------------*/ +static int +positionRegs (symbol * result, symbol * opsym) +{ + int count = min (result->nRegs, opsym->nRegs); + int i, j = 0, shared = 0; + int change = 0; + + /* if the result has been spilt then cannot share */ + if (opsym->isspilt) + return 0; +again: + shared = 0; + /* first make sure that they actually share */ + for (i = 0; i < count; i++) + { + for (j = 0; j < count; j++) + { + if (result->regs[i] == opsym->regs[j] && i != j) + { + shared = 1; + goto xchgPositions; + } + } + } +xchgPositions: + if (shared) + { + regs *tmp = result->regs[i]; + result->regs[i] = result->regs[j]; + result->regs[j] = tmp; + change ++; + goto again; + } + return change; +} + +/*-----------------------------------------------------------------*/ +/* serialRegAssign - serially allocate registers to the variables */ +/*-----------------------------------------------------------------*/ +static void +serialRegAssign (eBBlock ** ebbs, int count) +{ + int i; + + /* for all blocks */ + for (i = 0; i < count; i++) { + + iCode *ic; + + if (ebbs[i]->noPath && + (ebbs[i]->entryLabel != entryLabel && + ebbs[i]->entryLabel != returnLabel)) + continue; + + /* of all instructions do */ + for (ic = ebbs[i]->sch; ic; ic = ic->next) { + + /* if result is present && is a true symbol */ + if (IC_RESULT (ic) && ic->op != IFX && + IS_TRUE_SYMOP (IC_RESULT (ic))) + OP_SYMBOL (IC_RESULT (ic))->allocreq++; + + /* take away registers from live + ranges that end at this instruction */ + deassignLRs (ic, ebbs[i]); + + /* some don't need registers */ + if (SKIP_IC2 (ic) || + ic->op == JUMPTABLE || + ic->op == IFX || + ic->op == IPUSH || + ic->op == IPOP || + (IC_RESULT (ic) && POINTER_SET (ic))) + continue; + + /* now we need to allocate registers + only for the result */ + if (IC_RESULT (ic)) { + symbol *sym = OP_SYMBOL (IC_RESULT (ic)); + bitVect *spillable; + int willCS; + + /* if it does not need or is spilt + or is already assigned to registers + or will not live beyond this instructions */ + if (!sym->nRegs || + sym->isspilt || + bitVectBitValue (_G.regAssigned, sym->key) || + sym->liveTo <= ic->seq) + continue; + + /* if some liverange has been spilt at the block level + and this one live beyond this block then spil this + to be safe */ + if (_G.blockSpil && sym->liveTo > ebbs[i]->lSeq) { + spillThis (sym); + continue; + } + /* if trying to allocate this will cause + a spill and there is nothing to spill + or this one is rematerializable then + spill this one */ + willCS = willCauseSpill (sym); + spillable = computeSpillable (ic); + if (sym->remat || (willCS && bitVectIsZero (spillable))) { + spillThis (sym); + continue; + } + + /* if it has a spillocation & is used less than + all other live ranges then spill this */ + if (willCS) { + if (sym->usl.spillLoc) { + symbol *leastUsed = leastUsedLR (liveRangesWith (spillable, + allLRs, ebbs[i], ic)); + if (leastUsed && leastUsed->used > sym->used) { + spillThis (sym); + continue; + } + } else { + /* if none of the liveRanges have a spillLocation then better + to spill this one than anything else already assigned to registers */ + if (liveRangesWith(spillable,noSpilLoc,ebbs[i],ic)) { + /* if this is local to this block then we might find a block spil */ + if (!(sym->liveFrom >= ebbs[i]->fSeq && sym->liveTo <= ebbs[i]->lSeq)) { + spillThis (sym); + continue; + } + } + } + } + + /* else we assign registers to it */ + _G.regAssigned = bitVectSetBit (_G.regAssigned, sym->key); + _G.totRegAssigned = bitVectSetBit (_G.totRegAssigned, sym->key); + + if (sym->regType == REG_PTR) + getRegPtr (ic, ebbs[i], sym, 0); + else + getRegGpr (ic, ebbs[i], sym, 0); + + /* if it shares registers with operands make sure + that they are in the same position */ + if (IC_LEFT (ic) && IS_SYMOP (IC_LEFT (ic)) && + OP_SYMBOL (IC_LEFT (ic))->nRegs && ic->op != '=') { + positionRegs (OP_SYMBOL (IC_RESULT (ic)), + OP_SYMBOL (IC_LEFT (ic))); + } + /* do the same for the right operand */ + if (IC_RIGHT (ic) && IS_SYMOP (IC_RIGHT (ic)) && + OP_SYMBOL (IC_RIGHT (ic))->nRegs) { + positionRegs (OP_SYMBOL (IC_RESULT (ic)), + OP_SYMBOL (IC_RIGHT (ic))); + } + } + } + } +} + +/*-----------------------------------------------------------------*/ +/* rUmaskForOp :- returns register mask for an operand */ +/*-----------------------------------------------------------------*/ +bitVect *xa51_rUmaskForOp (operand * op) { + bitVect *rumask; + symbol *sym; + int j; + + /* only temporaries are assigned registers */ + if (!IS_ITEMP (op)) + return NULL; + + sym = OP_SYMBOL (op); + + /* if spilt or no registers assigned to it + then nothing */ + if (sym->isspilt || !sym->nRegs || !sym->regs[0]) + return NULL; + + rumask = newBitVect (xa51_nRegs); + + for (j = 0; j < sym->nRegs; j++) { + rumask = bitVectSetBit (rumask, + sym->regs[j]->rIdx); + } + return rumask; +} + +/*-----------------------------------------------------------------*/ +/* regsUsedIniCode :- returns bit vector of registers used in iCode */ +/*-----------------------------------------------------------------*/ +static bitVect * +regsUsedIniCode (iCode * ic) +{ + bitVect *rmask = newBitVect (xa51_nRegs); + + /* do the special cases first */ + if (ic->op == IFX) + { + rmask = bitVectUnion (rmask, + xa51_rUmaskForOp (IC_COND (ic))); + goto ret; + } + + /* for the jumptable */ + if (ic->op == JUMPTABLE) + { + rmask = bitVectUnion (rmask, + xa51_rUmaskForOp (IC_JTCOND (ic))); + + goto ret; + } + + /* of all other cases */ + if (IC_LEFT (ic)) + rmask = bitVectUnion (rmask, + xa51_rUmaskForOp (IC_LEFT (ic))); + + + if (IC_RIGHT (ic)) + rmask = bitVectUnion (rmask, + xa51_rUmaskForOp (IC_RIGHT (ic))); + + if (IC_RESULT (ic)) + rmask = bitVectUnion (rmask, + xa51_rUmaskForOp (IC_RESULT (ic))); + +ret: + return rmask; +} + +/*-----------------------------------------------------------------*/ +/* createRegMask - for each instruction will determine the regsUsed */ +/*-----------------------------------------------------------------*/ +static void +createRegMask (eBBlock ** ebbs, int count) +{ + int i; + + /* for all blocks */ + for (i = 0; i < count; i++) + { + iCode *ic; + + if (ebbs[i]->noPath && + (ebbs[i]->entryLabel != entryLabel && + ebbs[i]->entryLabel != returnLabel)) + continue; + + /* for all instructions */ + for (ic = ebbs[i]->sch; ic; ic = ic->next) + { + + int j; + + if (SKIP_IC2 (ic) || !ic->rlive) + continue; + + /* first mark the registers used in this + instruction */ + ic->rUsed = regsUsedIniCode (ic); + _G.funcrUsed = bitVectUnion (_G.funcrUsed, ic->rUsed); + + /* now create the register mask for those + registers that are in use : this is a + super set of ic->rUsed */ + ic->rMask = newBitVect (xa51_nRegs + 1); + + /* for all live Ranges alive at this point */ + for (j = 1; j < ic->rlive->size; j++) + { + symbol *sym; + int k; + + /* if not alive then continue */ + if (!bitVectBitValue (ic->rlive, j)) + continue; + + /* find the live range we are interested in */ + if (!(sym = hTabItemWithKey (liveRanges, j))) + { + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "createRegMask cannot find live range"); + exit (0); + } + + /* if no register assigned to it */ + if (!sym->nRegs || sym->isspilt) + continue; + + /* for all the registers allocated to it */ + for (k = 0; k < sym->nRegs; k++) + if (sym->regs[k]) + ic->rMask = + bitVectSetBit (ic->rMask, sym->regs[k]->rIdx); + } + } + } +} + +/*-----------------------------------------------------------------*/ +/* rematStr - returns the rematerialized string for a remat var */ +/*-----------------------------------------------------------------*/ +static char * +rematStr (symbol * sym) +{ + char *s = buffer; + iCode *ic = sym->rematiCode; + + while (1) + { + + /* if plus or minus print the right hand side */ + if (ic->op == '+' || ic->op == '-') + { + sprintf (s, "0x%04x %c ", (int) operandLitValue (IC_RIGHT (ic)), + ic->op); + s += strlen (s); + ic = OP_SYMBOL (IC_LEFT (ic))->rematiCode; + continue; + } + + /* cast then continue */ + if (IS_CAST_ICODE(ic)) { + ic = OP_SYMBOL (IC_RIGHT (ic))->rematiCode; + continue; + } + /* we reached the end */ + sprintf (s, "%s", OP_SYMBOL (IC_LEFT (ic))->rname); + break; + } + + return buffer; +} + +/*-----------------------------------------------------------------*/ +/* regTypeNum - computes the type & number of registers required */ +/*-----------------------------------------------------------------*/ +static void +regTypeNum (eBBlock *ebbs) +{ + symbol *sym; + int k; + iCode *ic; + + /* for each live range do */ + for (sym = hTabFirstItem (liveRanges, &k); sym; + sym = hTabNextItem (liveRanges, &k)) + { + + /* if used zero times then no registers needed */ + if ((sym->liveTo - sym->liveFrom) == 0) + continue; + + + /* if the live range is a temporary */ + if (sym->isitmp) + { + + /* if the type is marked as a conditional */ + if (sym->regType == REG_CND) + continue; + + /* if used in return only then we don't + need registers */ +#if 0 // not yet + if (sym->ruonly || sym->accuse) + { + if (IS_AGGREGATE (sym->type) || sym->isptr) + sym->type = aggrToPtr (sym->type, FALSE); + continue; + } +#endif + + /* if the symbol has only one definition & + that definition is a get_pointer and the + pointer we are getting is rematerializable and + in "data" space */ + + if (bitVectnBitsOn (sym->defs) == 1 && + (ic = hTabItemWithKey (iCodehTab, + bitVectFirstBit (sym->defs))) && + POINTER_GET (ic) && + !sym->noSpilLoc && + !IS_BITVAR (sym->etype)) + { + + + /* if remat in data space */ + if (OP_SYMBOL (IC_LEFT (ic))->remat && + !IS_CAST_ICODE(OP_SYMBOL (IC_LEFT (ic))->rematiCode) && + DCL_TYPE (aggrToPtr (sym->type, FALSE)) == POINTER) + { + /* create a psuedo symbol & force a spil */ + symbol *psym = newSymbol (rematStr (OP_SYMBOL (IC_LEFT (ic))), 1); + psym->type = sym->type; + psym->etype = sym->etype; + strcpy (psym->rname, psym->name); + sym->isspilt = 1; + sym->usl.spillLoc = psym; +#if 0 // an alternative fix for bug #480076 + /* now this is a useless assignment to itself */ + remiCodeFromeBBlock (ebbs, ic); +#else + /* now this really is an assignment to itself, make it so; + it will be optimized out later */ + ic->op='='; + IC_RIGHT(ic)=IC_RESULT(ic); + IC_LEFT(ic)=NULL; +#endif + continue; + } + + /* if in data space or idata space then try to + allocate pointer register */ + + } + + /* if not then we require registers */ +#if 0 + sym->nRegs = ((IS_AGGREGATE (sym->type) || sym->isptr) ? + getSize (sym->type = aggrToPtr (sym->type, FALSE)) : + getSize (sym->type)); +#else + { + int size=((IS_AGGREGATE (sym->type) || sym->isptr) ? + getSize (sym->type = aggrToPtr (sym->type, FALSE)) : + getSize (sym->type)); + switch (size) + { + case 1: // byte + case 2: // word or pointer + sym->nRegs=1; + break; + case 3: // generic pointer + sym->nRegs=2; + break; + case 4: // dword or float + sym->nRegs=2; + break; + default: + fprintf (stderr, "regTypeNum: unknown size\n"); + exit (1); + } + } +#endif + + if (sym->nRegs > 4) + { + fprintf (stderr, "allocated more than 4 or 0 registers for type "); + printTypeChain (sym->type, stderr); + fprintf (stderr, "\n"); + } + + /* determine the type of register required */ + if (IS_PTR (sym->type)) + sym->regType = REG_PTR; + else + sym->regType = REG_GPR; + + } + else + /* for the first run we don't provide */ + /* registers for true symbols we will */ + /* see how things go */ + sym->nRegs = 0; + } + +} + +/*-----------------------------------------------------------------*/ +/* deallocStackSpil - this will set the stack pointer back */ +/*-----------------------------------------------------------------*/ +static +DEFSETFUNC (deallocStackSpil) +{ + symbol *sym = item; + + deallocLocal (sym); + return 0; +} + +/*-----------------------------------------------------------------*/ +/* packRegsForAssign - register reduction for assignment */ +/*-----------------------------------------------------------------*/ +static int +packRegsForAssign (iCode * ic, eBBlock * ebp) +{ + iCode *dic, *sic; + + if (!IS_ITEMP (IC_RIGHT (ic)) || + OP_LIVETO (IC_RIGHT (ic)) > ic->seq) { + return 0; + } + + /* find the definition of iTempNN scanning backwards */ + for (dic = ic->prev; dic; dic = dic->prev) { + + /* if there is a function call then don't pack it */ + if ((dic->op == CALL || dic->op == PCALL)) { + dic = NULL; + break; + } + + if (SKIP_IC2 (dic)) + continue; + + if (IS_SYMOP (IC_RESULT (dic)) && + IC_RESULT (dic)->key == IC_RIGHT (ic)->key) { + break; + } + + } + + if (!dic) + return 0; /* did not find */ + + /* found the definition */ + /* replace the result with the result of */ + /* this assignment and remove this assignment */ + bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key); + IC_RESULT (dic) = IC_RESULT (ic); + + if (IS_ITEMP (IC_RESULT (dic)) && + OP_SYMBOL (IC_RESULT (dic))->liveFrom > dic->seq) + { + OP_SYMBOL (IC_RESULT (dic))->liveFrom = dic->seq; + } + /* delete from liverange table also + delete from all the points inbetween and the new + one */ + for (sic = dic; sic != ic; sic = sic->next) + { + bitVectUnSetBit (sic->rlive, IC_RESULT (ic)->key); + if (IS_ITEMP (IC_RESULT (dic))) + bitVectSetBit (sic->rlive, IC_RESULT (dic)->key); + } + + remiCodeFromeBBlock (ebp, ic); + bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key); + hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL); + OP_DEFS (IC_RESULT (dic)) = bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key); + return 1; + +} + +/*-----------------------------------------------------------------*/ +/* findAssignToSym : scanning backwards looks for first assig found */ +/*-----------------------------------------------------------------*/ +static iCode * +findAssignToSym (operand * op, iCode * ic) +{ + iCode *dic; + + for (dic = ic->prev; dic; dic = dic->prev) + { + + /* if definition by assignment */ + if (dic->op == '=' && + !POINTER_SET (dic) && + IC_RESULT (dic)->key == op->key +/* && IS_TRUE_SYMOP(IC_RIGHT(dic)) */ + ) + { + + /* we are interested only if defined in far space */ + /* or in stack space in case of + & - */ + + /* if assigned to a non-symbol then return + FALSE */ + if (!IS_SYMOP (IC_RIGHT (dic))) + return NULL; + + /* if the symbol is in far space then + we should not */ + if (isOperandInFarSpace (IC_RIGHT (dic))) + return NULL; + + /* for + & - operations make sure that + if it is on the stack it is the same + as one of the three operands */ + if ((ic->op == '+' || ic->op == '-') && + OP_SYMBOL (IC_RIGHT (dic))->onStack) + { + + if (IC_RESULT (ic)->key != IC_RIGHT (dic)->key && + IC_LEFT (ic)->key != IC_RIGHT (dic)->key && + IC_RIGHT (ic)->key != IC_RIGHT (dic)->key) + return NULL; + } + + break; + + } + + /* if we find an usage then we cannot delete it */ + if (IC_LEFT (dic) && IC_LEFT (dic)->key == op->key) + return NULL; + + if (IC_RIGHT (dic) && IC_RIGHT (dic)->key == op->key) + return NULL; + + if (POINTER_SET (dic) && IC_RESULT (dic)->key == op->key) + return NULL; + } + + /* now make sure that the right side of dic + is not defined between ic & dic */ + if (dic) + { + iCode *sic = dic->next; + + for (; sic != ic; sic = sic->next) + if (IC_RESULT (sic) && + IC_RESULT (sic)->key == IC_RIGHT (dic)->key) + return NULL; + } + + return dic; + + +} + +/*-----------------------------------------------------------------*/ +/* packRegsForSupport :- reduce some registers for support calls */ +/*-----------------------------------------------------------------*/ +static int +packRegsForSupport (iCode * ic, eBBlock * ebp) +{ + int change = 0; + iCode *dic, *sic; + + /* for the left & right operand :- look to see if the + left was assigned a true symbol in far space in that + case replace them */ + + if (IS_ITEMP (IC_LEFT (ic)) && + OP_SYMBOL (IC_LEFT (ic))->liveTo <= ic->seq) + { + dic = findAssignToSym (IC_LEFT (ic), ic); + + if (!dic) + goto right; + + /* found it we need to remove it from the + block */ + for (sic = dic; sic != ic; sic = sic->next) + bitVectUnSetBit (sic->rlive, IC_LEFT (ic)->key); + + OP_SYMBOL(IC_LEFT (ic))=OP_SYMBOL(IC_RIGHT (dic)); + IC_LEFT (ic)->key = OP_SYMBOL(IC_RIGHT (dic))->key; + remiCodeFromeBBlock (ebp, dic); + bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key); + hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL); + change++; + } + + /* do the same for the right operand */ + right: + if (!change && + IS_ITEMP (IC_RIGHT (ic)) && + OP_SYMBOL (IC_RIGHT (ic))->liveTo <= ic->seq) + { + iCode *dic = findAssignToSym (IC_RIGHT (ic), ic); + iCode *sic; + + if (!dic) + return change; + + /* if this is a subtraction & the result + is a true symbol in far space then don't pack */ + if (ic->op == '-' && IS_TRUE_SYMOP (IC_RESULT (dic))) + { + sym_link *etype = getSpec (operandType (IC_RESULT (dic))); + if (IN_FARSPACE (SPEC_OCLS (etype))) + return change; + } + /* found it we need to remove it from the + block */ + for (sic = dic; sic != ic; sic = sic->next) + bitVectUnSetBit (sic->rlive, IC_RIGHT (ic)->key); + + IC_RIGHT (ic)->operand.symOperand = + IC_RIGHT (dic)->operand.symOperand; + IC_RIGHT (ic)->key = IC_RIGHT (dic)->operand.symOperand->key; + + remiCodeFromeBBlock (ebp, dic); + bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key); + hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL); + change++; + } + + return change; +} + +#define IS_OP_RUONLY(x) (x && IS_SYMOP(x) && OP_SYMBOL(x)->ruonly) + + +/*-----------------------------------------------------------------*/ +/* packRegsForOneuse : - will reduce some registers for single Use */ +/*-----------------------------------------------------------------*/ +static iCode * +packRegsForOneuse (iCode * ic, operand * op, eBBlock * ebp) +{ + bitVect *uses; + iCode *dic, *sic; + + /* if returning a literal then do nothing */ + if (!IS_SYMOP (op)) + return NULL; + + if (ic->op != RETURN && + ic->op != SEND && + !POINTER_SET (ic) && + !POINTER_GET (ic)) + return NULL; + + /* this routine will mark the a symbol as used in one + instruction use only && if the defintion is local + (ie. within the basic block) && has only one definition && + that definiion is either a return value from a + function or does not contain any variables in + far space */ + uses = bitVectCopy (OP_USES (op)); + bitVectUnSetBit (uses, ic->key); /* take away this iCode */ + if (!bitVectIsZero (uses)) /* has other uses */ + return NULL; + + /* if it has only one defintion */ + if (bitVectnBitsOn (OP_DEFS (op)) > 1) + return NULL; /* has more than one definition */ + + /* get that definition */ + if (!(dic = + hTabItemWithKey (iCodehTab, + bitVectFirstBit (OP_DEFS (op))))) + return NULL; + + /* if that only usage is a cast */ + if (dic->op == CAST) { + /* to a bigger type */ + if (getSize(OP_SYM_TYPE(IC_RESULT(dic))) > + getSize(OP_SYM_TYPE(IC_RIGHT(dic)))) { + /* than we can not, since we cannot predict the usage of b & acc */ + return NULL; + } + } + + /* found the definition now check if it is local */ + if (dic->seq < ebp->fSeq || + dic->seq > ebp->lSeq) + return NULL; /* non-local */ + + /* now check if it is the return from + a function call */ + if (dic->op == CALL || dic->op == PCALL) + { + if (ic->op != SEND && ic->op != RETURN && + !POINTER_SET(ic) && !POINTER_GET(ic)) + { + OP_SYMBOL (op)->ruonly = 1; + return dic; + } + dic = dic->next; + } + + + /* otherwise check that the definition does + not contain any symbols in far space */ + if (isOperandInFarSpace (IC_LEFT (dic)) || + isOperandInFarSpace (IC_RIGHT (dic)) || + IS_OP_RUONLY (IC_LEFT (ic)) || + IS_OP_RUONLY (IC_RIGHT (ic))) + { + return NULL; + } + + /* if pointer set then make sure the pointer + is one byte */ + if (POINTER_SET (dic) && + !IS_DATA_PTR (aggrToPtr (operandType (IC_RESULT (dic)), FALSE))) + return NULL; + + if (POINTER_GET (dic) && + !IS_DATA_PTR (aggrToPtr (operandType (IC_LEFT (dic)), FALSE))) + return NULL; + + sic = dic; + + /* also make sure the intervenening instructions + don't have any thing in far space */ + for (dic = dic->next; dic && dic != ic && sic != ic; dic = dic->next) + { + + /* if there is an intervening function call then no */ + if (dic->op == CALL || dic->op == PCALL) + return NULL; + /* if pointer set then make sure the pointer + is one byte */ + if (POINTER_SET (dic) && + !IS_DATA_PTR (aggrToPtr (operandType (IC_RESULT (dic)), FALSE))) + return NULL; + + if (POINTER_GET (dic) && + !IS_DATA_PTR (aggrToPtr (operandType (IC_LEFT (dic)), FALSE))) + return NULL; + + /* if address of & the result is remat the okay */ + if (dic->op == ADDRESS_OF && + OP_SYMBOL (IC_RESULT (dic))->remat) + continue; + + /* if operand has size of three or more & this + operation is a '*','/' or '%' then 'b' may + cause a problem */ + if ((dic->op == '%' || dic->op == '/' || dic->op == '*') && + getSize (operandType (op)) >= 3) + return NULL; + + /* if left or right or result is in far space */ + if (isOperandInFarSpace (IC_LEFT (dic)) || + isOperandInFarSpace (IC_RIGHT (dic)) || + isOperandInFarSpace (IC_RESULT (dic)) || + IS_OP_RUONLY (IC_LEFT (dic)) || + IS_OP_RUONLY (IC_RIGHT (dic)) || + IS_OP_RUONLY (IC_RESULT (dic))) + { + return NULL; + } + /* if left or right or result is on stack */ + if (isOperandOnStack(IC_LEFT(dic)) || + isOperandOnStack(IC_RIGHT(dic)) || + isOperandOnStack(IC_RESULT(dic))) { + return NULL; + } + } + + OP_SYMBOL (op)->ruonly = 1; + return sic; + +} + +/*-----------------------------------------------------------------*/ +/* isBitwiseOptimizable - requirements of JEAN LOUIS VERN */ +/*-----------------------------------------------------------------*/ +static bool +isBitwiseOptimizable (iCode * ic) +{ + sym_link *ltype = getSpec (operandType (IC_LEFT (ic))); + sym_link *rtype = getSpec (operandType (IC_RIGHT (ic))); + + /* bitwise operations are considered optimizable + under the following conditions (Jean-Louis VERN) + + x & lit + bit & bit + bit & x + bit ^ bit + bit ^ x + x ^ lit + x | lit + bit | bit + bit | x + */ + if (IS_LITERAL(rtype) || + (IS_BITVAR (ltype) && IN_BITSPACE (SPEC_OCLS (ltype)))) + return TRUE; + else + return FALSE; +} + +/*-----------------------------------------------------------------*/ +/* packForPush - hueristics to reduce iCode for pushing */ +/*-----------------------------------------------------------------*/ +static void +packForPush (iCode * ic, eBBlock * ebp) +{ + iCode *dic, *lic; + bitVect *dbv; + + if (ic->op != IPUSH || !IS_ITEMP (IC_LEFT (ic))) + return; + + /* must have only definition & one usage */ + if (bitVectnBitsOn (OP_DEFS (IC_LEFT (ic))) != 1 || + bitVectnBitsOn (OP_USES (IC_LEFT (ic))) != 1) + return; + + /* find the definition */ + if (!(dic = hTabItemWithKey (iCodehTab, + bitVectFirstBit (OP_DEFS (IC_LEFT (ic)))))) + return; + + if (dic->op != '=' || POINTER_SET (dic)) + return; + + /* make sure the right side does not have any definitions + inbetween */ + dbv = OP_DEFS(IC_RIGHT(dic)); + for (lic = ic; lic && lic != dic ; lic = lic->prev) { + if (bitVectBitValue(dbv,lic->key)) + return ; + } + /* make sure they have the same type */ + { + sym_link *itype=operandType(IC_LEFT(ic)); + sym_link *ditype=operandType(IC_RIGHT(dic)); + + if (SPEC_USIGN(itype)!=SPEC_USIGN(ditype) || + SPEC_LONG(itype)!=SPEC_LONG(ditype)) + return; + } + /* extend the live range of replaced operand if needed */ + if (OP_SYMBOL(IC_RIGHT(dic))->liveTo < ic->seq) { + OP_SYMBOL(IC_RIGHT(dic))->liveTo = ic->seq; + } + /* we now know that it has one & only one def & use + and the that the definition is an assignment */ + IC_LEFT (ic) = IC_RIGHT (dic); + + remiCodeFromeBBlock (ebp, dic); + bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key); + hTabDeleteItem (&iCodehTab, dic->key, dic, DELETE_ITEM, NULL); +} + +/*-----------------------------------------------------------------*/ +/* packRegisters - does some transformations to reduce register */ +/* pressure */ +/*-----------------------------------------------------------------*/ +static void packRegisters (eBBlock * ebp) { + iCode *ic; + int change = 0; + + while (1) { + change = 0; + + for (ic = ebp->sch; ic; ic = ic->next) { + if (ic->op == '=') + change += packRegsForAssign (ic, ebp); + } + + if (!change) + break; + } + return; // that's it for now + + for (ic = ebp->sch; ic; ic = ic->next) + { + /* if this is an itemp & result of an address of a true sym + then mark this as rematerialisable */ + if (ic->op == ADDRESS_OF && + IS_ITEMP (IC_RESULT (ic)) && + IS_TRUE_SYMOP (IC_LEFT (ic)) && + bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1 && + !OP_SYMBOL (IC_LEFT (ic))->onStack) + { + + OP_SYMBOL (IC_RESULT (ic))->remat = 1; + OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic; + OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL; + + } + + /* if straight assignment then carry remat flag if + this is the only definition */ + if (ic->op == '=' && + !POINTER_SET (ic) && + IS_SYMOP (IC_RIGHT (ic)) && + OP_SYMBOL (IC_RIGHT (ic))->remat && + !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode) && + bitVectnBitsOn (OP_SYMBOL (IC_RESULT (ic))->defs) <= 1) + { + + OP_SYMBOL (IC_RESULT (ic))->remat = + OP_SYMBOL (IC_RIGHT (ic))->remat; + OP_SYMBOL (IC_RESULT (ic))->rematiCode = + OP_SYMBOL (IC_RIGHT (ic))->rematiCode; + } + + /* if cast to a generic pointer & the pointer being + cast is remat, then we can remat this cast as well */ + if (ic->op == CAST && + IS_SYMOP(IC_RIGHT(ic)) && + OP_SYMBOL(IC_RIGHT(ic))->remat ) { + sym_link *to_type = operandType(IC_LEFT(ic)); + sym_link *from_type = operandType(IC_RIGHT(ic)); + if (IS_GENPTR(to_type) && IS_PTR(from_type)) { + OP_SYMBOL (IC_RESULT (ic))->remat = 1; + OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic; + OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL; + } + } + + /* if this is a +/- operation with a rematerizable + then mark this as rematerializable as well */ + if ((ic->op == '+' || ic->op == '-') && + (IS_SYMOP (IC_LEFT (ic)) && + IS_ITEMP (IC_RESULT (ic)) && + IS_OP_LITERAL (IC_RIGHT (ic))) && + OP_SYMBOL (IC_LEFT (ic))->remat && + (!IS_SYMOP (IC_RIGHT (ic)) || !IS_CAST_ICODE(OP_SYMBOL (IC_RIGHT (ic))->rematiCode)) && + bitVectnBitsOn (OP_DEFS (IC_RESULT (ic))) == 1) + { + OP_SYMBOL (IC_RESULT (ic))->remat = 1; + OP_SYMBOL (IC_RESULT (ic))->rematiCode = ic; + OP_SYMBOL (IC_RESULT (ic))->usl.spillLoc = NULL; + } + + /* mark the pointer usages */ + if (POINTER_SET (ic)) + OP_SYMBOL (IC_RESULT (ic))->uptr = 1; + + if (POINTER_GET (ic)) + OP_SYMBOL (IC_LEFT (ic))->uptr = 1; + + /* if the condition of an if instruction + is defined in the previous instruction and + this is the only usage then + mark the itemp as a conditional */ + if ((IS_CONDITIONAL (ic) || + (IS_BITWISE_OP(ic) && isBitwiseOptimizable (ic))) && + ic->next && ic->next->op == IFX && + bitVectnBitsOn (OP_USES(IC_RESULT(ic)))==1 && + isOperandEqual (IC_RESULT (ic), IC_COND (ic->next)) && + OP_SYMBOL (IC_RESULT (ic))->liveTo <= ic->next->seq) + { + OP_SYMBOL (IC_RESULT (ic))->regType = REG_CND; + continue; + } + + /* reduce for support function calls */ + if (ic->supportRtn || ic->op == '+' || ic->op == '-') + packRegsForSupport (ic, ebp); + + /* 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 == MODEL_SMALL) { + if (0 && options.stackAuto) { + /* we should check here if acc will be clobbered for stack + offset calculations */ + } else { + packRegsForOneuse (ic, IC_LEFT (ic), ebp); + } + } + + /* if pointer set & left has a size more than + one and right is not in far space */ + if (POINTER_SET (ic) && + !isOperandInFarSpace (IC_RIGHT (ic)) && + !OP_SYMBOL (IC_RESULT (ic))->remat && + !IS_OP_RUONLY (IC_RIGHT (ic)) && + getSize (aggrToPtr (operandType (IC_RESULT (ic)), FALSE)) > 1) + + packRegsForOneuse (ic, IC_RESULT (ic), ebp); + + /* if pointer get */ + if (POINTER_GET (ic) && + !isOperandInFarSpace (IC_RESULT (ic)) && + !OP_SYMBOL (IC_LEFT (ic))->remat && + !IS_OP_RUONLY (IC_RESULT (ic)) && + getSize (aggrToPtr (operandType (IC_LEFT (ic)), FALSE)) > 1) + + packRegsForOneuse (ic, IC_LEFT (ic), ebp); + + + /* if this is cast for intergral promotion then + check if only use of the definition of the + operand being casted/ if yes then replace + the result of that arithmetic operation with + this result and get rid of the cast */ + if (ic->op == CAST) + { + sym_link *fromType = operandType (IC_RIGHT (ic)); + sym_link *toType = operandType (IC_LEFT (ic)); + + if (IS_INTEGRAL (fromType) && IS_INTEGRAL (toType) && + getSize (fromType) != getSize (toType) && + SPEC_USIGN (fromType) == SPEC_USIGN (toType)) + { + + iCode *dic = packRegsForOneuse (ic, IC_RIGHT (ic), ebp); + if (dic) + { + if (IS_ARITHMETIC_OP (dic)) + { + bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key); + IC_RESULT (dic) = IC_RESULT (ic); + remiCodeFromeBBlock (ebp, ic); + bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key); + hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL); + OP_DEFS (IC_RESULT (dic)) = bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key); + ic = ic->prev; + } + else + OP_SYMBOL (IC_RIGHT (ic))->ruonly = 0; + } + } + else + { + + /* if the type from and type to are the same + then if this is the only use then packit */ + if (compareType (operandType (IC_RIGHT (ic)), + operandType (IC_LEFT (ic))) == 1) + { + iCode *dic = packRegsForOneuse (ic, IC_RIGHT (ic), ebp); + if (dic) + { + bitVectUnSetBit(OP_SYMBOL(IC_RESULT(dic))->defs,dic->key); + IC_RESULT (dic) = IC_RESULT (ic); + remiCodeFromeBBlock (ebp, ic); + bitVectUnSetBit(OP_SYMBOL(IC_RESULT(ic))->defs,ic->key); + hTabDeleteItem (&iCodehTab, ic->key, ic, DELETE_ITEM, NULL); + OP_DEFS (IC_RESULT (dic)) = bitVectSetBit (OP_DEFS (IC_RESULT (dic)), dic->key); + ic = ic->prev; + } + } + } + } + + /* pack for PUSH + iTempNN := (some variable in farspace) V1 + push iTempNN ; + ------------- + push V1 + */ + if (ic->op == IPUSH) + { + packForPush (ic, ebp); + } + } +} + +/*-----------------------------------------------------------------*/ +/* assignRegisters - assigns registers to each live range as need */ +/*-----------------------------------------------------------------*/ +void +xa51_assignRegisters (eBBlock ** ebbs, int count) +{ + iCode *ic; + int i; + + setToNull ((void *) &_G.funcrUsed); + setToNull ((void *) &_G.totRegAssigned); + _G.stackExtend = _G.dataExtend = 0; + + /* change assignments this will remove some + live ranges reducing some register pressure */ + for (i = 0; i < count; i++) + packRegisters (ebbs[i]); + + if (options.dump_pack) + dumpEbbsToFileExt (DUMP_PACK, ebbs, count); + + /* first determine for each live range the number of + registers & the type of registers required for each */ + regTypeNum (*ebbs); + + /* and serially allocate registers */ + serialRegAssign (ebbs, count); + + freeAllRegs (); + + /* if stack was extended then tell the user */ + if (_G.stackExtend) + { +/* werror(W_TOOMANY_SPILS,"stack", */ +/* _G.stackExtend,currFunc->name,""); */ + _G.stackExtend = 0; + } + + if (_G.dataExtend) + { +/* werror(W_TOOMANY_SPILS,"data space", */ +/* _G.dataExtend,currFunc->name,""); */ + _G.dataExtend = 0; + } + + /* after that create the register mask + for each of the instruction */ + createRegMask (ebbs, count); + + /* redo that offsets for stacked automatic variables */ + redoStackOffsets (); + + if (options.dump_rassgn) + { + dumpEbbsToFileExt (DUMP_RASSGN, ebbs, count); + dumpLiveRanges (DUMP_LRANGE, liveRanges); + } + + /* do the overlaysegment stuff SDCCmem.c */ + doOverlays (ebbs, count); + + /* now get back the chain */ + ic = iCodeLabelOptimize (iCodeFromeBBlock (ebbs, count)); + + genXA51Code (ic); + + /* free up any _G.stackSpil locations allocated */ + applyToSet (_G.stackSpil, deallocStackSpil); + _G.slocNum = 0; + setToNull ((void **) &_G.stackSpil); + setToNull ((void **) &_G.spiltSet); + /* mark all registers as free */ + freeAllRegs (); + + return; +} diff --git a/src/xa51/ralloc.h b/src/xa51/ralloc.h new file mode 100755 index 00000000..bddd52b3 --- /dev/null +++ b/src/xa51/ralloc.h @@ -0,0 +1,81 @@ +/*------------------------------------------------------------------------- + + SDCCralloc.h - header file register allocation + + Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998) + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + In other words, you are welcome to use, share and improve this program. + You are forbidden to forbid anyone else to use, share and improve + what you give them. Help stamp out software-hoarding! +-------------------------------------------------------------------------*/ +#include "SDCCicode.h" +#include "SDCCBBlock.h" +#ifndef SDCCRALLOC_H +#define SDCCRALLOC_H 1 + +#define ubyte unsigned char +#define byte ubyte +#define sbyte signed char +#define uword unsigned char +#define word uword +#define sword signed char +#define udword unsigned int +#define dword udword +#define sdword signed int + +#define REG_PTR 0x01 // pointer register +#define REG_GPR 0x02 // general purpose register +#define REG_CND 0x04 // condition (bit) register +#define REG_SCR 0x40 // scratch register +#define REG_STK 0x80 // stack pointer register + +typedef struct regs { + ubyte rIdx; // a unique # for this one + ubyte size; // size of register (0,1,2,4) + ubyte type; // pointer, general purpose, condition (bit) + char *name; + udword regMask; + uword offset; + bool isFree; + symbol *sym; +} regs; + +#if 0 +/* definition for the registers */ +typedef struct regs + { + short type; /* can have value REG_CND, REG_8BITS, + REG_16BITS or REG_32BITS */ + short rIdx; /* index into register table */ + short otype; + char *name; /* name */ + char *dname; /* name when direct access needed */ + char *base; /* base address */ + short offset; /* offset from the base */ + unsigned isFree:1; /* is currently unassigned */ + } +regs; +#endif + +extern regs regsXA51[]; +extern udword xa51RegsInUse; + +regs *xa51_regWithIdx (int); + +bitVect *xa51_rUmaskForOp (operand * op); + +#endif diff --git a/src/xa51/ralloc.o b/src/xa51/ralloc.o new file mode 100644 index 0000000000000000000000000000000000000000..6e686e8a09143aa17bdea2373911d1b74caec8d7 GIT binary patch literal 63429 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 VOr>dnDZhL8`lLFOWn->e{{yi{^>zRN literal 0 HcmV?d00001 -- 2.30.2