inc hl
} if notUsed('bc')
+// Catch double and triple incs before later peepholes introduce an ex de,hl in here.
+replace restart {
+ inc de
+ inc de
+ ld l,e
+ ld h,d
+} by {
+ ld l,e
+ ld h,d
+ ; peephole 0h' incremented in hl instead of de.
+ inc hl
+ inc hl
+} if notUsed('de')
+
replace restart {
inc de
ld l,e
ld c,(hl)
} if notUsed('a'), notUsed('hl')
+replace restart {
+ ld de,#%2 + %3
+ ld a,(de)
+ ld e,a
+} by {
+ ; peephole 0j' used hl for #%2 + %3 instead of de, not going through a.
+ ld hl,#%2 + %3
+ ld e,(hl)
+} if notUsed('a'), notUsed('hl')
+
replace restart {
ex de,hl
push hl
ex de,hl
push de
} by {
- ; peephole 0k' pushed de directly instead of going through hl.
+ ; peephole 0k' pushed hl directly instead of going through de.
push hl
} if notUsed('de'), notUsed('hl')
+replace restart {
+ ld l,%1
+ ld h,d
+ push hl
+} by {
+ ; peephole 0k'' pushed de instead of hl removing a load.
+ ld e,%1
+ push de
+} if notUsed('hl'), notUsed('e')
+
replace restart {
ex de,hl
push bc
push bc
} if notUsed('hl')
+replace restart {
+ ld l,%1
+ ld h,b
+ push hl
+} by {
+ ; peephole 0m' pushed bc instead of hl removing a load.
+ ld c,%1
+ push bc
+} if notUsed('hl'), notUsed('c')
+
replace restart {
ld c,a
push de
ld %4,a
} if notVolatile(%1), operandsNotRelated(%1 %3), operandsNotRelated(%1 %2)
+replace restart {
+ ld %1,a
+ ld a,%2
+ adc a,#%3
+ ld %4,%1
+} by {
+ ld %1,a
+ ; peephole 0t' loaded %4 from a instead of going through %1.
+ ld %4,a
+ ld a,%2
+ adc a,#%3
+} if notVolatile(%1), operandsNotRelated(%1 %2), operandsNotRelated(%4 %2)
+
+replace restart {
+ ld %1,a
+ ld a,#%2
+ adc a,#%3
+ ld %4,%1
+} by {
+ ld %1,a
+ ; peephole 0t'' loaded %4 from a instead of going through %1.
+ ld %4,a
+ ld a,#%2
+ adc a,#%3
+} if notVolatile(%1)
+
replace restart {
ld %1,(hl)
ld e,%1
} by {
ld %1,a
or a,%2
- ; peephole 17 removed load by reordering or arguments.
+ ; peephole 17a removed load by reordering or arguments.
+} if notVolatile(%1)
+
+replace restart {
+ ld %1,a
+ ld a,%2 (ix)
+ or a,%1
+} by {
+ ld %1,a
+ or a,%2 (ix)
+ ; peephole 17b removed load by reordering or arguments.
} if notVolatile(%1)
replace restart {
//add %3, %4
} by {
add a, a
- ; peephole 42b shifts in accumulator insted of %1
+ ; peephole 42b shifted in accumulator insted of %1
ld %1, a
ld a, %2
//add %3, %4
}
+// sdcc does not use the H flag. sla resets it, while add sets it.
+// To ensure that the state of the H flag is not changed by this
+// peephole uncomment the add %3, %4 at the end (since it overwrite the H flag).
+replace restart {
+ ld %1, a
+ sla %1
+ sla %1
+ ld a, %2
+ //add %3, %4
+} by {
+ add a, a
+ add a, a
+ ; peephole 42b' shifted in accumulator insted of %1
+ ld %1, a
+ ld a, %2
+ //add %3, %4
+}
+
+replace restart {
+ ld l,%1 (ix)
+ ld h,%2 (ix)
+ ld a,(hl)
+ inc a
+ ld l,%1 (ix)
+ ld h,%2 (ix)
+ ld (hl),a
+} by {
+ ld l,%1 (ix)
+ ld h,%2 (ix)
+ inc (hl)
+ ; peephole 42c incremented in (hl) instead of going through a.
+} if notUsed('a')
+
+replace restart {
+ ld l,%1 (ix)
+ ld h,%2 (ix)
+ ld a,(hl)
+ dec a
+ ld l,%1 (ix)
+ ld h,%2 (ix)
+ ld (hl),a
+} by {
+ ld l,%1 (ix)
+ ld h,%2 (ix)
+ dec (hl)
+ ; peephole 42d decremented in (hl) instead of going through a.
+} if notUsed('a')
+
replace restart {
ld %1,a
ld a,%2
// ; peephole 50 shortened or using a (which has just been tested to be #0x00).
//} if operandsNotSame3(%3 '(bc)' '(de)')
-replace restart {
- sub a,%1
- jp NZ,%2
- ld a,%3
- or a,a
-} by {
- sub a,%1
- jp NZ,%2
- or a,%3
- ; peephole 51 shortened or using a (which has just been tested to be #0x00).
-}
+// Commented out sine it triggers for %3 od the form (#...)
+//replace restart {
+// sub a,%1
+// jp NZ,%2
+// ld a,%3
+// or a,a
+//} by {
+// sub a,%1
+// jp NZ,%2
+// or a,%3
+// ; peephole 51 shortened or using a (which has just been tested to be #0x00).
+//}
//if operandsNotSame3(%3 '(bc)' '(de)')
replace restart {
; peephole 78 removed addition and loads exploiting commutativity of addition.
} if notUsed('de')
+replace restart {
+ ex de, hl
+ ld hl, #%1
+ add hl, de
+} by {
+ ; peephole 78a removed ex exploiting commutativity of addition.
+ ld de, #%1
+ add hl, de
+} if notUsed('de')
+
+replace restart {
+ ld hl, #%1
+ add hl, %2
+ ex de, hl
+ inc de
+} by {
+ ld hl, #%1+1
+ ; peephole 79 moved increment to constant.
+ add hl, %2
+ ex de, hl
+} if notUsed('hl')
+
// These ex-generating rules should be among the last ones since ex counts as a read from both hl and de for notUsed().
replace restart {
ld d,h