* src/z80/gen.c (assignResultValue): fixed bug when registers overlap,
[fw/sdcc] / src / z80 / peeph.def
index 9fd073d688f13fdb31038f39d1442acba74e4943..2fb852b6461d820edfef25446ea3d4ea6792e3b2 100644 (file)
@@ -1,5 +1,464 @@
+replace {
+       ld      (hl),(hl)
+} by {
+       ERROR - peephole - caught (hl),(hl)
+}
+
+replace restart {
+       ld      %1,%1
+} by {
+       ; peephole removed redundant load.
+}
+
+replace restart {
+       xor     a,a
+       or      a,%1
+       or      a,a
+       jp      %2,%3
+} by {
+       xor     a,a
+       or      a,%1
+       jp      %2,%3
+}
+
+replace restart {
+       jp      NZ,%1
+       jp      %2
+%1:
+       jp      %3
+%2:
+} by {
+       jp      Z,%2
+%1:
+       jp      %3
+%2:
+} if labelRefCountChange(%1 -1)
+
+replace restart {
+       jp      NZ,%1
+       jp      %2
+%1:
+} by {
+       jp      Z,%2
+%1:
+} if labelRefCountChange(%1 -1)
+
+replace restart {
+       jp      Z,%1
+       jp      %2
+%1:
+} by {
+       jp      NZ,%2
+%1:
+} if labelRefCountChange(%1 -1)
+
+replace restart {
+       or      a,%1
+       or      a,a
+} by {
+       or      a,%1
+}
+
+replace restart {
+       or      a,%1)
+       or      a,a
+} by {
+       or      a,%1)
+}
+
+replace restart {
+       xor     a,a
+       or      a,%1
+       jp      NZ,%2
+       xor     a,a
+       or      a,%3
+       jp      Z,%2
+} by {
+       xor     a,a
+       or      a,%1
+       jp      NZ,%2
+       or      a,%3
+       jp      Z,%2
+}
+
+replace restart {
+       jp      NZ,%1
+       inc     %3)
+%1:
+       jp      %2
+} by {
+       jp      NZ,%2
+       inc     %3)
+%1:
+       jp      %2
+} if labelRefCountChange(%1 -1), labelRefCountChange(%2 1)
+
+replace restart {
+       xor     a,a
+       ld      a,#0x00
+} by {
+       xor     a,a
+}
+
+replace {
+       ld      e,#0x00
+       ld      d,#0x00
+} by {
+       ld      de,#0x0000
+}
+
+replace {
+       ld      l,#0x00
+       ld      h,#0x00
+} by {
+       ld      hl,#0x0000
+}
+
+replace {
+       ld      c,#0x00
+       ld      b,#0x00
+} by {
+       ld      bc,#0x0000
+}
+
+replace restart {
+       ld      %1,a
+       ld      a,%1
+} by {
+       ld      %1,a
+} if notVolatile %1
+
+replace restart {
+       jp      %1,%2
+       jr      %3
+%2:
+       jp      %4
+} by {
+       jp      %1,%4
+       jr      %3
+%2:
+       jp      %4
+} if labelRefCountChange(%2 -1), labelRefCountChange(%4 1)
+
+replace {
+       ld      l,e
+       ld      h,d
+       push    hl
+       ld      l,c
+       ld      h,b
+       push    hl
+} by {
+       push    de
+       push    bc
+}
+
+replace {
+       and     a,#%1
+       or      a,a
+} by {
+       and     a,#%1
+}
+
+replace {
+       ld      b,l
+       ld      a,b
+       pop     bc
+       ld      b,a
+} by {
+       ld      a,l
+       pop     bc
+       ld      b,a
+}
+
+replace {
+       ld      d,l
+       ld      a,d
+       pop     de
+       ld      d,a
+} by {
+       ld      a,l
+       pop     de
+       ld      d,a
+}
+
+replace {
+       ld      a,b
+       push    af
+       inc     sp
+} by {
+       push    bc
+       inc     sp
+}
+
+replace {
+       ld      a,d
+       push    af
+       inc     sp
+} by {
+       push    de
+       inc     sp
+}
+
+replace {
+       ld      a,%1
+       sub     a,#%2
+       jp      M,%3
+       ld      a,%1
+       sub     a,#%4
+       jp      P,%5
+} by {
+       ld      a,%1
+       cp      a,#%2
+       jp      M,%3
+       cp      a,#%4
+       jp      P,%5
+}
+
+replace {
+       ld      e,l
+       ld      d,h
+       ld      l,e
+       ld      h,d
+} by {
+       ld      e,l
+       ld      d,h
+}
+
+replace {
+       ld      %1,%2
+       ld      %3,%4
+       ld      %2,%1
+       ld      %4,%3
+} by {
+       ld      %1,%2
+       ld      %3,%4
+}
+
+// From: Philipp Klaus Krause
+replace restart {
+       ld      %1,a
+       ld      a,%2
+       add     a,%1
+       ld      %1,a
+} by {
+       ; peephole removed loads by exploiting commutativity of addition.
+       add     a,%2
+       ld      %1,a
+}
+
+// From: Philipp Klaus Krause
 replace restart {
-       ld %1,%1
+       ld      %1,a
+       ld      a,%2
+       add     a,%1
+} by {
+       ld      %1, a
+       ; peephole removed load by exploiting commutativity of addition.
+       add     a, %2
+}
+
+// From: Philipp Klaus Krause
+replace {
+       or      a,%1
+       jp      NZ,%2
+       ld      %3,#0x00
+} by {
+       or      a,%1
+       jp      NZ,%2
+       ld      %3,a
+       ; peephole replaced constant #0x00 by a (which has just been tested to be #0x00).
+}
+
+// From: Philipp Klaus Krause
+replace {
+       and     a,%1
+       jp      NZ,%2
+       ld      %3,#0x00
+} by {
+       and     a,%1
+       jp      NZ,%2
+       ld      %3,a
+       ; peephole replaced constant #0x00 by a (which has just been tested to be #0x00).
+}
+
+// From: Philipp Klaus Krause
+replace {
+       sub     a,%1
+       jp      NZ,%2
+       ld      %3,#0x00
+} by {
+       sub     a,%1
+       jp      NZ,%2
+       ld      %3,a
+       ; peephole replaced constant #0x00 by a (which has just been tested to be #0x00).
+}
+
+// From: Philipp Klaus Krause
+replace {
+       dec     a
+       jp      NZ,%1
+       ld      %2,#0x00
+} by {
+       dec     a
+       jp      NZ,%1
+       ld      %2,a
+       ; peephole replaced constant #0x00 by a (which has just been tested to be #0x00).
+}
+
+// From: Philipp Klaus Krause
+replace {
+       or      a,%1
+       jp      NZ,%2
+       ld      a,%3
+       or      a,a
+} by {
+       or      a,%1
+       jp      NZ,%2
+       or      a,%3
+       ; peephole shortened or using a (which has just been tested to be #0x00).
+}
+
+// From: Philipp Klaus Krause
+replace {
+       and     a,%1
+       jp      NZ,%2
+       ld      a,%3
+       or      a,a
 } by {
-       ; Removed redundent load
+       and     a,%1
+       jp      NZ,%2
+       or      a,%3
+       ; peephole shortened or using a (which has just been tested to be #0x00).
 }
+
+// From: Philipp Klaus Krause
+replace {
+       sub     a,%1
+       jp      NZ,%2
+       ld      a,%3
+       or      a,a
+} by {
+       sub     a,%1
+       jp      NZ,%2
+       or      a,%3
+       ; peephole shortened or using a (which has just been tested to be #0x00).
+}
+
+// From: Philipp Klaus Krause
+replace {
+       dec     a
+       jp      NZ,%1
+       ld      a,%2
+       or      a,a
+} by {
+       dec     a
+       jp      NZ,%1
+       or      a,%2
+       ; peephole shortened or using a (which has just been tested to be #0x00).
+}
+
+// From: Philipp Klaus Krause
+replace restart {
+       or      a,%1
+       jp      NZ,%2
+       push    %3
+       ld      %4,#0x00
+} by {
+       or      a,%1
+       jp      NZ,%2
+       push    %3
+       ld      %4,a
+       ; peephole replaced constant #0x00 by a (which has just been tested to be #0x00).
+}
+
+// From: Philipp Klaus Krause
+replace restart {
+       and     a,%1
+       jp      NZ,%2
+       push    %3
+       ld      %4,#0x00
+} by {
+       sub     a,%1
+       jp      NZ,%2
+       push    %3
+       ld      %4,a
+       ; peephole replaced constant #0x00 by a (which has just been tested to be #0x00).
+}
+
+// From: Philipp Klaus Krause
+replace restart {
+       sub     a,%1
+       jp      NZ,%2
+       push    %3
+       ld      %4,#0x00
+} by {
+       sub     a,%1
+       jp      NZ,%2
+       push    %3
+       ld      %4,a
+       ; peephole replaced constant #0x00 by a (which has just been tested to be #0x00).
+}
+
+// From: Philipp Klaus Krause
+replace restart {
+       dec     a
+       jp      NZ,%1
+       push    %2
+       ld      %3,#0x00
+} by {
+       dec     a
+       jp      NZ,%1
+       push    %2
+       ld      %3,a
+       ; peephole replaced constant #0x00 by a (which has just been tested to be #0x00).
+}
+
+// From: Philipp Klaus Krause
+replace restart{
+       jp      NZ,%1
+       or      a,%2
+       jp      Z,%3
+%1:
+       jp      %4
+%3:
+} by {
+       jp      NZ,%4
+       ; peephole redirected jump
+       or      a,%2
+       jp      NZ,%4
+       ; peephole redirected jump
+%3:
+} if labelRefCount(%1 1), labelRefCountChange(%1 -1), labelRefCountChange(%3 -1), labelRefCountChange(%4 1)
+
+// Should be one of the last ones. Opens the code to further peephole optimization.
+// From: Philipp Klaus Krause
+replace restart {
+%1:
+} by {
+       ; peephole removed unused label %1.
+} if labelRefCount(%1 0)
+
+// From: Philipp Klaus Krause
+replace {
+       jp      Z,%5
+} by {
+       jr      Z,%5
+} if labelInRange()
+
+replace {
+       jp      NZ,%5
+} by {
+       jr      NZ,%5
+} if labelInRange()
+
+replace {
+       jp      C,%5
+} by {
+       jr      C,%5
+} if labelInRange()
+
+replace {
+       jp      NC,%5
+} by {
+       jr      NC,%5
+} if labelInRange()