X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fmcs51%2Fgen.c;h=98b095848c76665b5e2f53d21b7ea572de468d53;hb=7a2d58f44908f85e62cbd7f734f443cf7dcb0ab9;hp=718a1ccab42519c177afb3b8b1505847e7052c0d;hpb=d237f07c608546609969da3a62320a6a91ce674f;p=fw%2Fsdcc diff --git a/src/mcs51/gen.c b/src/mcs51/gen.c index 718a1cca..98b09584 100644 --- a/src/mcs51/gen.c +++ b/src/mcs51/gen.c @@ -38,23 +38,6 @@ #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" @@ -105,7 +88,7 @@ static void saveRBank (int, iCode *, bool); (IC_RESULT(x) && IC_RESULT(x)->aop && \ IC_RESULT(x)->aop->type == AOP_STK ) -#define MOVA(x) if (strcmp(x,"a") && strcmp(x,"acc")) emitcode("mov","a,%s",x); +#define MOVA(x) mova(x) /* use function to avoid multiple eval */ #define CLRC emitcode("clr","c") #define SETC emitcode("setb","c") @@ -159,6 +142,19 @@ emitcode (char *inst, char *fmt,...) va_end (ap); } +/*-----------------------------------------------------------------*/ +/* mova - moves specified value into accumulator */ +/*-----------------------------------------------------------------*/ +static void +mova (char *x) +{ + /* do some early peephole optimization */ + if (!strcmp(x, "a") || !strcmp(x, "acc")) + return; + + emitcode("mov","a,%s", x); +} + /*-----------------------------------------------------------------*/ /* getFreePtr - returns r0 or r1 whichever is free or can be pushed */ /*-----------------------------------------------------------------*/ @@ -755,6 +751,51 @@ dealloc: } } +/*-----------------------------------------------------------------*/ +/* aopGetUsesAcc - indicates ahead of time whether aopGet() will */ +/* clobber the accumulator */ +/*-----------------------------------------------------------------*/ +static bool +aopGetUsesAcc (asmop *aop, int offset) +{ + if (offset > (aop->size - 1)) + return FALSE; + + switch (aop->type) + { + + case AOP_R0: + case AOP_R1: + if (aop->paged) + return TRUE; + return FALSE; + case AOP_DPTR: + return TRUE; + case AOP_IMMD: + return FALSE; + case AOP_DIR: + return FALSE; + case AOP_REG: + wassert(strcmp(aop->aopu.aop_reg[offset]->name, "a")); + return FALSE; + case AOP_CRY: + return TRUE; + case AOP_ACC: + return TRUE; + case AOP_LIT: + return FALSE; + case AOP_STR: + if (strcmp (aop->aopu.aop_str[offset], "a") == 0) + return TRUE; + return FALSE; + default: + /* Error case --- will have been caught already */ + wassert(0); + return FALSE; + } +} + + /*-----------------------------------------------------------------*/ /* aopGet - for fetching value of the aop */ /*-----------------------------------------------------------------*/ @@ -801,6 +842,12 @@ aopGet (asmop * aop, int offset, bool bit16, bool dname) return rs; case AOP_DPTR: + if (aop->code && aop->coff==0 && offset>=1) { + emitcode ("mov", "a,#0x%02x", offset); + emitcode ("movc", "a,@a+dptr"); + return (dname ? "acc" : "a"); + } + while (offset > aop->coff) { emitcode ("inc", "dptr"); @@ -1155,7 +1202,7 @@ genNotFloat (operand * op, operand * res) char *l; symbol *tlbl; - D(emitcode (";", "genNotFloat")); + D(emitcode ("; genNotFloat","")); /* we will put 127 in the first byte of the result */ @@ -1285,7 +1332,7 @@ genNot (iCode * ic) symbol *tlbl; sym_link *optype = operandType (IC_LEFT (ic)); - D(emitcode (";", "genNot")); + D(emitcode ("; genNot","")); /* assign asmOps to operand & result */ aopOp (IC_LEFT (ic), ic, FALSE); @@ -1331,7 +1378,7 @@ genCpl (iCode * ic) int size; symbol *tlbl; - D(emitcode (";", "genCpl")); + D(emitcode ("; genCpl","")); /* assign asmOps to operand & result */ aopOp (IC_LEFT (ic), ic, FALSE); @@ -1378,17 +1425,11 @@ genUminusFloat (operand * op, operand * result) int size, offset = 0; char *l; - D(emitcode (";", "genUminusFloat")); + D(emitcode ("; genUminusFloat","")); - /* for this we just need to flip the - first it then copy the rest in place */ - size = AOP_SIZE (op) - 1; - l = aopGet (AOP (op), 3, FALSE, FALSE); - - MOVA (l); + /* for this we just copy and then flip the bit */ - emitcode ("cpl", "acc.7"); - aopPut (AOP (result), "a", 3); + size = AOP_SIZE (op) - 1; while (size--) { @@ -1397,6 +1438,13 @@ genUminusFloat (operand * op, operand * result) offset); offset++; } + + l = aopGet (AOP (op), offset, FALSE, FALSE); + + MOVA (l); + + emitcode ("cpl", "acc.7"); + aopPut (AOP (result), "a", offset); } /*-----------------------------------------------------------------*/ @@ -1409,7 +1457,7 @@ genUminus (iCode * ic) sym_link *optype, *rtype; - D(emitcode (";", "genUminus")); + D(emitcode ("; genUminus","")); /* assign asmops */ aopOp (IC_LEFT (ic), ic, FALSE); @@ -1631,7 +1679,7 @@ genXpush (iCode * ic) regs *r; int size, offset = 0; - D(emitcode (";", "genXpush")); + D(emitcode ("; genXpush","")); aopOp (IC_LEFT (ic), ic, FALSE); r = getFreePtr (ic, &aop, FALSE); @@ -1667,7 +1715,7 @@ genIpush (iCode * ic) int size, offset = 0; char *l; - D(emitcode (";", "genIpush")); + D(emitcode ("; genIpush","")); /* if this is not a parm push : ie. it is spill push and spill push is always done on the local stack */ @@ -1739,7 +1787,7 @@ genIpop (iCode * ic) { int size, offset; - D(emitcode (";", "genIpop")); + D(emitcode ("; genIpop","")); /* if the temp was not pushed then */ if (OP_SYMBOL (IC_LEFT (ic))->isspilt) @@ -1931,7 +1979,7 @@ genCall (iCode * ic) // bool restoreBank = FALSE; bool swapBanks = FALSE; - D(emitcode(";", "genCall")); + D(emitcode("; genCall","")); dtype = operandType (IC_LEFT (ic)); /* if send set is not empty the assign */ @@ -2031,7 +2079,7 @@ genPcall (iCode * ic) // bool restoreBank=FALSE; bool swapBanks = FALSE; - D(emitcode(";", "genPCall")); + D(emitcode("; genPCall","")); /* if caller saves & we have not saved then */ if (!ic->regsSaved) @@ -2463,12 +2511,12 @@ genFunction (iCode * ic) } else { - /* not callee-saves, we can clobber ar0 */ - emitcode ("mov", "ar0,a"); + /* not callee-saves, we can clobber r0 */ + emitcode ("mov", "r0,a"); emitcode ("mov", "a,sp"); emitcode ("add", "a,#0x%02x", ((char) sym->stack & 0xff)); emitcode ("mov", "sp,a"); - emitcode ("mov", "a,ar0"); + emitcode ("mov", "a,r0"); } } else @@ -2693,7 +2741,7 @@ genRet (iCode * ic) { int size, offset = 0, pushed = 0; - D(emitcode (";", "genRet")); + D(emitcode ("; genRet","")); /* if we have no return value then just generate the "ret" */ @@ -2822,10 +2870,10 @@ genPlusIncr (iCode * ic) if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4) return FALSE; - D(emitcode (";", "genPlusIncr")); + D(emitcode ("; genPlusIncr","")); - /* if increment 16 bits in register */ - if (AOP_TYPE(IC_LEFT(ic)) == AOP_REG && + /* if increment >=16 bits in register or direct space */ + if ((AOP_TYPE(IC_LEFT(ic)) == AOP_REG || AOP_TYPE(IC_LEFT(ic)) == AOP_DIR ) && sameRegs (AOP (IC_LEFT (ic)), AOP (IC_RESULT (ic))) && (size > 1) && (icount == 1)) @@ -2960,7 +3008,7 @@ outBitAcc (operand * result) static void genPlusBits (iCode * ic) { - D(emitcode (";", "genPlusBits")); + D(emitcode ("; genPlusBits","")); if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY) { @@ -3062,10 +3110,12 @@ static void genPlus (iCode * ic) { int size, offset = 0; + char *add; + asmop *leftOp, *rightOp; /* special cases :- */ - D(emitcode (";", "genPlus")); + D(emitcode ("; genPlus","")); aopOp (IC_LEFT (ic), ic, FALSE); aopOp (IC_RIGHT (ic), ic, FALSE); @@ -3124,29 +3174,32 @@ genPlus (iCode * ic) size = getDataSize (IC_RESULT (ic)); + leftOp = AOP(IC_LEFT(ic)); + rightOp = AOP(IC_RIGHT(ic)); + add = "add"; + while (size--) { - if (AOP_TYPE (IC_LEFT (ic)) == AOP_ACC) + if (aopGetUsesAcc (leftOp, offset) && aopGetUsesAcc (rightOp, offset)) { - MOVA (aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE)); - if (offset == 0) - emitcode ("add", "a,%s", - aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE)); - else - emitcode ("addc", "a,%s", - aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE)); + emitcode("mov", "b,a"); + MOVA (aopGet (leftOp, offset, FALSE, TRUE)); + emitcode("xch", "a,b"); + MOVA (aopGet (rightOp, offset, FALSE, TRUE)); + emitcode (add, "a,b"); + } + else if (aopGetUsesAcc (leftOp, offset)) + { + MOVA (aopGet (leftOp, offset, FALSE, TRUE)); + emitcode (add, "a,%s", aopGet (rightOp, offset, FALSE, TRUE)); } else { - MOVA (aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE)); - if (offset == 0) - emitcode ("add", "a,%s", - aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE)); - else - emitcode ("addc", "a,%s", - aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE)); + MOVA (aopGet (rightOp, offset, FALSE, TRUE)); + emitcode (add, "a,%s", aopGet (leftOp, offset, FALSE, TRUE)); } aopPut (AOP (IC_RESULT (ic)), "a", offset++); + add = "addc"; /* further adds must propagate carry */ } adjustArithmeticResult (ic); @@ -3177,10 +3230,10 @@ genMinusDec (iCode * ic) if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4) return FALSE; - D(emitcode (";", "genMinusDec")); + D(emitcode ("; genMinusDec","")); - /* if decrement 16 bits in register */ - if (AOP_TYPE(IC_LEFT(ic)) == AOP_REG && + /* if decrement >=16 bits in register or direct space */ + if ((AOP_TYPE(IC_LEFT(ic)) == AOP_REG || AOP_TYPE(IC_LEFT(ic)) == AOP_DIR) && sameRegs (AOP (IC_LEFT (ic)), AOP (IC_RESULT (ic))) && (size > 1) && (icount == 1)) @@ -3308,7 +3361,7 @@ genMinusBits (iCode * ic) { symbol *lbl = newiTempLabel (NULL); - D(emitcode (";", "genMinusBits")); + D(emitcode ("; genMinusBits","")); if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY) { @@ -3337,9 +3390,8 @@ static void genMinus (iCode * ic) { int size, offset = 0; - unsigned long lit = 0L; - D(emitcode (";", "genMinus")); + D(emitcode ("; genMinus","")); aopOp (IC_LEFT (ic), ic, FALSE); aopOp (IC_RIGHT (ic), ic, FALSE); @@ -3361,25 +3413,17 @@ genMinus (iCode * ic) size = getDataSize (IC_RESULT (ic)); - if (AOP_TYPE (IC_RIGHT (ic)) != AOP_LIT) - { - CLRC; - } - else + /* if literal, add a,#-lit, else normal subb */ + if (AOP_TYPE (IC_RIGHT (ic)) == AOP_LIT) { + unsigned long lit = 0L; + lit = (unsigned long) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit); lit = -(long) lit; - } - /* if literal, add a,#-lit, else normal subb */ - while (size--) - { - MOVA (aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE)); - if (AOP_TYPE (IC_RIGHT (ic)) != AOP_LIT) - emitcode ("subb", "a,%s", - aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE)); - else + while (size--) { + MOVA (aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE)); /* first add without previous c */ if (!offset) { if (!size && lit==-1) { @@ -3392,10 +3436,39 @@ genMinus (iCode * ic) emitcode ("addc", "a,#0x%02x", (unsigned int) ((lit >> (offset * 8)) & 0x0FFL)); } + aopPut (AOP (IC_RESULT (ic)), "a", offset++); } - aopPut (AOP (IC_RESULT (ic)), "a", offset++); } + else + { + asmop *leftOp, *rightOp; + + leftOp = AOP(IC_LEFT(ic)); + rightOp = AOP(IC_RIGHT(ic)); + while (size--) + { + if (aopGetUsesAcc(rightOp, offset)) { + wassertl(!aopGetUsesAcc(leftOp, offset), "accumulator clash"); + MOVA (aopGet(rightOp, offset, FALSE, TRUE)); + if (offset == 0) { + emitcode( "setb", "c"); + } + emitcode("subb", "a,%s", aopGet(leftOp, offset, FALSE, TRUE)); + emitcode("cpl", "a"); + } else { + MOVA (aopGet (leftOp, offset, FALSE, FALSE)); + if (offset == 0) + CLRC; + emitcode ("subb", "a,%s", + aopGet(rightOp, offset, FALSE, TRUE)); + } + + aopPut (AOP (IC_RESULT (ic)), "a", offset++); + } + } + + adjustArithmeticResult (ic); release: @@ -3413,7 +3486,7 @@ genMultbits (operand * left, operand * right, operand * result) { - D(emitcode (";", "genMultbits")); + D(emitcode ("; genMultbits","")); emitcode ("mov", "c,%s", AOP (left)->aopu.aop_dir); emitcode ("anl", "c,%s", AOP (right)->aopu.aop_dir); @@ -3433,7 +3506,7 @@ genMultOneByte (operand * left, symbol *lbl; int size=AOP_SIZE(result); - D(emitcode (";", "genMultOneByte")); + D(emitcode ("; genMultOneByte","")); if (size<1 || size>2) { // this should never happen @@ -3458,6 +3531,7 @@ genMultOneByte (operand * left, SPEC_USIGN(operandType(right)))) { // just an unsigned 8*8=8/16 multiply //emitcode (";","unsigned"); + // TODO: check for accumulator clash between left & right aops? emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE)); MOVA (aopGet (AOP (left), 0, FALSE, FALSE)); emitcode ("mul", "ab"); @@ -3537,7 +3611,7 @@ genMult (iCode * ic) operand *right = IC_RIGHT (ic); operand *result = IC_RESULT (ic); - D(emitcode (";", "genMult")); + D(emitcode ("; genMult","")); /* assign the amsops */ aopOp (left, ic, FALSE); @@ -3587,7 +3661,7 @@ genDivbits (operand * left, char *l; - D(emitcode (";", "genDivbits")); + D(emitcode ("; genDivbits","")); /* the result must be bit */ emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE)); @@ -3613,7 +3687,7 @@ genDivOneByte (operand * left, symbol *lbl; int size, offset; - D(emitcode (";", "genDivOneByte")); + D(emitcode ("; genDivOneByte","")); size = AOP_SIZE (result) - 1; offset = 1; @@ -3698,7 +3772,7 @@ genDiv (iCode * ic) operand *right = IC_RIGHT (ic); operand *result = IC_RESULT (ic); - D(emitcode (";", "genDiv")); + D(emitcode ("; genDiv","")); /* assign the amsops */ aopOp (left, ic, FALSE); @@ -3741,7 +3815,7 @@ genModbits (operand * left, char *l; - D(emitcode (";", "genModbits")); + D(emitcode ("; genModbits","")); /* the result must be bit */ emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE)); @@ -3767,7 +3841,7 @@ genModOneByte (operand * left, char *l; symbol *lbl; - D(emitcode (";", "genModOneByte")); + D(emitcode ("; genModOneByte","")); /* signed or unsigned */ if (SPEC_USIGN (opetype)) @@ -3842,7 +3916,7 @@ genMod (iCode * ic) operand *right = IC_RIGHT (ic); operand *result = IC_RESULT (ic); - D(emitcode (";", "genMod")); + D(emitcode ("; genMod","")); /* assign the amsops */ aopOp (left, ic, FALSE); @@ -3885,7 +3959,7 @@ genIfxJump (iCode * ic, char *jval) symbol *tlbl = newiTempLabel (NULL); char *inst; - D(emitcode (";", "genIfxJump")); + D(emitcode ("; genIfxJump","")); /* if true label then we jump if condition supplied is true */ @@ -3923,7 +3997,7 @@ genCmp (operand * left, operand * right, int size, offset = 0; unsigned long lit = 0L; - D(emitcode (";", "genCmp")); + D(emitcode ("; genCmp","")); /* if left & right are bit variables */ if (AOP_TYPE (left) == AOP_CRY && @@ -4033,7 +4107,7 @@ genCmpGt (iCode * ic, iCode * ifx) sym_link *letype, *retype; int sign; - D(emitcode (";", "genCmpGt")); + D(emitcode ("; genCmpGt","")); left = IC_LEFT (ic); right = IC_RIGHT (ic); @@ -4062,7 +4136,7 @@ genCmpLt (iCode * ic, iCode * ifx) sym_link *letype, *retype; int sign; - D(emitcode (";", "genCmpLt")); + D(emitcode ("; genCmpLt","")); left = IC_LEFT (ic); right = IC_RIGHT (ic); @@ -4179,7 +4253,7 @@ genCmpEq (iCode * ic, iCode * ifx) { operand *left, *right, *result; - D(emitcode (";", "genCmpEq")); + D(emitcode ("; genCmpEq","")); aopOp ((left = IC_LEFT (ic)), ic, FALSE); aopOp ((right = IC_RIGHT (ic)), ic, FALSE); @@ -4406,7 +4480,7 @@ genAndOp (iCode * ic) operand *left, *right, *result; symbol *tlbl; - D(emitcode (";", "genAndOp")); + D(emitcode ("; genAndOp","")); /* note here that && operations that are in an if statement are taken away by backPatchLabels @@ -4448,7 +4522,7 @@ genOrOp (iCode * ic) operand *left, *right, *result; symbol *tlbl; - D(emitcode (";", "genOrOp")); + D(emitcode ("; genOrOp","")); /* note here that || operations that are in an if statement are taken away by backPatchLabels @@ -4559,7 +4633,7 @@ genAnd (iCode * ic, iCode * ifx) int bytelit = 0; char buffer[10]; - D(emitcode (";", "genAnd")); + D(emitcode ("; genAnd","")); aopOp ((left = IC_LEFT (ic)), ic, FALSE); aopOp ((right = IC_RIGHT (ic)), ic, FALSE); @@ -4863,7 +4937,7 @@ genOr (iCode * ic, iCode * ifx) int size, offset = 0; unsigned long lit = 0L; - D(emitcode (";", "genOr")); + D(emitcode ("; genOr","")); aopOp ((left = IC_LEFT (ic)), ic, FALSE); aopOp ((right = IC_RIGHT (ic)), ic, FALSE); @@ -5132,7 +5206,7 @@ genXor (iCode * ic, iCode * ifx) int size, offset = 0; unsigned long lit = 0L; - D(emitcode (";", "genXor")); + D(emitcode ("; genXor","")); aopOp ((left = IC_LEFT (ic)), ic, FALSE); aopOp ((right = IC_RIGHT (ic)), ic, FALSE); @@ -5390,7 +5464,7 @@ genInline (iCode * ic) { char *buffer, *bp, *bp1; - D(emitcode (";", "genInline")); + D(emitcode ("; genInline","")); _G.inLine += (!options.asmpeep); @@ -5436,7 +5510,7 @@ genRRC (iCode * ic) int size, offset = 0; char *l; - D(emitcode (";", "genRRC")); + D(emitcode ("; genRRC","")); /* rotate right with carry */ left = IC_LEFT (ic); @@ -5486,7 +5560,7 @@ genRLC (iCode * ic) int size, offset = 0; char *l; - D(emitcode (";", "genRLC")); + D(emitcode ("; genRLC","")); /* rotate right with carry */ left = IC_LEFT (ic); @@ -5539,7 +5613,7 @@ genGetHbit (iCode * ic) { operand *left, *result; - D(emitcode (";", "genGetHbit")); + D(emitcode ("; genGetHbit","")); left = IC_LEFT (ic); result = IC_RESULT (ic); @@ -5928,6 +6002,7 @@ AccAXRsh (char *x, int shCount) emitcode ("mov", "c,acc.7"); AccAXLrl1 (x); // ABBBBBBC:CDDDDDDA + emitcode ("mov", "c,acc.7"); AccAXLrl1 (x); // BBBBBBCC:DDDDDDAA emitcode ("xch", "a,%s", x); // DDDDDDAA:BBBBBBCC @@ -6017,6 +6092,7 @@ AccAXRshS (char *x, int shCount) emitcode ("mov", "c,acc.7"); AccAXLrl1 (x); // ABBBBBBC:CDDDDDDA + emitcode ("mov", "c,acc.7"); AccAXLrl1 (x); // BBBBBBCC:DDDDDDAA emitcode ("xch", "a,%s", x); // DDDDDDAA:BBBBBBCC @@ -6145,7 +6221,7 @@ shiftRLeftOrResult (operand * left, int offl, static void genlshOne (operand * result, operand * left, int shCount) { - D(emitcode (";", "genlshOne")); + D(emitcode ("; genlshOne","")); shiftL1Left2Result (left, LSB, result, LSB, shCount); } @@ -6158,7 +6234,7 @@ genlshTwo (operand * result, operand * left, int shCount) { int size; - D(emitcode (";", "genlshTwo")); + D(emitcode ("; genlshTwo","")); size = getDataSize (result); @@ -6264,7 +6340,7 @@ genlshFour (operand * result, operand * left, int shCount) { int size; - D(emitcode (";", "genlshFour")); + D(emitcode ("; genlshFour","")); size = AOP_SIZE (result); @@ -6363,7 +6439,7 @@ genLeftShiftLiteral (operand * left, int shCount = (int) floatFromVal (AOP (right)->aopu.aop_lit); int size; - D(emitcode (";", "genLeftShiftLiteral")); + D(emitcode ("; genLeftShiftLiteral","")); freeAsmop (right, NULL, ic, TRUE); @@ -6405,7 +6481,8 @@ genLeftShiftLiteral (operand * left, genlshFour (result, left, shCount); break; default: - fprintf(stderr, "*** ack! mystery literal shift!\n"); + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "*** ack! mystery literal shift!\n"); break; } } @@ -6424,7 +6501,7 @@ genLeftShift (iCode * ic) char *l; symbol *tlbl, *tlbl1; - D(emitcode (";", "genLeftShift")); + D(emitcode ("; genLeftShift","")); right = IC_RIGHT (ic); left = IC_LEFT (ic); @@ -6527,7 +6604,7 @@ static void genrshOne (operand * result, operand * left, int shCount, int sign) { - D(emitcode (";", "genrshOne")); + D(emitcode ("; genrshOne","")); shiftR1Left2Result (left, LSB, result, LSB, shCount, sign); } @@ -6539,7 +6616,7 @@ static void genrshTwo (operand * result, operand * left, int shCount, int sign) { - D(emitcode (";", "genrshTwo")); + D(emitcode ("; genrshTwo","")); /* if shCount >= 8 */ if (shCount >= 8) @@ -6580,7 +6657,12 @@ shiftRLong (operand * left, int offl, if (sign) { emitcode ("rlc", "a"); emitcode ("subb", "a,acc"); - emitcode ("xch", "a,%s", aopGet(AOP(left), MSB32, FALSE, FALSE)); + if (isSameRegs) + emitcode ("xch", "a,%s", aopGet(AOP(left), MSB32, FALSE, FALSE)); + else { + aopPut (AOP (result), "a", MSB32); + MOVA (aopGet (AOP (left), MSB32, FALSE, FALSE)); + } } else { aopPut (AOP(result), zero, MSB32); } @@ -6597,7 +6679,7 @@ shiftRLong (operand * left, int offl, if (isSameRegs && offl==MSB16) { emitcode ("xch", "a,%s",aopGet (AOP (left), MSB24, FALSE, FALSE)); } else { - aopPut (AOP (result), "a", MSB32); + aopPut (AOP (result), "a", MSB32-offl); MOVA (aopGet (AOP (left), MSB24, FALSE, FALSE)); } @@ -6605,7 +6687,7 @@ shiftRLong (operand * left, int offl, if (isSameRegs && offl==1) { emitcode ("xch", "a,%s",aopGet (AOP (left), MSB16, FALSE, FALSE)); } else { - aopPut (AOP (result), "a", MSB24); + aopPut (AOP (result), "a", MSB24-offl); MOVA (aopGet (AOP (left), MSB16, FALSE, FALSE)); } emitcode ("rrc", "a"); @@ -6626,7 +6708,7 @@ static void genrshFour (operand * result, operand * left, int shCount, int sign) { - D(emitcode (";", "genrshFour")); + D(emitcode ("; genrshFour","")); /* if shifting more that 3 bytes */ if (shCount >= 24) @@ -6701,7 +6783,7 @@ genRightShiftLiteral (operand * left, int shCount = (int) floatFromVal (AOP (right)->aopu.aop_lit); int size; - D(emitcode (";", "genRightShiftLiteral")); + D(emitcode ("; genRightShiftLiteral","")); freeAsmop (right, NULL, ic, TRUE); @@ -6726,9 +6808,10 @@ genRightShiftLiteral (operand * left, else if (shCount >= (size * 8)) { - if (sign) + if (sign) { /* get sign in acc.7 */ MOVA (aopGet (AOP (left), size - 1, FALSE, FALSE)); + } addSign (result, LSB, sign); } else @@ -6749,10 +6832,9 @@ genRightShiftLiteral (operand * left, default: break; } - - freeAsmop (left, NULL, ic, TRUE); - freeAsmop (result, NULL, ic, TRUE); } + freeAsmop (left, NULL, ic, TRUE); + freeAsmop (result, NULL, ic, TRUE); } /*-----------------------------------------------------------------*/ @@ -6766,7 +6848,7 @@ genSignedRightShift (iCode * ic) char *l; symbol *tlbl, *tlbl1; - D(emitcode (";", "genSignedRightShift")); + D(emitcode ("; genSignedRightShift","")); /* we do it the hard way put the shift count in b and loop thru preserving the sign */ @@ -6874,7 +6956,7 @@ genRightShift (iCode * ic) char *l; symbol *tlbl, *tlbl1; - D(emitcode (";", "genRightShift")); + D(emitcode ("; genRightShift","")); /* if signed then we do it the hard way preserve the sign bit moving it inwards */ @@ -6995,7 +7077,7 @@ genUnpackBits (operand * result, char *rname, int ptype) int offset = 0; int rsize; - D(emitcode (";", "genUnpackBits")); + D(emitcode ("; genUnpackBits","")); etype = getSpec (operandType (result)); rsize = getSize (operandType (result)); @@ -7119,7 +7201,7 @@ genDataPointerGet (operand * left, char buffer[256]; int size, offset = 0; - D(emitcode (";", "genDataPointerGet")); + D(emitcode ("; genDataPointerGet","")); aopOp (result, ic, TRUE); @@ -7155,7 +7237,7 @@ genNearPointerGet (operand * left, sym_link *ltype = operandType (left); char buffer[80]; - D(emitcode (";", "genNearPointerGet")); + D(emitcode ("; genNearPointerGet","")); rtype = operandType (result); retype = getSpec (rtype); @@ -7267,7 +7349,7 @@ genPagedPointerGet (operand * left, char *rname; sym_link *rtype, *retype; - D(emitcode (";", "genPagedPointerGet")); + D(emitcode ("; genPagedPointerGet","")); rtype = operandType (result); retype = getSpec (rtype); @@ -7355,7 +7437,7 @@ genFarPointerGet (operand * left, int size, offset; sym_link *retype = getSpec (operandType (result)); - D(emitcode (";", "genFarPointerGet")); + D(emitcode ("; genFarPointerGet","")); aopOp (left, ic, FALSE); @@ -7411,7 +7493,7 @@ genCodePointerGet (operand * left, int size, offset; sym_link *retype = getSpec (operandType (result)); - D(emitcode (";", "genCodePointerGet")); + D(emitcode ("; genCodePointerGet","")); aopOp (left, ic, FALSE); @@ -7468,7 +7550,7 @@ genGenPointerGet (operand * left, int size, offset; sym_link *retype = getSpec (operandType (result)); - D(emitcode (";", "genGenPointerGet")); + D(emitcode ("; genGenPointerGet","")); aopOp (left, ic, FALSE); @@ -7532,7 +7614,7 @@ genPointerGet (iCode * ic, iCode *pi) sym_link *type, *etype; int p_type; - D(emitcode (";", "genPointerGet")); + D(emitcode ("; genPointerGet","")); left = IC_LEFT (ic); result = IC_RESULT (ic); @@ -7554,7 +7636,7 @@ genPointerGet (iCode * ic, iCode *pi) if (p_type == GPOINTER && OP_SYMBOL(left)->remat && IS_CAST_ICODE(OP_SYMBOL(left)->rematiCode)) { left = IC_RIGHT(OP_SYMBOL(left)->rematiCode); - type = type = operandType (left); + type = operandType (left); p_type = DCL_TYPE (type); } /* now that we have the pointer type we assign @@ -7600,7 +7682,7 @@ genPackBits (sym_link * etype, int blen, bstr; char *l; - D(emitcode (";", "genPackBits")); + D(emitcode ("; genPackBits","")); blen = SPEC_BLEN (etype); bstr = SPEC_BSTR (etype); @@ -7767,7 +7849,7 @@ genDataPointerSet (operand * right, int size, offset = 0; char *l, buffer[256]; - D(emitcode (";", "genDataPointerSet")); + D(emitcode ("; genDataPointerSet","")); aopOp (right, ic, FALSE); @@ -7802,7 +7884,7 @@ genNearPointerSet (operand * right, sym_link *retype, *letype; sym_link *ptype = operandType (result); - D(emitcode (";", "genNearPointerSet")); + D(emitcode ("; genNearPointerSet","")); retype = getSpec (operandType (right)); letype = getSpec (ptype); @@ -7929,7 +8011,7 @@ genPagedPointerSet (operand * right, char *rname, *l; sym_link *retype, *letype; - D(emitcode (";", "genPagedPointerSet")); + D(emitcode ("; genPagedPointerSet","")); retype = getSpec (operandType (right)); letype = getSpec (operandType (result)); @@ -8019,7 +8101,7 @@ genFarPointerSet (operand * right, sym_link *retype = getSpec (operandType (right)); sym_link *letype = getSpec (operandType (result)); - D(emitcode (";", "genFarPointerSet")); + D(emitcode ("; genFarPointerSet","")); aopOp (result, ic, FALSE); @@ -8076,7 +8158,7 @@ genGenPointerSet (operand * right, sym_link *retype = getSpec (operandType (right)); sym_link *letype = getSpec (operandType (result)); - D(emitcode (";", "genGenPointerSet")); + D(emitcode ("; genGenPointerSet","")); aopOp (result, ic, FALSE); @@ -8141,7 +8223,7 @@ genPointerSet (iCode * ic, iCode *pi) sym_link *type, *etype; int p_type; - D(emitcode (";", "genPointerSet")); + D(emitcode ("; genPointerSet","")); right = IC_RIGHT (ic); result = IC_RESULT (ic); @@ -8165,7 +8247,7 @@ genPointerSet (iCode * ic, iCode *pi) if (p_type == GPOINTER && OP_SYMBOL(result)->remat && IS_CAST_ICODE(OP_SYMBOL(result)->rematiCode)) { result = IC_RIGHT(OP_SYMBOL(result)->rematiCode); - type = type = operandType (result); + type = operandType (result); p_type = DCL_TYPE (type); } /* now that we have the pointer type we assign @@ -8189,6 +8271,10 @@ genPointerSet (iCode * ic, iCode *pi) case GPOINTER: genGenPointerSet (right, result, ic, pi); break; + + default: + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "genPointerSet: illegal pointer type"); } } @@ -8202,7 +8288,7 @@ genIfx (iCode * ic, iCode * popIc) operand *cond = IC_COND (ic); int isbit = 0; - D(emitcode (";", "genIfx")); + D(emitcode ("; genIfx","")); aopOp (cond, ic, FALSE); @@ -8239,7 +8325,7 @@ genAddrOf (iCode * ic) symbol *sym = OP_SYMBOL (IC_LEFT (ic)); int size, offset; - D(emitcode (";", "genAddrOf")); + D(emitcode ("; genAddrOf","")); aopOp (IC_RESULT (ic), ic, FALSE); @@ -8306,7 +8392,7 @@ genFarFarAssign (operand * result, operand * right, iCode * ic) int offset = 0; char *l; - D(emitcode (";", "genFarFarAssign")); + D(emitcode ("; genFarFarAssign","")); /* first push the right side on to the stack */ while (size--) @@ -8339,14 +8425,15 @@ genAssign (iCode * ic) int size, offset; unsigned long lit = 0L; - D(emitcode(";","genAssign")); + D(emitcode("; genAssign","")); result = IC_RESULT (ic); right = IC_RIGHT (ic); /* if they are the same */ - if (operandsEqu (IC_RESULT (ic), IC_RIGHT (ic))) + if (operandsEqu (result, right)) { return; + } aopOp (right, ic, FALSE); @@ -8443,7 +8530,7 @@ genJumpTab (iCode * ic) symbol *jtab; char *l; - D(emitcode (";", "genJumpTab")); + D(emitcode ("; genJumpTab","")); aopOp (IC_JTCOND (ic), ic, FALSE); /* get the condition into accumulator */ @@ -8477,7 +8564,7 @@ genCast (iCode * ic) operand *right = IC_RIGHT (ic); int size, offset; - D(emitcode(";", "genCast")); + D(emitcode("; genCast","")); /* if they are equivalent then do nothing */ if (operandsEqu (IC_RESULT (ic), IC_RIGHT (ic))) @@ -8548,8 +8635,6 @@ genCast (iCode * ic) /* pointer to generic pointer */ if (IS_GENPTR (ctype)) { - char *l = zero; - if (IS_PTR (type)) p_type = DCL_TYPE (type); else @@ -8574,32 +8659,19 @@ genCast (iCode * ic) offset++; } /* the last byte depending on type */ - switch (p_type) { - case IPOINTER: - case POINTER: - l = zero; - break; - case FPOINTER: - l = one; - break; - case CPOINTER: - l = "#0x02"; - break; - case GPOINTER: - l = "0x03"; - break; - case PPOINTER: // what the fck is this? - l = "#0x03"; - break; - - default: - /* this should never happen */ - werror (E_INTERNAL_ERROR, __FILE__, __LINE__, - "got unknown pointer type"); - exit (1); - } - aopPut (AOP (result), l, GPTRSIZE - 1); + int gpVal = pointerTypeToGPByte(p_type, NULL, NULL); + char gpValStr[10]; + + if (gpVal == -1) + { + // pointerTypeToGPByte will have bitched. + exit(1); + } + + sprintf(gpValStr, "#0x%d", gpVal); + aopPut (AOP (result), gpValStr, GPTRSIZE - 1); + } goto release; } @@ -8632,7 +8704,7 @@ genCast (iCode * ic) /* now depending on the sign of the source && destination */ size = AOP_SIZE (result) - AOP_SIZE (right); /* if unsigned or not an integral type */ - if (SPEC_USIGN (rtype) || !IS_SPEC (rtype) || AOP_TYPE(right)==AOP_CRY) + if (!IS_SPEC (rtype) || SPEC_USIGN (rtype) || AOP_TYPE(right)==AOP_CRY) { while (size--) aopPut (AOP (result), zero, offset++); @@ -8667,7 +8739,7 @@ genDjnz (iCode * ic, iCode * ifx) if (!ifx) return 0; - D(emitcode (";", "genDjnz")); + D(emitcode ("; genDjnz","")); /* if the if condition has a false label then we cannot save */ @@ -8747,7 +8819,7 @@ genReceive (iCode * ic) { int size = getSize (operandType (IC_RESULT (ic))); int offset = 0; - D(emitcode (";", "genReceive")); + D(emitcode ("; genReceive","")); if (ic->argreg == 1) { /* first parameter */ if (isOperandInFarSpace (IC_RESULT (ic)) && @@ -8830,10 +8902,15 @@ gen51Code (iCode * lic) ic->level, ic->block); _G.debugLine = 0; } - emitcode ("", ";\t%s:%d: %s", ic->filename, ic->lineno, - printCLine(ic->filename, ic->lineno)); + if (!options.noCcodeInAsm) { + emitcode ("", ";%s:%d: %s", ic->filename, ic->lineno, + printCLine(ic->filename, ic->lineno)); + } cln = ic->lineno; } + if (options.iCodeInAsm) { + emitcode("", ";ic:%d: %s", ic->key, printILine(ic)); + } /* if the result is marked as spilt and rematerializable or code for this has already been generated then