* src/z80/peeph-z80.def: removed some peephole rules that don't
authorepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 20 Apr 2004 05:16:13 +0000 (05:16 +0000)
committerepetrich <epetrich@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Tue, 20 Apr 2004 05:16:13 +0000 (05:16 +0000)
work with multibyte arithmetic (fixed bug #937126)
* src/mcs51/peeph.def: fixed peephole rules 150-158 to apply only
to registers and not global variables
* src/SDCCicode.c (geniCodeAssign, ast2iCode, geniCodePostInc,
geniCodePreInc, geniCodePostDec, geniCodePreDec,
geniCodeLogicAndOr, geniCodeConditional): enforce strict lvalue
checking for assignments not internally generated (fixed bug #931895)
* src/SDCC.y (postfix_expr): ignore typedefs when looking for a
structure member (fixed bug #930072)

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3293 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/SDCC.y
src/SDCCicode.c
src/mcs51/peeph.def
src/z80/peeph-z80.def

index 0baf823c417e4c69b545caa2d679fd2804256226..c2712504ce583975eea98713b9029ade3ff1cc46 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2004-04-20 Erik Petrich <epetrich AT ivorytower.norman.ok.us>
+
+       * src/z80/peeph-z80.def: removed some peephole rules that don't
+       work with multibyte arithmetic (fixed bug #937126)
+       * src/mcs51/peeph.def: fixed peephole rules 150-158 to apply only
+       to registers and not global variables
+       * src/SDCCicode.c (geniCodeAssign, ast2iCode, geniCodePostInc,
+       geniCodePreInc, geniCodePostDec, geniCodePreDec,
+       geniCodeLogicAndOr, geniCodeConditional): enforce strict lvalue
+       checking for assignments not internally generated (fixed bug #931895)
+       * src/SDCC.y (postfix_expr): ignore typedefs when looking for a
+       structure member (fixed bug #930072)
+
 2004-04-19 Erik Petrich <epetrich AT ivorytower.norman.ok.us>
 
        * src/SDCCmain.c (linkEdit),
index 475cb5ebbad270cfbca00ed9e9a6369d931e8d97..442e17e5ae1e926742ca7421c33dc72dac4d828a 100644 (file)
@@ -256,18 +256,20 @@ postfix_expr
           {       
            $$ = newNode  (CALL,$1,$3) ; $$->left->funcName = 1;
          }
-   | postfix_expr '.' identifier       
+   | postfix_expr '.' { ignoreTypedefType = 1; } identifier       
                      {    
-                       $3 = newSymbol($3->name,NestLevel);
-                       $3->implicit = 1;
-                       $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst_VALUE(symbolVal($3)));
-/*                     $$ = newNode('.',$1,newAst(EX_VALUE,symbolVal($3))) ;                   */
+                       ignoreTypedefType = 0;
+                       $4 = newSymbol($4->name,NestLevel);
+                       $4->implicit = 1;
+                       $$ = newNode(PTR_OP,newNode('&',$1,NULL),newAst_VALUE(symbolVal($4)));
+/*                     $$ = newNode('.',$1,newAst(EX_VALUE,symbolVal($4))) ;                   */
                      }
-   | postfix_expr PTR_OP identifier    
+   | postfix_expr PTR_OP { ignoreTypedefType = 1; } identifier    
                       { 
-                       $3 = newSymbol($3->name,NestLevel);
-                       $3->implicit = 1;                       
-                       $$ = newNode(PTR_OP,$1,newAst_VALUE(symbolVal($3)));
+                       ignoreTypedefType = 0;
+                       $4 = newSymbol($4->name,NestLevel);
+                       $4->implicit = 1;                       
+                       $$ = newNode(PTR_OP,$1,newAst_VALUE(symbolVal($4)));
                      }
    | postfix_expr INC_OP   
                       {        $$ = newNode(INC_OP,$1,NULL);}
index ae54a48a2afbcdf0dd811513de1fd0c231f349ff..7e3321fce9c01432d6ff0f31eb91a4c99a112cbd 100644 (file)
@@ -45,7 +45,7 @@ symbol *entryLabel;           /* function entry  label */
 
 /*-----------------------------------------------------------------*/
 /* forward definition of some functions */
-operand *geniCodeAssign (operand *, operand *, int);
+operand *geniCodeAssign (operand *, operand *, int, int);
 static operand *geniCodeArray (operand *, operand *,int);
 static operand *geniCodeArray2Ptr (operand *);
 operand *geniCodeRValue (operand *, bool);
@@ -2469,7 +2469,7 @@ geniCodePostInc (operand * op)
   if (IS_ITEMP (rv))
     OP_SYMBOL(rv)->noSpilLoc = 1;
 
-  geniCodeAssign (rOp, rv, 0);
+  geniCodeAssign (rOp, rv, 0, 0);
 
   size = (IS_PTR (rvtype) ? getSize (rvtype->next) : 1);
   if (IS_FLOAT (rvtype))
@@ -2480,7 +2480,7 @@ geniCodePostInc (operand * op)
   IC_RESULT (ic) = result = newiTempOperand (rvtype, 0);
   ADDTOCHAIN (ic);
 
-  geniCodeAssign (op, result, 0);
+  geniCodeAssign (op, result, 0, 0);
 
   return rOp;
 
@@ -2516,7 +2516,7 @@ geniCodePreInc (operand * op, bool lvalue)
   IC_RESULT (ic) = result = newiTempOperand (roptype, 0);
   ADDTOCHAIN (ic);
 
-  (void) geniCodeAssign (op, result, 0);
+  (void) geniCodeAssign (op, result, 0, 0);
   if (lvalue || IS_TRUE_SYMOP (op))
     return op;
   else
@@ -2552,7 +2552,7 @@ geniCodePostDec (operand * op)
   if (IS_ITEMP (rv))
     OP_SYMBOL(rv)->noSpilLoc = 1;
 
-  geniCodeAssign (rOp, rv, 0);
+  geniCodeAssign (rOp, rv, 0, 0);
 
   size = (IS_PTR (rvtype) ? getSize (rvtype->next) : 1);
   if (IS_FLOAT (rvtype))
@@ -2563,7 +2563,7 @@ geniCodePostDec (operand * op)
   IC_RESULT (ic) = result = newiTempOperand (rvtype, 0);
   ADDTOCHAIN (ic);
 
-  geniCodeAssign (op, result, 0);
+  geniCodeAssign (op, result, 0, 0);
 
   return rOp;
 
@@ -2599,7 +2599,7 @@ geniCodePreDec (operand * op, bool lvalue)
   IC_RESULT (ic) = result = newiTempOperand (roptype, 0);
   ADDTOCHAIN (ic);
 
-  (void) geniCodeAssign (op, result, 0);
+  (void) geniCodeAssign (op, result, 0, 0);
   if (lvalue || IS_TRUE_SYMOP (op))
     return op;
   else
@@ -2950,12 +2950,12 @@ geniCodeLogicAndOr (ast *tree, int lvl)
   result = newiTempOperand (newCharLink(), 1);
   
   geniCodeLabel (falseLabel);
-  geniCodeAssign (result, operandFromLit (0), 0);
+  geniCodeAssign (result, operandFromLit (0), 0, 0);
   /* generate an unconditional goto */
   geniCodeGoto (exitLabel);
 
   geniCodeLabel (trueLabel);
-  geniCodeAssign (result, operandFromLit (1), 0);
+  geniCodeAssign (result, operandFromLit (1), 0, 0);
 
   geniCodeLabel (exitLabel);
 
@@ -2995,7 +2995,7 @@ geniCodeConditional (ast * tree,int lvl)
 
   /* move the value to a new Operand */
   result = newiTempOperand (tree->right->ftype, 0);
-  geniCodeAssign (result, geniCodeRValue (true, FALSE), 0);
+  geniCodeAssign (result, geniCodeRValue (true, FALSE), 0, 0);
 
   /* generate an unconditional goto */
   geniCodeGoto (exitLabel);
@@ -3004,7 +3004,7 @@ geniCodeConditional (ast * tree,int lvl)
   geniCodeLabel (falseLabel);
 
   false = ast2iCode (tree->right->right,lvl+1);
-  geniCodeAssign (result, geniCodeRValue (false, FALSE), 0);
+  geniCodeAssign (result, geniCodeRValue (false, FALSE), 0, 0);
 
   /* create the exit label */
   geniCodeLabel (exitLabel);
@@ -3016,13 +3016,13 @@ geniCodeConditional (ast * tree,int lvl)
 /* geniCodeAssign - generate code for assignment                   */
 /*-----------------------------------------------------------------*/
 operand *
-geniCodeAssign (operand * left, operand * right, int nosupdate)
+geniCodeAssign (operand * left, operand * right, int nosupdate, int strictLval)
 {
   iCode *ic;
   sym_link *ltype = operandType (left);
   sym_link *rtype = operandType (right);
 
-  if (!left->isaddr && !IS_ITEMP (left))
+  if (!left->isaddr && (!IS_ITEMP (left) || strictLval))
     {
       werror (E_LVALUE_REQUIRED, "assignment");
       return left;
@@ -3200,7 +3200,7 @@ geniCodeParms (ast * parms, value *argVals, int *stack,
          operand *top = operandFromSymbol (argVals->sym);
          /* clear useDef and other bitVectors */
          OP_USES(top)=OP_DEFS(top)=OP_SYMBOL(top)->clashes = NULL;
-         geniCodeAssign (top, pval, 1);
+         geniCodeAssign (top, pval, 1, 0);
        }
       else
        {
@@ -4014,7 +4014,7 @@ ast2iCode (ast * tree,int lvl)
        else
          right = geniCodeRValue (right, FALSE);
 
-       geniCodeAssign (left, right, 0);
+       geniCodeAssign (left, right, 0, 1);
        return right;
       }
     case MUL_ASSIGN:
@@ -4022,8 +4022,9 @@ ast2iCode (ast * tree,int lvl)
        geniCodeAssign (left,
                geniCodeMultiply (geniCodeRValue (operandFromOperand (left),
                                                  FALSE),
-                                 geniCodeRValue (right, FALSE), FALSE),
-                                 getResultTypeFromType (tree->ftype));
+                                 geniCodeRValue (right, FALSE), 
+                                 getResultTypeFromType (tree->ftype)),
+                       0, 1);
 
     case DIV_ASSIGN:
       return
@@ -4032,7 +4033,7 @@ ast2iCode (ast * tree,int lvl)
                                                  FALSE),
                                  geniCodeRValue (right, FALSE),
                                  getResultTypeFromType (tree->ftype)),
-                       0);
+                       0, 1);
     case MOD_ASSIGN:
       return
        geniCodeAssign (left,
@@ -4040,7 +4041,7 @@ ast2iCode (ast * tree,int lvl)
                                                  FALSE),
                                  geniCodeRValue (right, FALSE),
                                  getResultTypeFromType (tree->ftype)),
