X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fmcs51%2Fpeeph.def;h=e0ea01950bc2b68fd0e8b3ddf6cbae2cc6453525;hb=084dd312234f8d66846225c1ec5c49f32a61fb91;hp=d4bf76ca16cd96bb9d3895c95a650e6c7c84eaf8;hpb=df600563e3005614c5ab09aab6ba39218bbd3191;p=fw%2Fsdcc diff --git a/src/mcs51/peeph.def b/src/mcs51/peeph.def index d4bf76ca..e0ea0195 100644 --- a/src/mcs51/peeph.def +++ b/src/mcs51/peeph.def @@ -1,20 +1,3 @@ -//replace restart { -// pop %1 -// push %1 -//} by { -// ; Peephole 1 removed pop %1 push %1 (not push pop) -//} - -//replace restart { -// pop %1 -// mov %2,%3 -// push %1 -//} by { -// ; Peephole 2 removed pop %1 push %1 (not push pop) -// mov %2,%3 -//} - -// // added by Jean Louis VERN for // his shift stuff replace { @@ -193,6 +176,52 @@ replace { movx @dptr,a } if notVolatile %1 +// applies to f.e. lib/src/time.c (--model-large) +replace { + mov a,%1 + movx @dptr,a + inc dptr + mov a,%1 + movx @dptr,a + inc dptr + mov a,%1 + movx @dptr,a + inc dptr + mov a,%1 + movx @dptr,a +} by { + mov a,%1 + movx @dptr,a + inc dptr + ; Peephole 101.a removed redundant moves + movx @dptr,a + inc dptr + movx @dptr,a + inc dptr + movx @dptr,a +} if notVolatile %1 + +// applies to f.e. support/regression/tests/literalop.c (--model-large) +replace { + mov a,%1 + movx @dptr,a + inc dptr + mov a,%1 + movx @dptr,a + inc dptr + mov a,%1 + movx @dptr,a +} by { + mov a,%1 + movx @dptr,a + inc dptr + ; Peephole 101.b removed redundant moves + movx @dptr,a + inc dptr + movx @dptr,a +} if notVolatile %1 + +// applies to f.e. support/regression/tests/onebyte.c (--model-large) replace { mov a,%1 movx @dptr,a @@ -203,7 +232,7 @@ replace { mov a,%1 movx @dptr,a inc dptr - ; Peephole 101 removed redundant mov + ; Peephole 101.c removed redundant mov movx @dptr,a } if notVolatile %1 @@ -215,19 +244,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,37 +266,38 @@ 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 mov a,%1 } by { mov %1,a -; Peephole 105 removed redundant mov + ; Peephole 105 removed redundant mov } if notVolatile %1 replace { @@ -286,7 +316,7 @@ replace { } by { ; Peephole 107 removed redundant ljmp %1: -} labelRefCountChange(%1 -1) +} if labelRefCountChange(%1 -1) replace { jc %1 @@ -402,7 +432,7 @@ replace { ; Peephole 115.b jump optimization jz %3 %2: -} labelRefCountChange(%2 -1) +} if labelRefCountChange(%2 -1) replace { clr a @@ -582,11 +612,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 +714,7 @@ replace { mov a,%2 add a,#0xff - %1 mov %3,c -} +} if operandsLiteral(%1) replace { clr c @@ -696,7 +726,7 @@ replace { mov a,%2 add a,#0xff - %1 jnc %5 -} +} if operandsLiteral(%1) replace { clr c @@ -708,7 +738,7 @@ replace { mov a,%2 add a,#0xff - %1 jc %5 -} +} if operandsLiteral(%1) replace { clr c @@ -720,7 +750,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 +762,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 +774,7 @@ replace { mov a,#0x100 - %2 add a,%1 jnc %5 -} if operandsNotRelated('0x00' %2) +} if operandsNotRelated('0x00' %2), operandsLiteral(%2) replace { @@ -792,7 +822,7 @@ replace { mov %1,a mov dpl,%2 mov dph,%3 - ; Peephole 136 removed redundant move + ; Peephole 136 removed redundant mov } if notVolatile %1 // WTF? Doesn't look sensible to me... @@ -844,7 +874,8 @@ replace { } by { ; Peephole 139.b removed redundant mov orl a,%2 - mov r%1,a } + mov r%1,a +} replace { mov r%1,a @@ -856,12 +887,25 @@ 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 mov ar%1,@r%2 } by { - ; Peephole 142 removed redundant moves + ; Peephole 142 removed redundant mov mov r%2,a mov ar%1,@r%2 } @@ -1063,7 +1107,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 +1117,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 +1127,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 +1137,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 +1147,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 +1157,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 +1186,7 @@ replace { ; Peephole 168 jump optimization jb %1,%3 %2: -} labelRefCountChange(%2 -1) +} if labelRefCountChange(%2 -1) replace { jb %1,%2 @@ -1152,7 +1196,7 @@ replace { ; Peephole 169 jump optimization jnb %1,%3 %2: -} labelRefCountChange(%2 -1) +} if labelRefCountChange(%2 -1) replace { clr a @@ -1270,7 +1314,7 @@ replace { mov %1,%2 mov %1,%3 } by { - ; Peephole 177.c removed redundant move + ; Peephole 177.c removed redundant mov mov %1,%3 } if notVolatile %1 %2 @@ -1283,7 +1327,7 @@ replace restart { } by { mov %1,%2 mov %3,%4 - ; Peephole 177.d removed redundant move + ; Peephole 177.d removed redundant mov } if notVolatile(%1 %2),operandsNotRelated(%1 %2 %3) // applies to f.e. bug-607243.c @@ -1292,7 +1336,7 @@ replace { mov r%1,%2 mov ar%1,%3 } by { - ; peephole 177.e removed redundant move + ; peephole 177.e removed redundant mov mov ar%1,%3 } if notVolatile %2 %3 @@ -1300,7 +1344,7 @@ replace { mov ar%1,%2 mov r%1,%3 } by { - ; peephole 177.f removed redundant move + ; peephole 177.f removed redundant mov mov r%1,%3 } if notVolatile %2 @@ -1449,7 +1493,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 +1513,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 +1549,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 +1577,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 +1945,7 @@ replace { } by { ; Peephole 200.a removed redundant sjmp %1: -} labelRefCountChange(%1 -1) +} if labelRefCountChange(%1 -1) replace { sjmp %1 @@ -1903,7 +1955,7 @@ replace { ; Peephole 200.b removed redundant sjmp %2: %1: -} labelRefCountChange(%1 -1) +} if labelRefCountChange(%1 -1) replace { push acc @@ -1950,16 +2002,17 @@ replace { mov %1,%1 } by { ; Peephole 206 removed redundant mov %1,%1 -} if notVolatile +} if notVolatile %1 -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 +2023,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 +2049,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 { @@ -2029,7 +2084,7 @@ replace { add a,%1 } by { mov %1,a - ; Peephole 214 reduced some extra moves + ; Peephole 214.a removed redundant mov add a,%2 } if operandsNotSame @@ -2038,7 +2093,7 @@ replace { add a,%2 mov %1,a } by { - ; Peephole 215 removed some moves + ; Peephole 214.b removed redundant mov add a,%2 mov %1,a } if operandsNotSame @@ -2157,13 +2212,13 @@ replace { replace { mov %1 + %2,(%2 + %1) } by { - ; Peephole 221.a remove redundant move + ; Peephole 221.a remove redundant mov } if notVolatile replace { mov (%1 + %2 + %3),((%2 + %1) + %3) } by { - ; Peephole 221.b remove redundant move + ; Peephole 221.b remove redundant mov } if notVolatile replace { @@ -2211,6 +2266,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 +2291,7 @@ replace { inc %1 movx @%1,a inc %1 - ; Peephole 226 removed unnecessary clr + ; Peephole 226.b removed unnecessary clr } replace { @@ -2482,7 +2549,7 @@ replace { mov %3,%4 %1: ret -} labelRefCountChange(%1 -1) +} if labelRefCountChange(%1 -1) replace { sjmp %1 @@ -2501,7 +2568,7 @@ replace { mov dph,%6 %1: ret -} labelRefCountChange(%1 -1) +} if labelRefCountChange(%1 -1) // applies to f.e. device/lib/log10f.c replace { @@ -2530,7 +2597,7 @@ replace { mov %7,%15 mov %8,%16 ; Peephole 238.a removed 4 redundant moves -} if operandsNotSame8 %1 %2 %3 %4 %5 %6 %7 %8 +} if operandsNotSame8(%1 %2 %3 %4 %5 %6 %7 %8), notVolatile(%1 %2 %3 %4 %9 %10 %11 %12) // applies to device/lib/log10f.c replace { @@ -2548,7 +2615,7 @@ replace { mov %3,%7 mov %4,%8 ; Peephole 238.b removed 3 redundant moves -} if operandsNotSame7 %1 %2 %3 %4 %5 %6 %7 +} if operandsNotSame7(%1 %2 %3 %4 %5 %6 %7), notVolatile(%1 %2 %3 %5 %6 %7) // applies to f.e. device/lib/time.c replace { @@ -2567,7 +2634,7 @@ replace { mov %3,%7 mov %4,%8 ; Peephole 238.c removed 2 redundant moves -} if operandsNotSame4 %1 %2 %3 %4 +} if operandsNotSame4(%1 %2 %3 %4), notVolatile(%1 %2 %5 %6) // applies to f.e. support/regression/tests/bug-524209.c replace { @@ -2583,7 +2650,7 @@ replace { mov %2,%5 mov %3,%6 ; Peephole 238.d removed 3 redundant moves -} if operandsNotSame6 %1 %2 %3 %4 %5 %6 +} if operandsNotSame6(%1 %2 %3 %4 %5 %6), notVolatile(%1 %2 %3 %4 %5 %6) // applies to f.e. ser_ir.asm replace { @@ -2623,7 +2690,7 @@ replace { inc a %0: %1: -} labelRefCountChange(%1 -1) +} if labelRefCountChange(%1 -1) // applies to generic pointer compare replace { @@ -2644,7 +2711,7 @@ replace { inc a %0: %1: -} labelRefCountChange(%1 -1) +} if labelRefCountChange(%1 -1) // applies to f.e. time.c replace { @@ -2663,7 +2730,7 @@ replace { inc a %0: %1: -} labelRefCountChange(%1 -1) +} if labelRefCountChange(%1 -1) // applies to f.e. malloc.c replace { @@ -2680,7 +2747,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 +2777,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 +2803,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 +2825,7 @@ replace { inc a %1: %2: -} labelRefCountChange(%2 -1) +} if labelRefCountChange(%2 -1) // applies to f.e. vprintf.asm (--stack-auto) replace { @@ -2775,7 +2842,7 @@ replace { inc a %1: %2: -} labelRefCountChange(%2 -1) +} if labelRefCountChange(%2 -1) // applies to f.e. scott-bool1.c replace { @@ -3089,8 +3156,6 @@ replace { } if notVolatile %1 - - // rules 247.x apply to f.e. bitfields.c replace { mov r%5,#%1 @@ -3799,14 +3864,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 +3922,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 +3962,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,9 +4578,36 @@ 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) + + +replace restart { + pop ar%1 +} by { + ; Peephole 300 pop ar%1 removed +} if deadMove %1 + +replace { + mov r%1,%2 +} by { + ; Peephole 301 mov r%1,%2 removed +} if notVolatile(%2), deadMove(%1) + + // should be one of the last peepholes replace{ %1: } by { - ; Peephole 300 removed redundant label %1 + ; Peephole 400 removed redundant label %1 } if labelRefCount(%1 0)