* src/pic16/pcode.c (assignToSameBank): add force argument to ignore
[fw/sdcc] / src / mcs51 / gen.c
index 9ce6403ede17a2a7f1631b703a81a95e75d53b83..df242f3059f3e3b124d631fcd1c08c4ba9120be3 100644 (file)
@@ -2831,9 +2831,13 @@ static void genSend(set *sendSet)
         }
     }
 
-  if (bit_count)
+  if (options.useXstack || bit_count)
     {
       saveRegisters (setFirstItem (sendSet));
+    }
+
+  if (bit_count)
+    {
       emitcode ("mov", "bits,b");
     }
 
@@ -10011,7 +10015,13 @@ genNearPointerGet (operand * left,
         {
           // Aha, it is a pointer, just in disguise.
           rname = aopGet (left, 0, FALSE, FALSE);
-          if (*rname != '@')
+          if (strcmp (rname, "a") == 0)
+            {
+              // It's in pdata or on xstack
+              rname = AOP (left)->aopu.aop_ptr->name;
+              emitcode ("mov", "%s,a", rname);
+            }
+          else if (*rname != '@')
             {
               fprintf(stderr, "probable internal error: unexpected rname '%s' @ %s:%d\n",
                       rname, __FILE__, __LINE__);
@@ -10705,7 +10715,13 @@ genNearPointerSet (operand * right,
         {
           // Aha, it is a pointer, just in disguise.
           rname = aopGet (result, 0, FALSE, FALSE);
-          if (*rname != '@')
+          if (strcmp (rname, "a") == 0)
+            {
+              // It's in pdata or on xstack
+              rname = AOP (result)->aopu.aop_ptr->name;
+              emitcode ("mov", "%s,a", rname);
+            }
+          else if (*rname != '@')
             {
               fprintf(stderr, "probable internal error: unexpected rname @ %s:%d\n",
                       __FILE__, __LINE__);
@@ -11191,7 +11207,6 @@ genAddrOf (iCode * ic)
 
 release:
   freeAsmop (IC_RESULT (ic), NULL, ic, TRUE);
-
 }
 
 /*-----------------------------------------------------------------*/
@@ -11486,7 +11501,6 @@ genCast (iCode * ic)
   /* if the result is of type pointer */
   if (IS_PTR (ctype))
     {
-
       int p_type;
       sym_link *type = operandType (right);
       sym_link *etype = getSpec (type);