Partially implemented RFE #2471534 and some other minor improvements
[fw/sdcc] / src / z80 / peeph-z80.def
index c50c48e6ee548fa32898de7492986feb168a6285..ef6e078f74b0babb811349510f063a1072f11787 100644 (file)
@@ -163,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
@@ -186,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
@@ -839,7 +859,25 @@ 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
@@ -1245,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