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
+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),
2004-04-19 Erik Petrich <epetrich AT ivorytower.norman.ok.us>
* src/SDCCmain.c (linkEdit),
{
$$ = newNode (CALL,$1,$3) ; $$->left->funcName = 1;
}
{
$$ = 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);}
}
| postfix_expr INC_OP
{ $$ = newNode(INC_OP,$1,NULL);}
/*-----------------------------------------------------------------*/
/* forward definition of some functions */
/*-----------------------------------------------------------------*/
/* 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);
static operand *geniCodeArray (operand *, operand *,int);
static operand *geniCodeArray2Ptr (operand *);
operand *geniCodeRValue (operand *, bool);
if (IS_ITEMP (rv))
OP_SYMBOL(rv)->noSpilLoc = 1;
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))
size = (IS_PTR (rvtype) ? getSize (rvtype->next) : 1);
if (IS_FLOAT (rvtype))
IC_RESULT (ic) = result = newiTempOperand (rvtype, 0);
ADDTOCHAIN (ic);
IC_RESULT (ic) = result = newiTempOperand (rvtype, 0);
ADDTOCHAIN (ic);
- geniCodeAssign (op, result, 0);
+ geniCodeAssign (op, result, 0, 0);
IC_RESULT (ic) = result = newiTempOperand (roptype, 0);
ADDTOCHAIN (ic);
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
if (lvalue || IS_TRUE_SYMOP (op))
return op;
else
if (IS_ITEMP (rv))
OP_SYMBOL(rv)->noSpilLoc = 1;
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))
size = (IS_PTR (rvtype) ? getSize (rvtype->next) : 1);
if (IS_FLOAT (rvtype))
IC_RESULT (ic) = result = newiTempOperand (rvtype, 0);
ADDTOCHAIN (ic);
IC_RESULT (ic) = result = newiTempOperand (rvtype, 0);
ADDTOCHAIN (ic);
- geniCodeAssign (op, result, 0);
+ geniCodeAssign (op, result, 0, 0);
IC_RESULT (ic) = result = newiTempOperand (roptype, 0);
ADDTOCHAIN (ic);
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
if (lvalue || IS_TRUE_SYMOP (op))
return op;
else
result = newiTempOperand (newCharLink(), 1);
geniCodeLabel (falseLabel);
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);
/* generate an unconditional goto */
geniCodeGoto (exitLabel);
geniCodeLabel (trueLabel);
- geniCodeAssign (result, operandFromLit (1), 0);
+ geniCodeAssign (result, operandFromLit (1), 0, 0);
geniCodeLabel (exitLabel);
geniCodeLabel (exitLabel);
/* move the value to a new Operand */
result = newiTempOperand (tree->right->ftype, 0);
/* 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);
/* generate an unconditional goto */
geniCodeGoto (exitLabel);
geniCodeLabel (falseLabel);
false = ast2iCode (tree->right->right,lvl+1);
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);
/* create the exit label */
geniCodeLabel (exitLabel);
/* geniCodeAssign - generate code for assignment */
/*-----------------------------------------------------------------*/
operand *
/* 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);
{
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;
{
werror (E_LVALUE_REQUIRED, "assignment");
return left;
operand *top = operandFromSymbol (argVals->sym);
/* clear useDef and other bitVectors */
OP_USES(top)=OP_DEFS(top)=OP_SYMBOL(top)->clashes = NULL;
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
right = geniCodeRValue (right, FALSE);
else
right = geniCodeRValue (right, FALSE);
- geniCodeAssign (left, right, 0);
+ geniCodeAssign (left, right, 0, 1);
return right;
}
case MUL_ASSIGN:
return right;
}
case MUL_ASSIGN:
geniCodeAssign (left,
geniCodeMultiply (geniCodeRValue (operandFromOperand (left),
FALSE),
geniCodeAssign (left,
geniCodeMultiply (geniCodeRValue (operandFromOperand (left),
FALSE),
- geniCodeRValue (right, FALSE), FALSE),
- getResultTypeFromType (tree->ftype));
+ geniCodeRValue (right, FALSE),
+ getResultTypeFromType (tree->ftype)),
+ 0, 1);
FALSE),
geniCodeRValue (right, FALSE),
getResultTypeFromType (tree->ftype)),
FALSE),
geniCodeRValue (right, FALSE),
getResultTypeFromType (tree->ftype)),
case MOD_ASSIGN:
return
geniCodeAssign (left,
case MOD_ASSIGN:
return
geniCodeAssign (left,
FALSE),
geniCodeRValue (right, FALSE),
getResultTypeFromType (tree->ftype)),
FALSE),
geniCodeRValue (right, FALSE),
getResultTypeFromType (tree->ftype)),
case ADD_ASSIGN:
{
sym_link *rtype = operandType (right);
case ADD_ASSIGN:
{
sym_link *rtype = operandType (right);
right,
getResultTypeFromType (tree->ftype),
lvl),
right,
getResultTypeFromType (tree->ftype),
lvl),
FALSE),
right,
getResultTypeFromType (tree->ftype)),
FALSE),
right,
getResultTypeFromType (tree->ftype)),
}
case LEFT_ASSIGN:
return
}
case LEFT_ASSIGN:
return
,FALSE),
geniCodeRValue (right, FALSE),
getResultTypeFromType (tree->ftype)),
,FALSE),
geniCodeRValue (right, FALSE),
getResultTypeFromType (tree->ftype)),
case RIGHT_ASSIGN:
return
geniCodeAssign (left,
geniCodeRightShift (geniCodeRValue (operandFromOperand (left)
,FALSE),
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,
case AND_ASSIGN:
return
geniCodeAssign (left,
FALSE),
geniCodeRValue (right, FALSE),
BITWISEAND,
FALSE),
geniCodeRValue (right, FALSE),
BITWISEAND,
- operandType (left)), 0);
+ operandType (left)), 0, 1);
case XOR_ASSIGN:
return
geniCodeAssign (left,
case XOR_ASSIGN:
return
geniCodeAssign (left,
FALSE),
geniCodeRValue (right, FALSE),
'^',
FALSE),
geniCodeRValue (right, FALSE),
'^',
- operandType (left)), 0);
+ operandType (left)), 0, 1);
case OR_ASSIGN:
return
geniCodeAssign (left,
case OR_ASSIGN:
return
geniCodeAssign (left,
,FALSE),
geniCodeRValue (right, FALSE),
'|',
,FALSE),
geniCodeRValue (right, FALSE),
'|',
- operandType (left)), 0);
+ operandType (left)), 0, 1);
case ',':
return geniCodeRValue (right, FALSE);
case ',':
return geniCodeRValue (right, FALSE);
- mov %1,dpl
- mov dpl,%1
+ mov r%1,dpl
+ mov dpl,r%1
- 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
- mov %1,dpl
- mov %2,dph
- mov dpl,%1
+ mov r%1,dpl
+ mov r%2,dph
+ mov dpl,r%1
- 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
- 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
- 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
- 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
- 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
- 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
; z80 removed redundant pop/push
ld %1,%2
}
; 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
-}
-; 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
-;}