+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()