Minor peephole improvement
[fw/sdcc] / src / z80 / peeph-z80.def
index 911dc62240e43100e4484cfa286798f4a78e47de..ba83efff4dbc3e3fc7ac1c14559d66fa027cc948 100644 (file)
@@ -62,7 +62,7 @@ replace restart {
        ld      a,%3 (%1)
 } by {
        ; peephole 0d loaded %2 into a directly instead of going through %1.
-       ld      a,(#%2 + %3)
+       ld      a,(#%2+%3)
 } if notUsed(%1)
 
 replace restart {
@@ -84,6 +84,18 @@ replace restart {
        sub     a,(hl)
 } if notVolatile(%1), notUsed(%1)
 
+replace restart {
+       inc     bc
+       ld      l,c
+       ld      h,b
+} by {
+       ld      l,c
+       ld      h,b
+       ; peephole 0g incremented in hl instead of bc.
+       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
@@ -92,7 +104,7 @@ replace restart {
 } by {
        ld      l,e
        ld      h,d
-       ; peephole 0g incremented in hl instead of de.
+       ; peephole 0h' incremented in hl instead of de.
        inc     hl
        inc     hl
 } if notUsed('de')
@@ -349,7 +361,7 @@ replace restart {
        ; peephole 0zf used hl instead of iy.
        ld      hl,#%1 + %2
        ld      (hl), %4
-} if notUsed('iy'), notUsed('hl')
+} if notUsed('iy'), notUsed('hl'), operandsNotRelated(%4 'h'), operandsNotRelated(%4 'l')
 
 replace restart {
        ld      e,l
@@ -397,6 +409,17 @@ replace restart {
        ld      hl, #%1 + %2
 } if notUsed('bc')
 
+replace restart {
+       ld      c, %1 (%2)
+       ld      b, %3 (%4)
+       ld      l,c
+       ld      h,b
+} by {
+       ; peephole 0zk' stored %1 (%2) %3 (%4) into hl directly instead of going through bc.
+       ld      l, %1 (%2)
+       ld      h, %3 (%4)
+} if notUsed('bc')
+
 replace restart {
        jp      NC,%1
        jp      %2
@@ -1110,12 +1133,48 @@ replace restart {
 } if operandsNotRelated('h' %3)
 // Don't check for volatile since ix points to the stack.
 
+replace restart {
+       ld      %1, a
+       ld      a, %2 (%3)
+       adc     a, #%4
+       ld      l, %1
+} by {
+       ld      l, a
+       ld      a, %2 (%3)
+       adc     a, #%4
+       ; peephole 76 loaded l from a directly instead of going through %1.
+} if notUsed(%1)
+
+replace restart {
+       ld      %1, a
+       ld      a, #%2
+       adc     a, #%3
+       ld      l, %1
+} by {
+       ld      l, a
+       ld      a, #%2
+       adc     a, #%3
+       ; peephole 77 loaded l from a directly instead of going through %1.
+} if notUsed(%1)
+
+replace restart {
+       ld      hl, #%1
+       add     hl, %2
+       ex      de, hl
+       ld      hl, #%3
+       add     hl, de
+} by {
+       ld      hl, #%1+%3
+       add     hl, %2
+       ; peephole 78 removed addition and loads exploiting commutativity of addition.
+} if notUsed('de')
+
 // 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
        ld      e,l
 } by {
-       ; peephole 73 used ex to load hl into de.
+       ; peephole 80 used ex to load hl into de.
        ex      de,hl
 } if notUsed('hl')
 
@@ -1123,7 +1182,7 @@ replace restart {
        ld      e,l
        ld      d,h
 } by {
-       ; peephole 74 used ex to load hl into de.
+       ; peephole 81 used ex to load hl into de.
        ex      de,hl
 } if notUsed('hl')
 
@@ -1131,7 +1190,7 @@ replace restart {
        ld      l,e
        ld      h,d
 } by {
-       ; peephole 75 used ex to load de into hl.
+       ; peephole 82 used ex to load de into hl.
        ex      de,hl
 } if notUsed('de')