* src/SDCCval.c (constVal): fixed bug 1305065
[fw/sdcc] / src / SDCCicode.c
index 26dbaab3401565922200bf8caf65b503b15a1509..932820e962c915a2d107ec34ffc7b1978f627d8e 100644 (file)
@@ -80,6 +80,9 @@ iCodeTable codeTable[] =
   {RRC, "rrc", picGenericOne, NULL},
   {RLC, "rlc", picGenericOne, NULL},
   {GETHBIT, "ghbit", picGenericOne, NULL},
+  {GETABIT, "gabit", picGenericOne, NULL},
+  {GETBYTE, "gbyte", picGenericOne, NULL},
+  {GETWORD, "gword", picGenericOne, NULL},
   {UNARYMINUS, "-", picGenericOne, NULL},
   {IPUSH, "push", picGenericOne, NULL},
   {IPOP, "pop", picGenericOne, NULL},
@@ -1389,6 +1392,23 @@ operandOperation (operand * left, operand * right,
                                  (i >> 1));
       }
       break;
+    case GETABIT:
+      retval = operandFromLit (((TYPE_UDWORD)operandLitValue(left) >>
+                                (TYPE_UDWORD)operandLitValue(right)) & 1);
+      break;
+    case GETBYTE:
+      retval = operandFromLit (((TYPE_UDWORD)operandLitValue(left) >>
+                                (TYPE_UDWORD)operandLitValue(right)) & 0xFF);
+      break;
+    case GETWORD:
+      retval = operandFromLit (((TYPE_UDWORD)operandLitValue(left) >>
+                                (TYPE_UDWORD)operandLitValue(right)) & 0xFFFF);
+      break;
+
+    case GETHBIT:
+      retval = operandFromLit (((TYPE_UDWORD)operandLitValue(left) >>
+                                ((getSize (let) * 8) - 1)) & 1);
+      break;
 
     case UNARYMINUS:
       retval = operandFromValue (valCastLiteral (type,
@@ -3110,7 +3130,7 @@ geniCodeLogicAndOr (ast *tree, int lvl)
 }
 
 /*-----------------------------------------------------------------*/
-/* geniCodeUnary - for a a generic unary operation                 */
+/* geniCodeUnary - for a generic unary operation                   */
 /*-----------------------------------------------------------------*/
 operand *
 geniCodeUnary (operand * op, int oper)
@@ -3122,6 +3142,19 @@ geniCodeUnary (operand * op, int oper)
   return IC_RESULT (ic);
 }
 
+/*-----------------------------------------------------------------*/
+/* geniCodeBinary - for a generic binary operation                 */
+/*-----------------------------------------------------------------*/
+operand *
+geniCodeBinary (operand * left, operand * right, int oper)
+{
+  iCode *ic = newiCode (oper, left, right);
+
+  IC_RESULT (ic) = newiTempOperand (operandType (left), 0);
+  ADDTOCHAIN (ic);
+  return IC_RESULT (ic);
+}
+
 /*-----------------------------------------------------------------*/
 /* geniCodeConditional - geniCode for '?' ':' operation            */
 /*-----------------------------------------------------------------*/
@@ -3426,7 +3459,6 @@ geniCodeReceive (value * args, operand * func)
   /* for all arguments that are passed in registers */
   while (args)
     {
-      int first = 1;
       if (IS_REGPARM (args->etype))
         {
           operand *opr = operandFromValue (args);
@@ -3458,9 +3490,8 @@ geniCodeReceive (value * args, operand * func)
 
           ic = newiCode (RECEIVE, func, NULL);
           ic->argreg = SPEC_ARGREG(args->etype);
-          if (first) {
+          if (ic->argreg == 1) {
               currFunc->recvSize = getSize (sym->type);
-              first = 0;
           }
           IC_RESULT (ic) = opr;
 
@@ -4234,6 +4265,16 @@ ast2iCode (ast * tree,int lvl)
         setOperandType (op, UCHARTYPE);
         return op;
       }
+    case GETABIT:
+    case GETBYTE:
+    case GETWORD:
+      {
+        operand *op = geniCodeBinary (geniCodeRValue (left, FALSE),
+                                      geniCodeRValue (right, FALSE),
+                                      tree->opval.op);
+        setOperandType (op, (tree->opval.op == GETWORD) ? UINTTYPE : UCHARTYPE);
+        return op;
+      }
     case AND_OP:
     case OR_OP:
       return geniCodeLogicAndOr (tree, lvl);