+2003-04-18 Kevin Vigor <kevin@vigor.nu>
+
+ * src/SDCCopt.c: add special case optimization to replace modulo by
+ a power of two with a bitwise AND.
+
2003-04-18 <johan@balder>
* src/mcs51/gen.c (getFreePtr): fixed bug #635354
}
+extern operand *geniCodeRValue (operand *, bool);
+
/*-----------------------------------------------------------------*/
/* convilong - converts int or long mults or divs to fcalls */
/*-----------------------------------------------------------------*/
int su;
int bytesPushed=0;
- remiCodeFromeBBlock (ebp, ic);
-
+ // Easy special case which avoids function call: modulo by a literal power
+ // of two can be replaced by a bitwise AND.
+ if (op == '%' && isOperandLiteral(IC_RIGHT(ic)))
+ {
+ unsigned litVal = (unsigned)(operandLitValue(IC_RIGHT(ic)));
+
+ // See if literal value is a power of 2.
+ while (litVal && !(litVal & 1))
+ {
+ litVal >>= 1;
+ }
+ if (litVal)
+ {
+ // discard first high bit set.
+ litVal >>= 1;
+ }
+
+ if (!litVal)
+ {
+ ic->op = BITWISEAND;
+ IC_RIGHT(ic) = operandFromLit(operandLitValue(IC_RIGHT(ic)) - 1);
+ return;
+ }
+ }
+
+ remiCodeFromeBBlock (ebp, ic);
+
+
/* depending on the type */
for (bwd = 0; bwd < 3; bwd++)
{