* src/SDCCicode.c (operandOperation): really fixed problem with bitops
[fw/sdcc] / src / SDCCicode.c
index a49f75ab00312c205194d688b995f54c5dfa1294..7eea91c05e319efb8672eaeb546a19939c3ceaeb 100644 (file)
@@ -1143,16 +1143,19 @@ operandOperation (operand * left, operand * right,
                               operandLitValue (right));
       break;
     case BITWISEAND:
-      retval = operandFromLit ((long)operandLitValue(left) & 
-                              (long)operandLitValue(right));
+      retval = operandFromValue (valCastLiteral (type,
+                                                 (unsigned long)operandLitValue(left) &
+                                                (unsigned long)operandLitValue(right)));
       break;
     case '|':
-      retval = operandFromLit ((long)operandLitValue (left) |
-                              (long)operandLitValue (right));
+      retval = operandFromValue (valCastLiteral (type,
+                                                 (unsigned long)operandLitValue(left) |
+                                                (unsigned long)operandLitValue(right)));
       break;
     case '^':
-      retval = operandFromLit ((long)operandLitValue (left) ^
-                              (long)operandLitValue (right));
+      retval = operandFromValue (valCastLiteral (type,
+                                                 (unsigned long)operandLitValue(left) ^
+                                                (unsigned long)operandLitValue(right)));
       break;
     case AND_OP:
       retval = operandFromLit (operandLitValue (left) &&
@@ -1164,7 +1167,7 @@ operandOperation (operand * left, operand * right,
       break;
     case RRC:
       {
-       long i = (long) operandLitValue (left);
+       unsigned long i = (unsigned long) operandLitValue (left);
 
        retval = operandFromLit ((i >> (getSize (operandType (left)) * 8 - 1)) |
                                 (i << 1));
@@ -1172,7 +1175,7 @@ operandOperation (operand * left, operand * right,
       break;
     case RLC:
       {
-       long i = (long) operandLitValue (left);
+       unsigned long i = (unsigned long) operandLitValue (left);
 
        retval = operandFromLit ((i << (getSize (operandType (left)) * 8 - 1)) |
                                 (i >> 1));
@@ -1184,7 +1187,7 @@ operandOperation (operand * left, operand * right,
       break;
 
     case '~':
-      retval = operandFromLit (~((long) operandLitValue (left)));
+      retval = operandFromLit (~((unsigned long) operandLitValue (left)));
       break;
 
     case '!':