From 4b91acd603b69ca40e107133e7038446760cc036 Mon Sep 17 00:00:00 2001 From: bernhardheld Date: Tue, 23 Mar 2004 13:05:10 +0000 Subject: [PATCH] * src/SDCCast.c (resultTypePropagate, decorateType): avoid promotion to int for complement if possible * src/SDCCval.c (valComplement), * src/SDCCicode.c (operandOperation): fixed complement of literal * support/regression/tests/onebyte.c (testComplement): added git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3275 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- src/SDCCast.c | 2 ++ src/SDCCicode.c | 4 +++- src/SDCCval.c | 4 ++++ support/regression/tests/onebyte.c | 17 +++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/SDCCast.c b/src/SDCCast.c index b56020d2..b54208f8 100644 --- a/src/SDCCast.c +++ b/src/SDCCast.c @@ -2115,6 +2115,7 @@ resultTypePropagate (ast *tree, RESULT_TYPE resultType) case ':': case '|': case '^': + case '~': case '*': case '+': case '-': @@ -3334,6 +3335,7 @@ decorateType (ast * tree, RESULT_TYPE resultType) TETYPE (tree) = TTYPE (tree) = tree->opval.val->type; return tree; } + tree->left = addCast (tree->left, resultType, TRUE); LRVAL (tree) = 1; COPYTYPE (TTYPE (tree), TETYPE (tree), LTYPE (tree)); return tree; diff --git a/src/SDCCicode.c b/src/SDCCicode.c index 3364eecf..aec706a1 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -1311,7 +1311,9 @@ operandOperation (operand * left, operand * right, break; case '~': - retval = operandFromLit (~((TYPE_UDWORD) operandLitValue (left))); + retval = operandFromValue (valCastLiteral (type, + ~((TYPE_UDWORD) + operandLitValue (left)))); break; case '!': diff --git a/src/SDCCval.c b/src/SDCCval.c index b2f8fe0e..bbf475c1 100644 --- a/src/SDCCval.c +++ b/src/SDCCval.c @@ -1044,6 +1044,10 @@ valComplement (value * val) SPEC_CVAL (val->etype).v_uint = ~SPEC_CVAL (val->etype).v_uint; else SPEC_CVAL (val->etype).v_int = ~SPEC_CVAL (val->etype).v_int; + if (SPEC_NOUN(val->etype) == V_CHAR) + if ( SPEC_CVAL(val->etype).v_int < -128 + || SPEC_CVAL(val->etype).v_int > 127) + SPEC_NOUN(val->etype) = V_INT; } // ~(unsigned 3) now really is signed SPEC_USIGN(val->etype)=0; diff --git a/support/regression/tests/onebyte.c b/support/regression/tests/onebyte.c index 1dffcc0f..7f4e2fbb 100644 --- a/support/regression/tests/onebyte.c +++ b/support/regression/tests/onebyte.c @@ -169,3 +169,20 @@ testAnd(void) ucL = 0x80; cR = 0x80; r16 = ucL & cR; r16b = cR & ucL; ASSERT(r16 == 0x80); ASSERT(r16b == 0x80); ucL = 0x80; ucR = 0x80; r16 = ucL & ucR; r16b = ucR & ucL; ASSERT(r16 == 0x80); ASSERT(r16b == 0x80); } + +void +testComplement(void) +{ + {attrR} char c; + {attrR} unsigned char uc; + volatile short r16; + + c = 0x00; r16 = ~ c; ASSERT(r16 == (short) 0xffff); ASSERT( ~ c < 0); + uc = 0x00; r16 = ~uc; ASSERT(r16 == (short) 0xffff); ASSERT( ~uc < 0); + ASSERT(~ (char) 0x00 == (short) 0xffff); ASSERT(~ (char) 0x00 < 0); + ASSERT(~ (unsigned char) 0x00 == (short) 0xffff); ASSERT(~ (unsigned char) 0x00 < 0); + c = 0x80; r16 = ~ c; ASSERT(r16 == (short) 0x007f); ASSERT(~ c > 0); + uc = 0x80; r16 = ~uc; ASSERT(r16 == (short) 0xff7f); ASSERT(~uc < 0); + ASSERT(~ (char) 0x80 == (short) 0x007f); ASSERT(~ (char) 0x80 > 0); + ASSERT(~ (unsigned char) 0x80 == (short) 0xff7f); ASSERT(~ (unsigned char) 0x80 < 0); +} -- 2.30.2