* src/SDCCast.c (decorateType): fix promotion of unary minus
[fw/sdcc] / support / regression / tests / onebyte.c
index a5fb515d3ffbebab1ae160bc0e1349476b2eb328..326f9ad03bb412db0157f8be1cc17ea4f7aac605 100644 (file)
@@ -121,3 +121,110 @@ testMod(void)
    r16 = 0;
    cL = -128; ucR =    5; r16 =  cL % ucR; ASSERT(r16 == -3);
 }
+
+void
+testOr(void)
+{
+  {attrL}           char  cL;
+  {attrL}  unsigned char ucL;
+  {attrR}           char  cR;
+  {attrR}  unsigned char ucR;
+  volatile         short r16, r16b;
+
+   cL = 0x00;  cR = 0x80; r16 =  cL |  cR; r16b =  cR |  cL; ASSERT(r16 == (short) 0xff80); ASSERT(r16b == (short) 0xff80);
+  ucL = 0x80;  cR = 0x00; 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
+testXor(void)
+{
+  {attrL}           char  cL;
+  {attrL}  unsigned char ucL;
+  {attrR}           char  cR;
+  {attrR}  unsigned char ucR;
+  volatile         short r16, r16b;
+
+   cL = 0x80;  cR = 0x80; r16 =  cL ^  cR; r16b =  cR ^  cL; ASSERT(r16 ==              0); ASSERT(r16b ==              0);
+   cL = 0x80;  cR = 0x00; r16 =  cL ^  cR; r16b =  cR ^  cL; ASSERT(r16 == (short) 0xff80); ASSERT(r16b == (short) 0xff80);
+
+  ucL = 0x80;  cR = 0x80; r16 = ucL ^  cR; r16b =  cR ^ ucL; ASSERT(r16 == (short) 0xff00); ASSERT(r16b == (short) 0xff00);
+  ucL = 0x80;  cR =    0; r16 = ucL ^  cR; r16b =  cR ^ ucL; ASSERT(r16 ==           0x80); ASSERT(r16b ==           0x80);
+  ucL =    0;  cR = 0x80; r16 = ucL ^  cR; r16b =  cR ^ ucL; ASSERT(r16 == (short) 0xff80); ASSERT(r16b == (short) 0xff80);
+
+  ucL = 0x80; ucR = 0x80; r16 = ucL ^ ucR; r16b = ucR ^ ucL; ASSERT(r16 ==      0); ASSERT(r16b ==      0);
+  ucL =    0; ucR = 0x80; r16 = ucL ^ ucR; r16b = ucR ^ ucL; ASSERT(r16 ==   0x80); ASSERT(r16b ==   0x80);
+}
+
+void
+testAnd(void)
+{
+  {attrL}           char  cL;
+  {attrL}  unsigned char ucL;
+  {attrR}           char  cR;
+  {attrR}  unsigned char ucR;
+  volatile         short r16, r16b;
+
+   cL = 0x80;  cR = 0x80; r16 =  cL &  cR; r16b =  cR &  cL; ASSERT(r16 == (short) 0xff80); ASSERT(r16b == (short) 0xff80);
+  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);
+}
+
+void
+testComp(void)
+{
+  {attrL}   signed char  c;
+  {attrR} unsigned char uc;
+
+   c = 0x80; /* -128 */
+  uc = 0x80; /* +128 */
+
+  ASSERT(!(c == uc));
+  ASSERT(  c != uc );
+  ASSERT(  c <  uc );
+  ASSERT(  c <= uc );
+  ASSERT(!(c >  uc));
+  ASSERT(!(c >= uc));
+}
+
+void
+testUMinus(void)
+{
+    signed char  {attrL} sc;
+  unsigned char  {attrL} uc;
+  unsigned int   {attrL} us;
+  unsigned long  {attrL} ul;
+
+  ASSERT (-(53ul) > 0);
+  ul = 53;
+  ASSERT (-ul > 0);
+
+  ASSERT (-(53u ) > 0);
+  us = 53;
+  ASSERT (-us > 0);
+
+  ASSERT (-( 250 ) == -250);
+  uc = 250;
+  ASSERT (-uc == -250);
+
+  ASSERT (-(-128 ) ==  128);
+  sc = -128;
+  ASSERT (-sc == 128);
+}