X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic16%2Fgenarith.c;h=1664b0cf493ff6f1edd8cc2c344f133ff98f7171;hb=5db7b152dddfeac2395417a253993f63e21e0fe5;hp=e8ada618971f403f027081a5860d4d16bcc3b1b0;hpb=2fd915c3bc6488cd960572406ba8580a90b28b78;p=fw%2Fsdcc diff --git a/src/pic16/genarith.c b/src/pic16/genarith.c index e8ada618..1664b0cf 100644 --- a/src/pic16/genarith.c +++ b/src/pic16/genarith.c @@ -113,6 +113,7 @@ const char *pic16_pCodeOpType(pCodeOp *pcop) case PO_STR: return "PO_STR"; case PO_LABEL: return "PO_LABEL"; case PO_WILD: return "PO_WILD"; + case PO_TWO_OPS: return "PO_TWO_OPS"; } } @@ -152,6 +153,7 @@ const char *pic16_pCodeOpSubType(pCodeOp *pcop) case PO_STR: return "PO_STR"; case PO_LABEL: return "PO_LABEL"; case PO_WILD: return "PO_WILD"; + case PO_TWO_OPS: return "PO_TWO_OPS"; } } @@ -654,7 +656,6 @@ static void genAddLit (iCode *ic, int lit) } } - } */ } @@ -716,30 +717,21 @@ static void genAddLit (iCode *ic, int lit) //pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),0,FALSE,FALSE)); emitMOVWF(result,0); while(--size) { - lit >>= 8; - if(lit & 0xff) { - if(clear_carry) { - /* The ls byte of the lit must've been zero - that - means we don't have to deal with carry */ - - pic16_emitpcode(POC_MOVLW, pic16_popGetLit(lit & 0xff)); - pic16_emitpcode(POC_ADDFW, pic16_popGet(AOP(left),offset)); - pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offset)); - - clear_carry = 0; - - } else { - pic16_emitpcode(POC_MOVLW, pic16_popGetLit(lit & 0xff)); - pic16_emitpcode(POC_ADDFWC, pic16_popGet(AOP(left),offset)); - pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offset)); - } - + pic16_emitpcode(POC_MOVLW, pic16_popGetLit(lit & 0xff)); + if (offset < AOP_SIZE(left)) { + pic16_emitpcode(clear_carry ? POC_ADDFW : POC_ADDFWC, pic16_popGet(AOP(left),offset)); + pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offset)); } else { - pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offset)); - pic16_mov2w(AOP(left),offset); - pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(result),offset)); + pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offset)); + if (!SPEC_USIGN(operandType(IC_LEFT(ic)))) { + /* sign-extend left (in result) */ + pic16_emitpcode (POC_BTFSC, pic16_newpCodeOpBit_simple(AOP(left),AOP_SIZE(left)-1,7)); + pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),offset)); + } + pic16_emitpcode(clear_carry ? POC_ADDWF : POC_ADDWFC, pic16_popGet(AOP(result),offset)); } + clear_carry = 0; offset++; } }