* Small Device C Compiler 2.7.0 released
[fw/sdcc] / src / SDCCicode.c
index 9136a4cbee5684c6113adebe30121fe38fed1e61..04a3e055b2cd7c981cd9212a7be62038bdf25cf2 100644 (file)
@@ -335,10 +335,10 @@ PRINTFUNC (picJumpTable)
   dbuf_append_char (dbuf, '\t');
   dbuf_printf (dbuf, "%s\t", s);
   dbuf_printOperand (IC_JTCOND (ic), dbuf);
-  dbuf_append_char (dbuf, '\n');
   for (sym = setFirstItem (IC_JTLABELS (ic)); sym;
        sym = setNextItem (IC_JTLABELS (ic)))
-    dbuf_printf (dbuf, "\t\t\t%s\n", sym->name);
+    dbuf_printf (dbuf, "; %s", sym->name);
+  dbuf_append_char (dbuf, '\n');
 }
 
 PRINTFUNC (picGeneric)
@@ -429,9 +429,10 @@ PRINTFUNC (picIfx)
     dbuf_printf (dbuf, " == 0 goto %s($%d)\n", IC_FALSE (ic)->name, IC_FALSE (ic)->key);
   else
     {
-      dbuf_printf (dbuf, " != 0 goto %s($%d)\n", IC_TRUE (ic)->name, IC_TRUE (ic)->key);
+      dbuf_printf (dbuf, " != 0 goto %s($%d)", IC_TRUE (ic)->name, IC_TRUE (ic)->key);
       if (IC_FALSE (ic))
-        dbuf_printf (dbuf, "\tzzgoto %s\n", IC_FALSE (ic)->name);
+        dbuf_printf (dbuf, "; zzgoto %s\n", IC_FALSE (ic)->name);
+      dbuf_append_char (dbuf, '\n');
     }
 }
 
@@ -528,6 +529,8 @@ printiCChain (iCode * icChain, FILE * of)
           dbuf_init(&dbuf, 1024);
           icTab->iCodePrint (&dbuf, loop, icTab->printName);
           dbuf_write_and_destroy (&dbuf, of);
+          ////
+          fflush(of);
         }
     }
 }
@@ -3238,7 +3241,9 @@ geniCodeAssign (operand * left, operand * right, int nosupdate, int strictLval)
     ic->supportRtn = 1;
 
   ic->nosupdate = nosupdate;
-  return left;
+  /* left could be a pointer assignment,
+     return the properly casted right instead */
+  return right;
 }
 
 /*-----------------------------------------------------------------*/
@@ -4237,17 +4242,33 @@ ast2iCode (ast * tree,int lvl)
     case GETHBIT:
       {
         operand *op = geniCodeUnary (geniCodeRValue (left, FALSE), tree->opval.op);
-        setOperandType (op, UCHARTYPE);
+        if (!IS_BIT (operandType (op)))
+          setOperandType (op, UCHARTYPE);
         return op;
       }
     case GETABIT:
+      {
+        operand *op = geniCodeBinary (geniCodeRValue (left, FALSE),
+                                      geniCodeRValue (right, FALSE),
+                                      tree->opval.op);
+        if (!IS_BIT (operandType (op)))
+          setOperandType (op, UCHARTYPE);
+        return op;
+      }
     case GETBYTE:
+      {
+        operand *op = geniCodeBinary (geniCodeRValue (left, FALSE),
+                                      geniCodeRValue (right, FALSE),
+                                      tree->opval.op);
+        setOperandType (op, UCHARTYPE);
+        return op;
+      }
     case GETWORD:
       {
         operand *op = geniCodeBinary (geniCodeRValue (left, FALSE),
                                       geniCodeRValue (right, FALSE),
                                       tree->opval.op);
-        setOperandType (op, (tree->opval.op == GETWORD) ? UINTTYPE : UCHARTYPE);
+        setOperandType (op, UINTTYPE);
         return op;
       }
     case AND_OP:
@@ -4261,7 +4282,7 @@ ast2iCode (ast * tree,int lvl)
     case NE_OP:
       /* different compilers (even different gccs) evaluate
          the two calls in a different order. to get the same
-         result on all machines we've to specify a clear sequence.
+         result on all machines we have to specify a clear sequence.
       return geniCodeLogic (geniCodeRValue (left, FALSE),
                             geniCodeRValue (right, FALSE),
                             tree->opval.op);
@@ -4290,8 +4311,7 @@ ast2iCode (ast * tree,int lvl)
         else
           right = geniCodeRValue (right, FALSE);
 
-        geniCodeAssign (left, right, 0, 1);
-        return right;
+        return geniCodeAssign (left, right, 0, 1);
       }
     case MUL_ASSIGN:
       return