* src/mcs51/gen.c (genPlusIncr, genMinusDec, genAddrOf): small
[fw/sdcc] / src / mcs51 / peeph.def
index d4bf76ca16cd96bb9d3895c95a650e6c7c84eaf8..2dbda21629664330792b47a8c9629caa17dec22d 100644 (file)
@@ -215,19 +215,19 @@ replace {
 %3:
        mov     dpl,%1
 %7:
-       mov     sp,bp
-       pop     bp
+       mov     sp,_bp
+       pop     _bp
 } by {
-       ;       Peephole 102    removed redundant mov
+       ;       Peephole 102    removed redundant mov to %1
        mov     dpl,%2
        ljmp    %3
 %4:
        mov     dpl,%5
 %3:
 %7:
-       mov     sp,bp
-       pop     bp
-} if notVolatile %1
+       mov     sp,_bp
+       pop     _bp
+} if notVolatile(%1), labelRefCount(%3 1)
 
 replace {
        mov     %1,%2
@@ -237,30 +237,31 @@ replace {
 %3:
        mov     dpl,%1
 %7:
-       mov     sp,bp
-       pop     bp
+       mov     sp,_bp
+       pop     _bp
 } by {
-       ;       Peephole 103    removed redundant mov
+       ;       Peephole 103    removed redundant mov to %1
        mov     dpl,%2
        ljmp    %3
 %4:
        mov     dpl,%5
 %3:
 %7:
-       mov     sp,bp
-       pop     bp
-}
+       mov     sp,_bp
+       pop     _bp
+} if labelRefCount(%3 1)
 