-                       0);
+                       0, 1);
     case ADD_ASSIGN:
       {
        sym_link *rtype = operandType (right);
@@ -4058,7 +4059,7 @@ ast2iCode (ast * tree,int lvl)
                                  right,
                                  getResultTypeFromType (tree->ftype),
                                  lvl),
-                              0);
+                              0, 1);
       }
     case SUB_ASSIGN:
       {
@@ -4079,7 +4080,7 @@ ast2iCode (ast * tree,int lvl)
                                                  FALSE),
                                  right,
                                  getResultTypeFromType (tree->ftype)),
-                         0);
+                         0, 1);
       }
     case LEFT_ASSIGN:
       return
@@ -4088,13 +4089,13 @@ ast2iCode (ast * tree,int lvl)
                                                   ,FALSE),
                                   geniCodeRValue (right, FALSE),
                                   getResultTypeFromType (tree->ftype)),
-                       0);
+                       0, 1);
     case RIGHT_ASSIGN:
       return
        geniCodeAssign (left,
               geniCodeRightShift (geniCodeRValue (operandFromOperand (left)
                                                   ,FALSE),
-                                  geniCodeRValue (right, FALSE)), 0);
+                                  geniCodeRValue (right, FALSE)), 0, 1);
     case AND_ASSIGN:
       return
        geniCodeAssign (left,
@@ -4102,7 +4103,7 @@ ast2iCode (ast * tree,int lvl)
                                                  FALSE),
                                  geniCodeRValue (right, FALSE),
                                  BITWISEAND,
-                                 operandType (left)), 0);
+                                 operandType (left)), 0, 1);
     case XOR_ASSIGN:
       return
        geniCodeAssign (left,
@@ -4110,7 +4111,7 @@ ast2iCode (ast * tree,int lvl)
                                                  FALSE),
                                  geniCodeRValue (right, FALSE),
                                  '^',
-                                 operandType (left)), 0);
+                                 operandType (left)), 0, 1);
     case OR_ASSIGN:
       return
        geniCodeAssign (left,
@@ -4118,7 +4119,7 @@ ast2iCode (ast * tree,int lvl)
                                                   ,FALSE),
                                   geniCodeRValue (right, FALSE),
                                   '|',
-                                  operandType (left)), 0);
+                                  operandType (left)), 0, 1);
     case ',':
       return geniCodeRValue (right, FALSE);
 
index a4117ac1eb399354d685588ed23c365e2851dd49..b7005720f5ed20c33c9f3f1b45129bb6dd886d3c 100644 (file)
@@ -676,8 +676,8 @@ replace {
 }
 
 replace {
-        mov     %1,dpl
-        mov     dpl,%1
+        mov     r%1,dpl
+        mov     dpl,r%1
 %9:
         ret
 } by {
@@ -687,10 +687,10 @@ replace {
 }
 
 replace {
-        mov     %1,dpl
-        mov     %2,dph
-        mov     dpl,%1
-        mov     dph,%2
+        mov     r%1,dpl
+        mov     r%2,dph
+        mov     dpl,r%1
+        mov     dph,r%2
 %9:
         ret
 } by {
@@ -700,9 +700,9 @@ replace {
 }
 
 replace {
-        mov     %1,dpl
-        mov     %2,dph
-        mov     dpl,%1
+        mov     r%1,dpl
+        mov     r%2,dph
+        mov     dpl,r%1
 %9:
         ret
 } by {
@@ -712,12 +712,12 @@ replace {
 }
 
 replace {
-        mov     %1,dpl
-        mov     %2,dph
-        mov     %3,b
-        mov     dpl,%1
-        mov     dph,%2
-        mov     b,%3
+        mov     r%1,dpl
+        mov     r%2,dph
+        mov     r%3,b
+        mov     dpl,r%1
+        mov     dph,r%2
+        mov     b,r%3
 %9:
         ret
 } by {
@@ -727,10 +727,10 @@ replace {
 }
 
 replace {
-        mov     %1,dpl
-        mov     %2,dph
-        mov     %3,b
-        mov     dpl,%1
+        mov     r%1,dpl
+        mov     r%2,dph
+        mov     r%3,b
+        mov     dpl,r%1
 %9:
         ret
 } by {
@@ -740,11 +740,11 @@ replace {
 }
 
 replace {
-        mov     %1,dpl
-        mov     %2,dph
-        mov     %3,b
-        mov     dpl,%1
-        mov     dph,%2
+        mov     r%1,dpl
+        mov     r%2,dph
+        mov     r%3,b
+        mov     dpl,r%1
+        mov     dph,r%2
 %9:
         ret
 } by {
@@ -754,14 +754,14 @@ replace {
 }
 
 replace {
-        mov     %1,dpl
-        mov     %2,dph
-        mov     %3,b
-        mov     %4,a
-        mov     dpl,%1
-        mov     dph,%2
-        mov     b,%3
-        mov     a,%4
+        mov     r%1,dpl
+        mov     r%2,dph
+        mov     r%3,b
+        mov     r%4,a
+        mov     dpl,r%1
+        mov     dph,r%2
+        mov     b,r%3
+        mov     a,r%4
 %9:
         ret
 } by {
@@ -771,12 +771,12 @@ replace {
 }
 
 replace {
-        mov     %1,dpl
-        mov     %2,dph
-        mov     %3,b
-        mov     %4,a
-        mov     dpl,%1
-        mov     dph,%2
+        mov     r%1,dpl
+        mov     r%2,dph
+        mov     r%3,b
+        mov     r%4,a
+        mov     dpl,r%1
+        mov     dph,r%2
 %9:
         ret
 } by {
@@ -786,11 +786,11 @@ replace {
 }
 
 replace {
-        mov     %1,dpl
-        mov     %2,dph
-        mov     %3,b
-        mov     %4,a
-        mov     dpl,%1
+        mov     r%1,dpl
+        mov     r%2,dph
+        mov     r%3,b
+        mov     r%4,a
+        mov     dpl,r%1
 %9:
         ret
 } by {
index 09d8e160bf9de11df6b80cad7aec0789b4be567d..948531d9b19fbd006dddd7359bd306a08ccedf71 100644 (file)
@@ -55,28 +55,6 @@ replace restart {
        ;       z80 removed redundant pop/push
        ld      %1,%2
 }
-;
-;replace restart {
-       ld      a,%1
-       add     a,#0x01
-       ld      l,a
-} by {
-       ;       z80 improved usage of 'inc'
-       ld      l,%1
-       inc     l
-       ld      a,l
-}
-
-replace restart {
-       ld      a,%1
-       add     a,#0xFF
-       ld      l,a
-} by {
-       ;       z80 improved usage of 'dec'
-       ld      l,%1
-       dec     l
-       ld      a,l
-}
 
 replace restart {
        ld      l,a
@@ -123,23 +101,6 @@ replace restart {
        ld      c,a
 }
 
-; I don't think this works. neg does a unary minus of A, not HL  -- EEP
-;
-;replace {
-;      ld      a,c
-;      sub     a,%1
-;      ld      l,a
-;      ld      a,b
-;      sbc     a,%2
-;      ld      h,a
-;} by {
-;      ;       z80/z180 peephole byte pointer subtraction
-;      xor     a
-;      ld      h,%1
-;      ld      l,%2
-;      sbc     hl,bc
-;      neg
-;}
 
 replace {
 %1: