Partially implemented RFE #2471534 and some other minor improvements
[fw/sdcc] / src / z80 / peeph-z80.def
index 706c6eadc488001c56801d01b0919a5d94a69ffe..ef6e078f74b0babb811349510f063a1072f11787 100644 (file)
@@ -95,6 +95,20 @@ replace restart {
        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
@@ -127,6 +141,16 @@ replace restart {
        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
@@ -139,10 +163,20 @@ replace restart {
        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
@@ -162,6 +196,16 @@ replace restart {
        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
@@ -226,6 +270,32 @@ replace restart {
        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
@@ -519,7 +589,17 @@ replace restart {
 } 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 {
@@ -779,12 +859,60 @@ 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
@@ -1155,6 +1283,28 @@ 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