X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fpic%2Fpeeph.def;h=8e6df14f6100431cd5e0c267ad197babd481eff0;hb=193aa0c8689791ae7d723d428ebd84e3d06fe7fd;hp=37e15053d3a3d77329e8032646847381730870b1;hpb=770fc9071007c38b9862dabce12704e4c7ac22b1;p=fw%2Fsdcc diff --git a/src/pic/peeph.def b/src/pic/peeph.def index 37e15053..8e6df14f 100644 --- a/src/pic/peeph.def +++ b/src/pic/peeph.def @@ -1,137 +1,331 @@ -//bogus test for pcode +// PIC Port Peep rules +// +// +// INTRODUCTION: +// +// The peep hole optimizer searchs the +// the SDCC generated code for small snippets +// that can be optimized. As a user, you have +// control over this optimization process without +// having to learn the SDCC source code. (However +// you'll still need access to the source since +// these rules are compiled into the source.) +// +// The way it works is you specify the target +// snippet that you want replaced with a more +// efficient snippet that you write. Wild card +// variables allow the rules to be parameterized. +// +// In all of the SDCC ports, labels and operands +// can be wild cards. However, in the PIC even the +// instructions can be wild cards. +// +// EXAMPLE: +// +// Consider Peep Rule 1 as an example. This rule +// replaces some code like: +// +// skpz ;i.e. btfss status,Z +// goto lab1 +// clrw +//lab1: +// +// with: +// +// skpnz ;i.e. btfsc status,Z +// clrw +//lab1 +// +// However, the Rule has four wild cards. +// The first allows the btfss instruction operator +// be anything, not just the Z bit in status register. +// The second wild card applies to a label. +// The third wild card is for an instruction - any +// single instruction can be substituted. +// The fourth wild card is also an instruction. It's +// just an instruction place holder associated with +// a label (think of it as the PIC Port author's laziness +// imposed upon the user). +// +// +// CONDITIONS +// +// There are certain instances where a peep rule may not +// be applicable. Consider this subtle example: +// +// movwf R0 +// movf R0,W +// +// It would seem that the second move is unnecessary. But +// be careful! The movf instruction affects the 'Z' bit. +// So if this sequence is followed by a btfsc status,Z, you +// will have to leave the second move in. +// +// To get around this proble, the peep rule can be followed +// by a conditon: "if NZ". Which is to say, apply the rule +// if Z bit is not needed in the code that follows. The optimizer +// is smart enough to look more than one instruction past the +// target block... +// +// Special commands +// +// +// _NOTBITSKIP_ %1 - Creates a wild card instruction that +// will match all instructions except for +// bit skip instructions (btfsc or btfss) +// _BITSKIP_ %1 - Creates a wild card instruction that only +// will match a bit skip instruction (btfsc +// or btfss) +// _INVERTBITSKIP_ %1 - For the wild card instruction %1, invert +// the state of the bit skip. If %1 is not +// a bit skip instruction, then there's an +// error in the peep rule. +// +// +// + + +// Peep 1 +// Converts +// +// btfss reg1,bit +// goto label +// incf reg2,f +//label +// +// Into: +// +// btfsc reg1,bit +// incf reg2,f +//label +// +// Notice that wild cards will allow any instruction +// besides incf to be used in the above. +// +// Also, notice that this snippet is not valid if +// it follows another skip + replace restart { - movf %1,w ;comment at end -%4: movf %1,w - %2 %3,w + _NOTBITSKIP_ %1 + _BITSKIP_ %2 + goto %3 + %4 +%3: %5 } by { - ; peep test remove redundant move -%4: movf %1,w ;another comment - %2 %3,w -} if AYBABTU %3 + ; peep 1 - test/jump to test/skip + %1 + _INVERTBITSKIP_ %2 + %4 +%3: %5 +} + +replace restart { + _NOTBITSKIP_ %1 + _BITSKIP_ %2 + goto %3 +%4: %5 +%3: %6 +} by { + ; peep 1b - test/jump to test/skip + %1 + _INVERTBITSKIP_ %2 +%4: %5 +%3: %6 +} + + +//bogus test for pcode +//replace restart { +// movf %1,w ;comment at end +//%4: movf %1,w +// RETURN +// clrf INDF +// movlw 0xa5 +// movf fsr,w +// incf indf,f +// %2 +//} by { +// ; peep test remove redundant move +//%4: movf %1,w ;another comment +// %2 +//} if AYBABTU %3 -// peep 1 +// peep 2 replace restart { + movwf %1 movf %1,w - movwf %2 - movf %2,w } by { - ; peep 1 - Removed redundant move - movf %1,w - movwf %2 -} + ; peep 2 - Removed redundant move + movwf %1 +} if NZ -// peep 2 +// peep 3 replace restart { decf %1,f movf %1,w - btfss status,z + btfss STATUS,z goto %2 } by { - ; peep 2 - decf/mov/skpz to decfsz + ; peep 3 - decf/mov/skpz to decfsz decfsz %1,f goto %2 } -// peep 3 + replace restart { - movwf %1 movf %1,w - xorlw %2 + movf %1,w } by { - ; peep 3 - redundant move - movwf %1 - xorlw %2 + ; peep 4 - Removed redundant move + movf %1,w } -// peep 4 + replace restart { - btfsc %1,%2 - goto %3 - incf %4,f -%3: + movlw %1 + movwf %2 + movlw %1 } by { - ;peep 4 - test/jump to test/skip - btfss %1,%2 - incf %4,f -%3: + ; peep 5 - Removed redundant move + movlw %1 + movwf %2 } - -// peep 5 replace restart { - btfss %1,%2 - goto %3 - incf %4,f -%3: + movwf %1 + movwf %1 } by { - ;peep 5 - test/jump to test/skip - btfsc %1,%2 - incf %4,f -%3: + ; peep 6 - Removed redundant move + movwf %1 } -// peep 6 replace restart { - btfss %1,%2 - goto %3 -%4: - incf %5,f -%3: -} by { - ;peep 6 - test/jump to test/skip - btfsc %1,%2 -%4: - incf %5,f -%3: + movlw 0 + iorwf %1,w +} by { + ; peep 7 - Removed redundant move + movf %1,w } -// peep 7 replace restart { - btfsc %1,%2 - goto %3 -%4: - incf %5,f -%3: -} by { - ;peep 6 - test/jump to test/skip - btfss %1,%2 -%4: - incf %5,f -%3: + movf %1,w + movwf %2 + decf %2,f +} by { + ; peep 8 - Removed redundant move + decf %1,w + movwf %2 } replace restart { - movf %1,w - movf %1,w + movwf %1 + movf %2,w + xorwf %1,w } by { - ; peep 8 - Removed redundant move - movf %1,w + ; peep 9a - Removed redundant move + movwf %1 + xorwf %2,w } replace restart { movwf %1 - movf %1,w + movf %2,w + iorwf %1,w } by { - ; peep 9 - Removed redundant move + ; peep 9b - Removed redundant move movwf %1 + iorwf %2,w } replace restart { - movlw %1 + movf %1,w movwf %2 - movlw %1 + movf %2,w } by { - ; peep 10 - Removed redundant move - movlw %1 + ; peep 9c - Removed redundant move + movf %1,w movwf %2 } replace restart { movwf %1 - movwf %1 + movf %1,w + movwf %2 } by { - ; peep 11 - Removed redundant move + ; peep 9d - Removed redundant move movwf %1 + movwf %2 +} if NZ + +// From: Frieder Ferlemann + +replace restart { + iorlw 0 +} by { + ; peep 10a - Removed unnecessary iorlw +} if NZ + +// From: Frieder Ferlemann + +replace restart { + xorlw 0 +} by { + ; peep 10b - Removed unnecessary xorlw +} if NZ + +// From: Frieder Ferlemann + +replace restart { + movf %1,w + movwf %1 +} by { + ; peep 11 - Removed redundant move + movf %1,w +} + +replace restart { + comf %1,w + movwf %1 +} by { + ; peep 12 - Removed redundant move + comf %1,f +} + +replace restart { + clrf %1 + rlf %1,f + movlw 0x01 + xorwf %1,f + movf %1,w + btfss STATUS,2 + goto %2 + +} by { + ; peep 13 - Optimized carry sequence + clrf %1 + incf %1,F + btfss status,C + goto %2 + clrf %1 + } +replace restart { + clrf %1 + rlf %1,f + movlw 0x01 + xorwf %1,f + movf %1,w + btfsc STATUS,2 + goto %2 + +} by { + ; peep 13a - Optimized carry sequence + clrf %1 + incf %1,F + btfsc status,C + goto %2 + clrf %1 + +}