X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fz80%2Fpeeph-z80.def;h=6d43c9b2439c503ca1d660a50ee2256ddffc6695;hb=80972b2e54c9b88f11c27b878874fd2a6a681391;hp=6c258c09e468168acb30678f188cdd59c628ab02;hpb=f8ebe92b9c9264ea1e38ec65e754f970d95faec8;p=fw%2Fsdcc diff --git a/src/z80/peeph-z80.def b/src/z80/peeph-z80.def index 6c258c09..6d43c9b2 100644 --- a/src/z80/peeph-z80.def +++ b/src/z80/peeph-z80.def @@ -141,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 @@ -153,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 @@ -176,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 @@ -240,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 @@ -533,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 { @@ -793,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 @@ -952,17 +1036,18 @@ replace restart { // ; 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 { @@ -1199,6 +1284,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