+
+
+// applies to f.e. funptrs.c
+// saves one byte if %1 is a register or @register
+replace {
+ mov a,%1
+ add a,acc
+} by {
+ ; Peephole 254 optimized left shift
+ mov a,%1
+ add a,%1
+} if notVolatile %1
+
+// applies to f.e. switch.c
+replace {
+ clr c
+ mov a,#%1
+ subb a,%2
+ jc %3
+%4:
+ mov a,%2
+ add a,%2
+ add a,%2
+ mov dptr,%5
+ jmp @a+dptr
+} by {
+ ; Peephole 255 optimized jump table index calculation
+ mov a,%2
+ cjne a,#(%1+0x01),.+1
+ jnc %3
+%4:
+ add a,%2
+ add a,%2
+ mov dptr,%5
+ jmp @a+dptr
+}
+
+// applies to f.e. jump tables and scott-bool1.c.
+// similar peepholes can be constructed for other instructions
+// after which a flag or a register is known (like: djnz, cjne, jnc)
+replace {
+ jc %1
+%2:
+ clr c
+} by {
+ ; Peephole 256.a removed redundant clr c
+ jc %1
+%2:
+} if labelRefCount %2 0
+
+// applies to f.e. logf.c
+replace {
+ jnz %1
+%2:
+ clr a
+} by {
+ ; Peephole 256.b removed redundant clr a
+ jnz %1
+%2:
+} if labelRefCount %2 0
+
+// applies to f.e. malloc.c
+replace {
+ jnz %1
+%2:
+ mov %3,#0x00
+ mov %4,#0x00
+} by {
+ ; Peephole 256.c loading %3,%4 with zero from a
+ jnz %1
+ mov %3,a
+ mov %4,a
+} if labelRefCount %2 0
+
+// applies to f.e. bug-905492.c
+replace {
+ jnz %1
+%2:
+ mov %3,#0x00
+} by {
+ ; Peephole 256.d loading %3 with zero from a
+ jnz %1
+ mov %3,a
+} if labelRefCount %2 0
+
+
+// unsigned char i=8; do{ } while(--i != 0);
+// this currently only applies if i is kept in a register
+replace {
+ dec %1
+ cjne %1,#0x00,%2
+} by {
+ ; Peephole 257 optimized decrement with compare
+ djnz %1,%2
+} if notVolatile %1
+
+
+// in_byte<<=1; if(in_bit) in_byte|=1;
+// helps f.e. reading data on a 3-wire (SPI) bus
+replace {
+ mov a,%1
+ add a,%1
+ mov %1,a
+ jnb %2,%3
+%4:
+ orl %1,#0x01
+%3:
+} by {
+ ; Peephole 258.a optimized bitbanging
+ mov a,%1
+ mov c,%2
+ addc a,%1
+ mov %1,a
+%4:
+%3:
+} if notVolatile %1
+
+// in_byte<<=1; if(in_bit) in_byte|=1;
+replace {
+ mov a,r%1
+ add a,r%1
+ mov r%1,a
+ jnb %2,%3
+%4:
+ orl ar%1,#0x01
+%3:
+} by {
+ ; Peephole 258.b optimized bitbanging
+ mov a,r%1
+ mov c,%2
+ addc a,r%1
+ mov r%1,a
+%4:
+%3:
+}
+
+// in_byte>>=1; if(in_bit) in_byte|=0x80;
+replace {
+ mov a,%1
+ clr c
+ rrc a
+ mov %1,a
+ jnb %2,%3
+%4:
+ orl %1,#0x80
+%3:
+} by {
+ ; Peephole 258.c optimized bitbanging
+ mov a,%1
+ mov c,%2
+ rrc a
+ mov %1,a
+%4:
+%3:
+} if notVolatile %1
+
+// in_byte>>=1; if(in_bit) in_byte|=0x80;
+replace {
+ mov a,r%1
+ clr c
+ rrc a
+ mov r%1,a
+ jnb %2,%3
+%4:
+ orl ar%1,#0x80
+%3:
+} by {
+ ; Peephole 258.d optimized bitbanging
+ mov a,r%1
+ mov c,%2
+ rrc a
+ mov r%1,a
+%4:
+%3:
+}
+
+// out_bit=out_byte&0x80; out_byte<<=1;
+// helps f.e. writing data on a 3-wire (SPI) bus
+replace {
+ mov a,%1
+ mov c,acc.7
+ mov %2,c
+ mov a,%1
+ add a,%1
+ mov %1,a
+} by {
+ ; Peephole 258.e optimized bitbanging
+ mov a,%1
+ add a,%1
+ mov %2,c
+ mov %1,a
+} if notVolatile %1
+
+// out_bit=out_byte&0x01; out_byte>>=1;
+replace {
+ mov a,%1
+ mov c,acc.0
+ mov %2,c
+ mov a,%1
+ clr c
+ rrc a
+ mov %1,a
+} by {
+ ; Peephole 258.f optimized bitbanging
+ mov a,%1
+ clr c
+ rrc a
+ mov %2,c
+ mov %1,a
+} if notVolatile %1
+
+// Peepholes 259.x are not compatible with peepholex 250.x
+// Peepholes 250.x add jumps to a previously unused label. As the
+// labelRefCount is not increased, peepholes 259.x are (mistakenly) applied.
+// (Mail on sdcc-devel 2004-10-25)
+// Note: Peepholes 193..199, 251 remove jumps to previously used labels without
+// decreasing labelRefCount (less dangerous - this f.e. leads to 253.c being
+// applied instead of 253.b))
+//
+// applies to f.e. vprintf.c
+//replace {
+// sjmp %1
+//%2:
+// ret
+//} by {
+// sjmp %1
+// ; Peephole 259.a removed redundant label %2 and ret
+// ;
+//} if labelRefCount %2 0
+
+// applies to f.e. gets.c
+//replace {
+// ljmp %1
+//%2:
+// ret
+//} by {
+// ljmp %1
+// ; Peephole 259.b removed redundant label %2 and ret
+// ;
+//} if labelRefCount %2 0