-replace {
-       mov     a,bp
-       clr     c
-       add     a,#0x01
-       mov     r%1,a
-} by {
-       ;       Peephole 104    optimized increment (acc not set to r%1, flags undefined)
-       mov     r%1,bp
-       inc     r%1
-}
+// Does not seem to be triggered anymore
+//replace {
+//     mov     a,_bp
+//     clr     c
+//     add     a,#0x01
+//     mov     r%1,a
+//} by {
+//     ;       Peephole 104    optimized increment (acc not set to r%1, flags undefined)
+//     mov     r%1,_bp
+//     inc     r%1
+//}
 
 replace {
        mov     %1,a
@@ -286,7 +287,7 @@ replace {
 } by {
        ;       Peephole 107    removed redundant ljmp
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 replace {
        jc      %1
@@ -402,7 +403,7 @@ replace {
        ;       Peephole 115.b  jump optimization
        jz      %3
 %2:
-} labelRefCountChange(%2 -1)
+} if labelRefCountChange(%2 -1)
 
 replace {
        clr     a
@@ -582,11 +583,11 @@ replace {
 replace {
        push    psw
        mov     psw,%1
-       push    bp
-       mov     bp,%2
+       push    _bp
+       mov     _bp,%2
 %3:
-       mov     %2,bp
-       pop     bp
+       mov     %2,_bp
+       pop     _bp
        pop     psw
        ret
 } by {
@@ -684,7 +685,7 @@ replace {
        mov     a,%2
        add     a,#0xff - %1
        mov     %3,c
-}
+} if operandsLiteral(%1)
 
 replace {
        clr     c
@@ -696,7 +697,7 @@ replace {
        mov     a,%2
        add     a,#0xff - %1
        jnc     %5
-}
+} if operandsLiteral(%1)
 
 replace {
        clr     c
@@ -708,7 +709,7 @@ replace {
        mov     a,%2
        add     a,#0xff - %1
        jc      %5
-}
+} if operandsLiteral(%1)
 
 replace {
        clr     c
@@ -720,7 +721,7 @@ replace {
        mov     a,#0x100 - %2
        add     a,%1
        mov     %3,c
-} if operandsNotRelated('0x00' %2)
+} if operandsNotRelated('0x00' %2), operandsLiteral(%2)
 
 replace {
        clr     c
@@ -732,7 +733,7 @@ replace {
        mov     a,#0x100 - %2
        add     a,%1
        jc      %5
-} if operandsNotRelated('0x00' %2)
+} if operandsNotRelated('0x00' %2), operandsLiteral(%2)
 
 replace {
        clr     c
@@ -744,7 +745,7 @@ replace {
        mov     a,#0x100 - %2
        add     a,%1
        jnc     %5
-} if operandsNotRelated('0x00' %2)
+} if operandsNotRelated('0x00' %2), operandsLiteral(%2)
 
 
 replace {
@@ -856,6 +857,19 @@ replace {
        mov     r%1,a
 }
 
+// applies to genlshOne
+replace {
+       mov     ar%1,@%2
+       mov     a,r%1
+       add     a,acc
+       mov     r%1,a
+} by {
+       ;       Peephole 140    removed redundant mov
+       mov     a,@%2
+       add     a,@%2
+       mov     r%1,a
+}
+
 replace {
        mov     r%1,a
        mov     r%2,ar%1
@@ -1063,7 +1077,7 @@ replace {
        ;       Peephole 160.a  removed sjmp by inverse jump logic
        jc      %2
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 replace {
        jc      %1
@@ -1073,7 +1087,7 @@ replace {
        ;       Peephole 160.b  removed sjmp by inverse jump logic
        jnc     %2
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 replace {
        jnz     %1
@@ -1083,7 +1097,7 @@ replace {
        ;       Peephole 160.c  removed sjmp by inverse jump logic
        jz      %2
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 replace {
        jz      %1
@@ -1093,7 +1107,7 @@ replace {
        ;       Peephole 160.d  removed sjmp by inverse jump logic
        jnz     %2
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 replace {
        jnb     %3,%1
@@ -1103,7 +1117,7 @@ replace {
        ;       Peephole 160.e  removed sjmp by inverse jump logic
        jb      %3,%2
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 replace {
        jb      %3,%1
@@ -1113,7 +1127,7 @@ replace {
        ;       Peephole 160.f  removed sjmp by inverse jump logic
        jnb     %3,%2
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 replace {
        mov     %1,%2
@@ -1142,7 +1156,7 @@ replace {
        ;       Peephole 168    jump optimization
        jb      %1,%3
 %2:
-} labelRefCountChange(%2 -1)
+} if labelRefCountChange(%2 -1)
 
 replace {
        jb      %1,%2
@@ -1152,7 +1166,7 @@ replace {
        ;       Peephole 169    jump optimization
        jnb     %1,%3
 %2:
-} labelRefCountChange(%2 -1)
+} if labelRefCountChange(%2 -1)
 
 replace {
        clr     a
@@ -1449,7 +1463,8 @@ replace {
        mov     %1,a
 } if notVolatile %1
 
-replace {
+// char indexed access to: long code table[] = {4,3,2,1};
+replace restart {
        add     a,#%1
        mov     dpl,a
        clr     a
@@ -1468,25 +1483,28 @@ replace {
        mov     %4,a
        inc     dptr
        clr     a
+       movc    a,@a+dptr
 } by {
        ;       Peephole 186.a  optimized movc sequence
+       mov     b,a
        mov     dptr,#%1
-       mov     b,acc
        movc    a,@a+dptr
        mov     %2,a
-       mov     acc,b
        inc     dptr
+       mov     a,b
        movc    a,@a+dptr
        mov     %3,a
-       mov     acc,b
        inc     dptr
+       mov     a,b
        movc    a,@a+dptr
        mov     %4,a
-       mov     acc,b
        inc     dptr
+       mov     a,b
+       movc    a,@a+dptr
 }
 
-replace {
+// char indexed access to: void* code table[] = {4,3,2,1};
+replace restart {
        add     a,#%1
        mov     dpl,a
        clr     a
@@ -1501,21 +1519,24 @@ replace {
        mov     %3,a
        inc     dptr
        clr     a
+       movc    a,@a+dptr
 } by {
        ;       Peephole 186.b  optimized movc sequence
+       mov     b,a
        mov     dptr,#%1
-       mov     b,acc
        movc    a,@a+dptr
        mov     %2,a
-       mov     acc,b
        inc     dptr
+       mov     a,b
        movc    a,@a+dptr
        mov     %3,a
-       mov     acc,b
        inc     dptr
+       mov     a,b
+       movc    a,@a+dptr
 }
 
-replace {
+// char indexed access to: int code table[] = {4,3,2,1};
+replace restart {
        add     a,#%1
        mov     dpl,a
        clr     a
@@ -1526,14 +1547,15 @@ replace {
        mov     %2,a
        inc     dptr
        clr     a
+       movc    a,@a+dptr
 } by {
        ;       Peephole 186.c  optimized movc sequence
+       mov     %2,a
        mov     dptr,#%1
-       mov     b,acc
        movc    a,@a+dptr
-       mov     %2,a
-       mov     acc,b
+       xch     a,%2
        inc     dptr
+       movc    a,@a+dptr
 }
 
 // char indexed access to: char code table[] = {4,3,2,1};
@@ -1893,7 +1915,7 @@ replace {
 } by {
        ;       Peephole 200.a  removed redundant sjmp
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 replace {
        sjmp    %1
@@ -1903,7 +1925,7 @@ replace {
        ;       Peephole 200.b  removed redundant sjmp
 %2:
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 replace {
        push    acc
@@ -1952,14 +1974,15 @@ replace {
        ;       Peephole 206    removed redundant mov %1,%1
 } if notVolatile
 
-replace {
-       mov     a,_bp
-       add     a,#0x00
-       mov     %1,a
-} by {
-       ;       Peephole 207    removed zero add (acc not set to %1, flags undefined)
-       mov     %1,_bp
-}
+// Does not seem to be triggered anymore
+//replace {
+//     mov     a,_bp
+//     add     a,#0x00
+//     mov     %1,a
+//} by {
+//     ;       Peephole 207    removed zero add (acc not set to %1, flags undefined)
+//     mov     %1,_bp
+//}
 
 replace {
        push    acc
@@ -1970,16 +1993,17 @@ replace {
        mov     r%1,_bp
 }
 
-replace {
-       mov     a,_bp
-       add     a,#0x00
-       inc     a
-       mov     %1,a
-} by {
-       ;       Peephole 209    optimized increment (acc not set to %1, flags undefined)
-       mov     %1,_bp
-       inc     %1
-}
+// Does not seem to be triggered anymore
+//replace {
+//     mov     a,_bp
+//     add     a,#0x00
+//     inc     a
+//     mov     %1,a
+//} by {
+//     ;       Peephole 209    optimized increment (acc not set to %1, flags undefined)
+//     mov     %1,_bp
+//     inc     %1
+//}
 
 replace {
        mov     dptr,#((((%1 >> 8)) <<8) + %1)
@@ -1995,15 +2019,16 @@ replace {
        ;       Peephole 211    removed redundant push %1 pop %1
 }
 
-replace {
-       mov     a,_bp
-       add     a,#0x01
-       mov     r%1,a
-} by {
-       ;       Peephole 212    reduced add sequence to inc
-       mov     r%1,_bp
-       inc     r%1
-}
+// Does not seem to be triggered anymore
+//replace {
+//     mov     a,_bp
+//     add     a,#0x01
+//     mov     r%1,a
+//} by {
+//     ;       Peephole 212    reduced add sequence to inc
+//     mov     r%1,_bp
+//     inc     r%1
+//}
 
 // reverts peephole 159? asx8051 cannot handle, too complex?
 replace {
@@ -2211,6 +2236,18 @@ replace {
        ;       Peephole 225    removed redundant move to acc
 } if notVolatile %1
 
+replace {
+       clr     a
+       movx    @%1,a
+       inc     %1
+       clr     a
+} by {
+       clr     a
+       movx    @%1,a
+       inc     %1
+       ;       Peephole 226.a  removed unnecessary clr
+}
+
 replace {
        clr     a
        movx    @%1,a
@@ -2224,7 +2261,7 @@ replace {
        inc     %1
        movx    @%1,a
        inc     %1
-       ;       Peephole 226    removed unnecessary clr
+       ;       Peephole 226.b  removed unnecessary clr
 }
 
 replace {
@@ -2482,7 +2519,7 @@ replace {
        mov     %3,%4
 %1:
        ret
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 replace {
        sjmp    %1
@@ -2501,7 +2538,7 @@ replace {
        mov     dph,%6
 %1:
        ret
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 // applies to f.e. device/lib/log10f.c
 replace {
@@ -2623,7 +2660,7 @@ replace {
        inc     a
 %0:
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 // applies to generic pointer compare
 replace {
@@ -2644,7 +2681,7 @@ replace {
        inc     a
 %0:
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 // applies to f.e. time.c
 replace {
@@ -2663,7 +2700,7 @@ replace {
        inc     a
 %0:
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 // applies to f.e. malloc.c
 replace {
@@ -2680,7 +2717,7 @@ replace {
        inc     a
 %0:
 %1:
-} labelRefCountChange(%1 -1)
+} if labelRefCountChange(%1 -1)
 
 // applies to f.e. j = (k!=0x1000);
 // with volatile idata long k;
@@ -2710,7 +2747,7 @@ replace {
        inc     a
 %1:
 %2:
-} labelRefCountChange(%2 -1)
+} if labelRefCountChange(%2 -1)
 
 // applies to f.e. j = (p!=NULL);
 // with volatile idata char *p;
@@ -2736,7 +2773,7 @@ replace {
        inc     a
 %1:
 %2:
-} labelRefCountChange(%2 -1)
+} if labelRefCountChange(%2 -1)
 
 // applies to f.e. j = (k!=0x1000);
 // with volatile idata int k;
@@ -2758,7 +2795,7 @@ replace {
        inc     a
 %1:
 %2:
-} labelRefCountChange(%2 -1)
+} if labelRefCountChange(%2 -1)
 
 // applies to f.e. vprintf.asm (--stack-auto)
 replace {
@@ -2775,7 +2812,7 @@ replace {
        inc     a
 %1:
 %2:
-} labelRefCountChange(%2 -1)
+} if labelRefCountChange(%2 -1)
 
 // applies to f.e. scott-bool1.c
 replace {
@@ -3089,8 +3126,6 @@ replace {
 } if notVolatile %1
 
 
-
-
 // rules 247.x apply to f.e. bitfields.c
 replace {
        mov     r%5,#%1
@@ -3799,14 +3834,25 @@ replace {
 
 
 // unsigned char i=8; do{ } while(--i != 0);
-// this currently only applies if i is kept in a register
+// this applies if i is kept in a register
 replace {
        dec     %1
        cjne    %1,#0x00,%2
 } by {
-       ;       Peephole 257    optimized decrement with compare
+       ;       Peephole 257.a  optimized decrement with compare
        djnz    %1,%2
-} if notVolatile %1
+} if notVolatile(%1)
+
+// unsigned char i=8; do{ } while(--i != 0);
+// this applies if i is kept in data memory
+replace {
+       dec     %1
+       mov     a,%1
+       jnz     %2
+} by {
+       ;       Peephole 257.b  optimized decrement with compare
+       djnz    %1,%2
+} if notVolatile(%1), operandsNotRelated(%1 '@r0' '@r1')
 
 
 // in_byte<<=1; if(in_bit) in_byte|=1;
@@ -3846,7 +3892,7 @@ replace {
        mov     r%1,a
 %4:
 %3:
-} labelRefCountChange(%3 -1)
+} if labelRefCountChange(%3 -1)
 
 // in_byte>>=1; if(in_bit) in_byte|=0x80;
 replace {
@@ -3886,7 +3932,7 @@ replace {
        mov     r%1,a
 %4:
 %3:
-} labelRefCountChange(%3 -1)
+} if labelRefCountChange(%3 -1)
 
 // out_bit=out_byte&0x80; out_byte<<=1;
 // helps f.e. writing data on a 3-wire (SPI) bus
@@ -4502,6 +4548,19 @@ replace {
        mov     %1,#(%2 + 1)
 }
 
+
+replace {
+       clr     a
+       cjne    %1,%2,%3
+       inc     a
+%3:
+       jz      %4
+} by {
+       ;       Peephole 264    jump optimization (acc not set)
+       cjne    %1,%2,%4
+%3:
+} if labelRefCount(%3 1), labelRefCountChange(%3 -1)
+
 // should be one of the last peepholes
 replace{
 %1: