* 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
case ':':
case '|':
case '^':
+ case '~':
case '*':
case '+':
case '-':
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;
break;
case '~':
- retval = operandFromLit (~((TYPE_UDWORD) operandLitValue (left)));
+ retval = operandFromValue (valCastLiteral (type,
+ ~((TYPE_UDWORD)
+ operandLitValue (left))));
break;
case '!':
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;
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);
+}