From de6743d71bc9d1e681e14c9bb874b7b21f2f12c0 Mon Sep 17 00:00:00 2001 From: tecodev Date: Tue, 31 May 2005 08:51:23 +0000 Subject: [PATCH] * src/pic16/{gen.c,genarith.c}: replaced sign-extension "CLRF, BTFSC , DECF/COMF" with side-effect-free "CLRF, BTFSC , SETF"; fixes "long>>9" git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3776 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 6 +++ src/pic16/gen.c | 10 ++--- src/pic16/genarith.c | 101 ++++--------------------------------------- 3 files changed, 19 insertions(+), 98 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5b59a009..9a152d62 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-05-31 Raphael Neider + + * src/pic16/{gen.c,genarith.c}: replaced sign-extension + "CLRF, BTFSC , DECF/COMF" with side-effect-free + "CLRF, BTFSC , SETF"; fixes "long>>9" + 2005-05-27 Maarten Brock * device/lib/_strncpy.c: fixed the fix diff --git a/src/pic16/gen.c b/src/pic16/gen.c index 5e31af41..ba47ce60 100644 --- a/src/pic16/gen.c +++ b/src/pic16/gen.c @@ -8695,7 +8695,7 @@ static void shiftR1Left2ResultSigned (operand *left, int offl, } else { pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offr)); pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),offr)); + pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),offr)); pic16_emitpcode(POC_BTFSS, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),6,0, PO_GPR_REGISTER)); pic16_emitpcode(POC_BCF, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offr,FALSE,FALSE),0,0, PO_GPR_REGISTER)); } @@ -8710,7 +8710,7 @@ static void shiftR1Left2ResultSigned (operand *left, int offl, } else { pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offr)); pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offl,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),offr)); + pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),offr)); } default: @@ -9888,7 +9888,7 @@ static void genrshTwo (operand *result,operand *left, if(sign) { pic16_emitpcode(POC_BTFSC,pic16_newpCodeOpBit(pic16_aopGet(AOP(left),LSB,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),MSB16)); + pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),MSB16)); } } @@ -10059,7 +10059,7 @@ static void genRightShiftLiteral (operand *left, pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),LSB)); if(sign) { pic16_emitpcode(POC_BTFSC,pic16_newpCodeOpBit(pic16_aopGet(AOP(left),lsize-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),LSB)); + pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),LSB)); } } else { @@ -13119,7 +13119,7 @@ static void genCast (iCode *ic) /* Save one instruction of casting char to int */ pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offset)); pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),offset)); + pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),offset)); } else { pic16_emitpcode(POC_CLRF,pic16_popCopyReg(&pic16_pc_wreg)); diff --git a/src/pic16/genarith.c b/src/pic16/genarith.c index 1a556baf..fe778852 100644 --- a/src/pic16/genarith.c +++ b/src/pic16/genarith.c @@ -1059,7 +1059,7 @@ void pic16_genPlus (iCode *ic) for(i=size; i< AOP_SIZE(result); i++) { pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),i)); pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),size-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_COMF, pic16_popGet(AOP(result),i)); + pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),i)); pic16_emitpcode(POC_MOVLW, pic16_popGet(AOP(left),i)); pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(result),i)); } @@ -1103,7 +1103,7 @@ void pic16_genPlus (iCode *ic) if (!SPEC_USIGN(getSpec(operandType(right)))) { // right operand is signed pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),AOP_SIZE(right)-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_COMF, pic16_popCopyReg (&pic16_pc_wreg)); + pic16_emitpcode(POC_SETF, pic16_popCopyReg (&pic16_pc_wreg)); } } @@ -1121,104 +1121,19 @@ void pic16_genPlus (iCode *ic) if (!SPEC_USIGN(getSpec(operandType(left)))) { // left operand is signed pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),AOP_SIZE(left)-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_COMF, pic16_popGet (AOP(result), i)); + pic16_emitpcode(POC_SETF, pic16_popGet (AOP(result), i)); } pic16_emitpcode (POC_ADDWFC, pic16_popGet (AOP(result), i)); } } // for i goto release; - -#if 0 - // add leftover bytes - if (SPEC_USIGN(getSpec(operandType(right)))) { - // right is unsigned - for(i=size; i< AOP_SIZE(result); i++) { - if (pic16_sameRegs(AOP(left), AOP(result))) - { - pic16_emitpcode(POC_CLRF, pic16_popCopyReg(&pic16_pc_wreg)); - pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(left),i)); - } else { // not same - pic16_emitpcode(POC_CLRF, pic16_popCopyReg(&pic16_pc_wreg)); - pic16_emitpcode(POC_ADDFWC, pic16_popGet(AOP(left),i)); - pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),i)); - } - } - } else { - // right is signed - for(i=size; i< AOP_SIZE(result); i++) { - if(size < AOP_SIZE(left)) { - pic16_emitpcode(POC_CLRF, pic16_popCopyReg(&pic16_pc_wreg)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),size-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_COMFW, pic16_popCopyReg(&pic16_pc_wreg)); - if (pic16_sameRegs(AOP(left), AOP(result))) - { - pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(left),i)); - } else { // not same - pic16_emitpcode(POC_ADDFWC, pic16_popGet(AOP(left),i)); - pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),i)); - } - } else { - pic16_emitpcode(POC_CLRF, pic16_popCopyReg(&pic16_pc_wreg)); - pic16_emitpcode(POC_ADDWFC, pic16_popGet(AOP(result), i)); - } - } - } - goto release; -#endif } } assert( 0 ); - // TODO: anything from here to before "release:" is probably obsolete and should be removed - // when the regression tests are stable - - if (AOP_SIZE(result) > AOP_SIZE(right)) { - int sign = !(SPEC_USIGN(getSpec(operandType(left))) | - SPEC_USIGN(getSpec(operandType(right))) ); - - - /* Need to extend result to higher bytes */ - size = AOP_SIZE(result) - AOP_SIZE(right) - 1; - - /* First grab the carry from the lower bytes */ - pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offset)); - pic16_emitpcode(POC_RLCF, pic16_popGet(AOP(result),offset)); - - - if(sign) { - /* Now this is really horrid. Gotta check the sign of the addends and propogate - * to the result */ - - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(left),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),offset)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(right),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),offset)); - - /* if chars or ints or being signed extended to longs: */ - if(size) { - pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0)); - pic16_emitpcode(POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offset,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0xff)); - } - } - - offset++; - while(size--) { - - if(sign) - pic16_emitpcode(POC_MOVWF, pic16_popGet(AOP(result),offset)); - else - pic16_emitpcode(POC_CLRF, pic16_popGet(AOP(result),offset)); - - offset++; - } - } - - - //adjustArithmeticResult(ic); - - release: + +release: pic16_freeAsmop(left,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); pic16_freeAsmop(right,NULL,ic,(RESULTONSTACK(ic) ? FALSE : TRUE)); pic16_freeAsmop(result,NULL,ic,TRUE); @@ -1339,7 +1254,7 @@ void pic16_addSign(operand *result, int offset, int sign) if(size == 1) { pic16_emitpcode(POC_CLRF,pic16_popGet(AOP(result),offset)); pic16_emitpcode(POC_BTFSC,pic16_newpCodeOpBit(pic16_aopGet(AOP(result),offset-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode(POC_DECF, pic16_popGet(AOP(result),offset)); + pic16_emitpcode(POC_SETF, pic16_popGet(AOP(result),offset)); } else { pic16_emitpcode(POC_MOVLW, pic16_popGetLit(0)); @@ -1644,7 +1559,7 @@ void pic16_genMinus (iCode *ic) if (!SPEC_USIGN(operandType(IC_RIGHT(ic)))) { // signed -- sign extend the right operand pic16_emitpcode (POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_RIGHT(ic)),AOP_SIZE(IC_RIGHT(ic))-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode (POC_COMF, pic16_popCopyReg (&pic16_pc_wreg)); + pic16_emitpcode (POC_SETF, pic16_popCopyReg (&pic16_pc_wreg)); } } if (pic16_sameRegs(AOP(IC_LEFT(ic)), AOP(IC_RESULT(ic)))) { @@ -1659,7 +1574,7 @@ void pic16_genMinus (iCode *ic) if (!SPEC_USIGN(operandType(IC_LEFT(ic)))) { // signed -- sign extend the left operand pic16_emitpcode (POC_BTFSC, pic16_newpCodeOpBit(pic16_aopGet(AOP(IC_LEFT(ic)),AOP_SIZE(IC_LEFT(ic))-1,FALSE,FALSE),7,0, PO_GPR_REGISTER)); - pic16_emitpcode (POC_COMF, pic16_popGet(AOP(IC_RESULT(ic)), offset)); // keep CARRY/#BORROW bit intact! + pic16_emitpcode (POC_SETF, pic16_popGet(AOP(IC_RESULT(ic)), offset)); // keep CARRY/#BORROW bit intact! } pic16_emitpcode(POC_SUBWFB_D1, pic16_popGet(AOP(IC_RESULT(ic)),offset)); } -- 2.47.2