09d8e160bf9de11df6b80cad7aec0789b4be567d
[fw/sdcc] / src / z80 / peeph-z80.def
1 replace restart {
2         ld      a,%1(%2)
3         bit     %3,a
4         jp      %4,%5
5 } by {
6         bit     %3,%1(%2)
7         jp      %4,%5
8 }
9 replace {
10         ld      %1,%2
11         ld      a,%2
12 } by {
13         ld      %1,%2
14         ld      a,%1
15 }
16 replace {
17         ld      %1,a
18         xor     a,a
19         or      a,%1
20         jp      z,%2
21 } by {
22         ld      %1,a
23         or      a,a
24         jp      z,%2
25 }
26 replace {
27         rlca
28         ld      a,#0x00
29         rla
30 } by {
31         rlca
32         and     a,#0x01
33 }
34 replace {
35         ld      %3,a
36         ld      l,%1
37         ld      h,%2
38         ld      l,(hl)
39         ld      a,%3
40 } by {
41         ld      %3,a
42         ld      l,%1
43         ld      h,%2
44         ld      l,(hl)
45 } if notVolatile %3
46
47 ;
48 ;--------------------------
49 ;
50 replace restart {
51         pop     %1
52         push    %1
53         ld      %1,%2
54 } by {
55         ;       z80 removed redundant pop/push
56         ld      %1,%2
57 }
58 ;
59 ;replace restart {
60         ld      a,%1
61         add     a,#0x01
62         ld      l,a
63 } by {
64         ;       z80 improved usage of 'inc'
65         ld      l,%1
66         inc     l
67         ld      a,l
68 }
69
70 replace restart {
71         ld      a,%1
72         add     a,#0xFF
73         ld      l,a
74 } by {
75         ;       z80 improved usage of 'dec'
76         ld      l,%1
77         dec     l
78         ld      a,l
79 }
80
81 replace restart {
82         ld      l,a
83         ld      c,%1
84         ld      a,l
85 } by {
86         ld      l,a
87         ld      c,%1
88 }
89
90 replace restart {
91         ld      c,l
92         ld      a,c
93         and     a,#%1
94         ld      c,a
95         or      a,a
96 } by {
97         ;       z80 stream lining 'and' logic
98         ld      a,#%1
99         and     a,l
100         ld      c,a
101 }
102
103 replace restart {
104         ld      a,c
105         and     a,#%1
106         ld      c,a
107         or      a,a
108 } by {
109         ;       z80 stream lining 'and' logic
110         ld      a,#%1
111         and     a,c
112         ld      c,a
113 }
114
115 replace restart {
116         ld      a,c
117         or      a,#%1
118         ld      c,a
119 } by {
120         ;       z80 stream lining 'or' logic
121         ld      a,#%1
122         or      a,c
123         ld      c,a
124 }
125
126 ; I don't think this works. neg does a unary minus of A, not HL  -- EEP
127 ;
128 ;replace {
129 ;       ld      a,c
130 ;       sub     a,%1
131 ;       ld      l,a
132 ;       ld      a,b
133 ;       sbc     a,%2
134 ;       ld      h,a
135 ;} by {
136 ;       ;       z80/z180 peephole byte pointer subtraction
137 ;       xor     a
138 ;       ld      h,%1
139 ;       ld      l,%2
140 ;       sbc     hl,bc
141 ;       neg
142 ;}
143
144 replace {
145 %1:
146         in0     a,(%2)
147         and     a,#%3
148         jp      z,%4
149 %5:
150         jp      %6
151 %4:
152         call    %7
153         jp      %1
154 %6:
155         ret
156 } by {
157 %1:
158         in0     a,(%2)
159         and     a,#%3
160         jp      nz,%5
161 %4:
162         call    %7
163         jp      %1
164 %5:
165 %6:
166         ret
167 }
168
169