* src/SDCCast.c (resultTypePropagate, decorateType): avoid promotion to int for compl...
authorbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 23 Mar 2004 13:05:10 +0000 (13:05 +0000)
committerbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 23 Mar 2004 13:05:10 +0000 (13:05 +0000)
* 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
src/SDCCicode.c
src/SDCCval.c
support/regression/tests/onebyte.c

index b56020d2119ddc9c11625601b01e9726647a055e..b54208f81f2f2ba893ce9d5d00ab1a48fa9cbc32 100644 (file)
@@ -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;
index 3364eecf87dede007a92f8104ad4bd76bb81f318..aec706a18c4a049623e80b54676c2d3f5cbb4d91 100644 (file)
@@ -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 '!':
index b2f8fe0e1b0cf4db8434243e7c9913409bb91067..bbf475c15c7c29d6cf192fb274b32a3ab40a12d1 100644 (file)
@@ -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;
index 1dffcc0feadff7739eb2cfd6106fedc6f3d30824..7f4e2fbbc368fde70dd8d7ca8e498b400c4e28b3 100644 (file)
@@ -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);
+}