X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic%2Fgenarith.c;h=78582d50197e4193f727bbd18dfc89354bcd94ea;hb=188f17e9237a15ec8227e50f679815d52da59921;hp=bdb8f8d437f3cd7d6960e87e1846d58294c7059f;hpb=25837611386183e136d41617166c3a81b52ce430;p=fw%2Fsdcc diff --git a/src/pic/genarith.c b/src/pic/genarith.c index bdb8f8d4..78582d50 100644 --- a/src/pic/genarith.c +++ b/src/pic/genarith.c @@ -523,6 +523,8 @@ static void genAddLit (iCode *ic, int lit) result = IC_RESULT(ic); same = pic14_sameRegs(AOP(left), AOP(result)); size = pic14_getDataSize(result); + if (size > pic14_getDataSize(left)) + size = pic14_getDataSize(left); if(same) { @@ -831,6 +833,11 @@ static void genAddLit (iCode *ic, int lit) } } } + + size = pic14_getDataSize(result); + if (size > pic14_getDataSize(left)) + size = pic14_getDataSize(left); + addSign(result, size, 0); } /*-----------------------------------------------------------------*/ @@ -1024,11 +1031,9 @@ void genPlus (iCode *ic) else { PIC_OPCODE poc = POC_ADDFW; - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) + if (op_isLitLike (IC_LEFT (ic))) poc = POC_ADDLW; - emitpcode(poc, popGetAddr(AOP(IC_LEFT(ic)),0)); + emitpcode(poc, popGetAddr(AOP(IC_LEFT(ic)),0,0)); if ( AOP_TYPE(IC_RESULT(ic)) != AOP_ACC) emitpcode(POC_MOVWF,popGet(AOP(IC_RESULT(ic)),0)); } @@ -1041,14 +1046,13 @@ void genPlus (iCode *ic) if(size){ if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic)))) { - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) { + if (op_isLitLike (IC_LEFT(ic))) + { while(size--){ emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); emitSKPNC; emitpcode(POC_INCFSZW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitpcode(POC_ADDLW, popGetAddr(AOP(IC_LEFT(ic)),offset)); + emitpcode(POC_ADDLW, popGetAddr(AOP(IC_LEFT(ic)),offset,0)); emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); offset++; } @@ -1063,13 +1067,11 @@ void genPlus (iCode *ic) } } else { PIC_OPCODE poc = POC_MOVFW; - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) + if (op_isLitLike (IC_LEFT(ic))) poc = POC_MOVLW; while(size--){ if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - emitpcode(poc, popGetAddr(AOP(IC_LEFT(ic)),offset)); + emitpcode(poc, popGetAddr(AOP(IC_LEFT(ic)),offset,0)); emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); } emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); @@ -1094,15 +1096,15 @@ void genPlus (iCode *ic) if (AOP_SIZE(IC_LEFT(ic)) > AOP_SIZE(IC_RIGHT(ic))) { int leftsize = AOP_SIZE(IC_LEFT(ic)) - AOP_SIZE(IC_RIGHT(ic)); PIC_OPCODE poc = POC_MOVFW; - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) + if (op_isLitLike (IC_LEFT(ic))) poc = POC_MOVLW; while(leftsize-- > 0) { - emitpcode(poc, popGetAddr(AOP(IC_LEFT(ic)),offset)); - emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + emitpcode(poc, popGetAddr(AOP(IC_LEFT(ic)),offset,0)); emitSKPNC; - emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset)); + emitpcode(POC_ADDLW, popGetLit(0x01)); + emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); + //emitSKPNC; + //emitpcode(POC_INCF, popGet(AOP(IC_RESULT(ic)),offset)); /* INCF does not update Carry! */ offset++; if (size) size--; @@ -1281,8 +1283,7 @@ void addSign(operand *result, int offset, int sign) emitpcode(POC_BTFSC, newpCodeOpBit(aopGet(AOP(result),offset-1,FALSE,FALSE),7,0)); emitpcode(POC_MOVLW, popGetLit(0xff)); while(size--) - emitpcode(POC_MOVWF, popGet(AOP(result),size)); - + emitpcode(POC_MOVWF, popGet(AOP(result),offset+size)); } } else while(size--) @@ -1616,28 +1617,23 @@ void genMinus (iCode *ic) if(size){ if (pic14_sameRegs(AOP(IC_RIGHT(ic)), AOP(IC_RESULT(ic)))) { int lit = 0; - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) { + if (op_isLitLike (IC_LEFT(ic))) lit = 1; - } while(size--){ emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset)); emitSKPC; emitpcode(POC_INCFW, popGet(AOP(IC_RIGHT(ic)),offset)); - emitpcode(lit?POC_SUBLW:POC_SUBFW, popGetAddr(AOP(IC_LEFT(ic)),offset)); + emitpcode(lit?POC_SUBLW:POC_SUBFW, popGetAddr(AOP(IC_LEFT(ic)),offset,0)); emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); offset++; } } else { PIC_OPCODE poc = POC_MOVFW; - if ((AOP_TYPE(IC_LEFT(ic)) == AOP_PCODE) && ( - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_LITERAL) || - (AOP(IC_LEFT(ic))->aopu.pcop->type == PO_IMMEDIATE))) + if (op_isLitLike (IC_LEFT(ic))) poc = POC_MOVLW; while(size--){ if (!pic14_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic))) ) { - emitpcode(poc, popGetAddr(AOP(IC_LEFT(ic)),offset)); + emitpcode(poc, popGetAddr(AOP(IC_LEFT(ic)),offset,0)); emitpcode(POC_MOVWF, popGet(AOP(IC_RESULT(ic)),offset)); } emitpcode(POC_MOVFW, popGet(AOP(IC_RIGHT(ic)),offset));