X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCicode.c;h=4ab359dc000872995b73e548e0cec1ef05681ae6;hb=9b6292c6f1828886ea5bacb609e63403823e3c06;hp=bf2deb1f2758f05e04c6dab2c0d2cbb16b18c3ea;hpb=663b4c8f71506223e98aa03388f0cb05a01d9205;p=fw%2Fsdcc diff --git a/src/SDCCicode.c b/src/SDCCicode.c index bf2deb1f..4ab359dc 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -115,6 +115,26 @@ iCodeTable codeTable[] = {ARRAYINIT, "arrayInit", picGenericOne, NULL}, }; +// this makes it more easy to catch bugs +struct bitVect *OP_DEFS(struct operand *op) { + assert (IS_SYMOP(op)); + return OP_SYMBOL(op)->defs; +} +struct bitVect *OP_DEFS_SET(struct operand *op, struct bitVect *bv) { + assert (IS_SYMOP(op)); + OP_SYMBOL(op)->defs=bv; + return bv; +} +struct bitVect *OP_USES(struct operand *op) { + assert (IS_SYMOP(op)); + return OP_SYMBOL(op)->uses; +} +struct bitVect *OP_USES_SET(struct operand *op, struct bitVect *bv) { + assert (IS_SYMOP(op)); + OP_SYMBOL(op)->uses=bv; + return bv; +} + /*-----------------------------------------------------------------*/ /* checkConstantRange: check a constant against the type */ /*-----------------------------------------------------------------*/ @@ -1078,14 +1098,27 @@ operandOperation (operand * left, operand * right, (unsigned long) operandLitValue (right) : (long) operandLitValue (right))); break; - case RIGHT_OP: - retval = operandFromLit ((SPEC_USIGN(let) ? - (unsigned long) operandLitValue (left) : - (long) operandLitValue (left)) >> - (SPEC_USIGN(ret) ? - (unsigned long) operandLitValue (right) : - (long) operandLitValue (right))); + case RIGHT_OP: { + double lval = operandLitValue(left), rval = operandLitValue(right); + double res=0; + switch ((SPEC_USIGN(let) ? 2 : 0) + (SPEC_USIGN(ret) ? 1 : 0)) + { + case 0: // left=unsigned right=unsigned + res=(unsigned long)lval >> (unsigned long)rval; + break; + case 1: // left=unsigned right=signed + res=(unsigned long)lval >> (signed long)rval; + break; + case 2: // left=signed right=unsigned + res=(signed long)lval >> (unsigned long)rval; + break; + case 3: // left=signed right=signed + res=(signed long)lval >> (signed long)rval; + break; + } + retval = operandFromLit (res); break; + } case EQ_OP: retval = operandFromLit (operandLitValue (left) == operandLitValue (right)); @@ -1604,6 +1637,7 @@ usualBinaryConversions (operand ** op1, operand ** op2) sym_link *ltype = operandType (*op1); ctype = computeType (ltype, rtype); + *op1 = geniCodeCast (ctype, *op1, TRUE); *op2 = geniCodeCast (ctype, *op2, TRUE); @@ -1645,7 +1679,6 @@ geniCodeRValue (operand * op, bool force) if (IS_SPEC (type) && IS_TRUE_SYMOP (op) && (!IN_FARSPACE (SPEC_OCLS (etype)) || - /* TARGET_IS_DS390)) */ (options.model == MODEL_FLAT24) )) { op = operandFromOperand (op); @@ -1892,10 +1925,12 @@ geniCodeDivision (operand * left, operand * right) resType = usualBinaryConversions (&left, &right); - /* if the right is a literal & power of 2 */ - /* then make it a right shift */ + /* if the right is a literal & power of 2 + and left is unsigned then make it a + right shift */ if (IS_LITERAL (retype) && !IS_FLOAT (letype) && + SPEC_USIGN(letype) && (p2 = powof2 ((unsigned long) floatFromVal (right->operand.valOperand)))) { ic = newiCode (RIGHT_OP, left, operandFromLit (p2)); /* right shift */ @@ -1965,6 +2000,11 @@ geniCodePtrPtrSubtract (operand * left, operand * right) ADDTOCHAIN (ic); subtractExit: + if (IS_VOID(ltype->next) || IS_VOID(rtype->next)) { + return result; + } + + // should we really do this? is this ANSI? return geniCodeDivision (result, operandFromLit (getSize (ltype->next))); } @@ -2029,9 +2069,11 @@ geniCodeAdd (operand * left, operand * right, int lvl) int isarray = 0; LRTYPE; +#if 0 /* if left is an array then array access */ if (IS_ARRAY (ltype)) return geniCodeArray (left, right,lvl); +#endif /* if the right side is LITERAL zero */ /* return the left side */ @@ -2043,7 +2085,7 @@ geniCodeAdd (operand * left, operand * right, int lvl) return right; /* if left is a pointer then size */ - if (IS_PTR (ltype)) + if (IS_PTR (ltype) || IS_ARRAY(ltype)) { isarray = left->isaddr; // there is no need to multiply with 1 @@ -2779,7 +2821,8 @@ geniCodeSEParms (ast * parms,int lvl) geniCodeRValue (ast2iCode (parms,lvl+1), FALSE); parms->type = EX_OPERAND; - AST_ARGREG(parms) = SPEC_ARGREG(parms->etype); + AST_ARGREG(parms) = parms->etype ? SPEC_ARGREG(parms->etype) : + SPEC_ARGREG(parms->ftype); } /*-----------------------------------------------------------------*/ @@ -2845,7 +2888,7 @@ geniCodeParms (ast * parms, value *argVals, int *stack, /* assign */ operand *top = operandFromSymbol (argVals->sym); /* clear useDef and other bitVectors */ - OP_USES (top) = OP_DEFS (top) = OP_SYMBOL(top)->clashes = NULL; + OP_USES_SET ((top), OP_DEFS_SET ((top), OP_SYMBOL(top)->clashes = NULL)); geniCodeAssign (top, pval, 1); } else @@ -2933,7 +2976,6 @@ geniCodeReceive (value * args) if (IN_FARSPACE (SPEC_OCLS (sym->etype)) && options.stackAuto == 0 && - /* !TARGET_IS_DS390) */ (!(options.model == MODEL_FLAT24)) ) { } @@ -2991,7 +3033,7 @@ geniCodeFunctionBody (ast * tree,int lvl) /* create a proc icode */ ic = newiCode (FUNCTION, func, NULL); - ic->lineno = OP_SYMBOL (func)->lineDef; + lineno=ic->lineno = OP_SYMBOL (func)->lineDef; ADDTOCHAIN (ic); @@ -3331,6 +3373,7 @@ ast2iCode (ast * tree,int lvl) operand *right = NULL; if (!tree) return NULL; + /* set the global variables for filename & line number */ if (tree->filename) filename = tree->filename;