11f42204a07b3ecf03eab5aeffeed332bd9f62f8
[fw/sdcc] / src / ds390 / peeph.def
1 //replace restart {
2 //        pop  %1
3 //        push %1
4 //} by {
5 //        ; Peephole 1     removed pop %1 push %1 (not push pop)
6 //}
7
8 //replace restart {
9 //        pop  %1
10 //        mov  %2,%3
11 //        push %1
12 //} by {
13 //        ; Peephole 2     removed pop %1 push %1 (not push pop)
14 //        mov  %2,%3 
15 //}
16
17 //
18 // added by Jean Louis VERN for
19 // his shift stuff
20 replace restart {
21         xch  a,%1
22         xch  a,%1
23 } by {
24         ; Peephole 2.a   removed redundant xch xch
25 }
26
27 replace restart {
28 // saving 2 byte
29         mov  %1,#0x00
30         mov  a,#0x00
31 } by {
32         ; Peephole 3.a   changed mov to clr
33         clr  a
34         mov  %1,a
35 }
36
37 replace restart {
38 // saving 1 byte
39         mov  %1,#0x00
40         clr  a
41 } by {
42         ; Peephole 3.b   changed mov to clr
43         clr  a
44         mov  %1,a
45 }
46
47 replace restart {
48 // saving 1 byte, loosing 1 cycle but maybe allowing peephole 3.b to start
49         mov  %1,#0x00
50         mov  %2,#0x00
51         mov  a,%3
52 } by {
53         ; Peephole 3.c   changed mov to clr
54         clr  a
55         mov  %1,a
56         mov  %2,a
57         mov  a,%3
58 }
59
60 replace restart {
61         mov     a,#0
62 } by {
63         ; Peephole 3.d   changed mov to clr
64         clr     a
65 }
66
67 replace {
68         mov  %1,a
69         mov  dptr,#%2
70         mov  a,%1
71         movx @dptr,a
72 } by {
73         ; Peephole 100   removed redundant mov
74         mov  %1,a
75         mov  dptr,#%2
76         movx @dptr,a
77 }
78
79 replace {
80         mov  a,acc
81 } by {
82         ;  Peephole 100.a   removed redundant mov
83 }
84
85 replace {
86         mov  a,%1
87         movx @dptr,a
88         inc  dptr
89         mov  a,%1
90         movx @dptr,a
91 } by {
92         ; Peephole 101   removed redundant mov
93         mov  a,%1
94         movx @dptr,a
95         inc  dptr
96         movx @dptr,a
97 }
98
99 replace {
100         mov  %1,%2
101         ljmp %3
102 %4:
103         mov  %1,%5
104 %3:
105         mov  dpl,%1
106 %7:
107         mov  sp,bp
108         pop  bp
109 } by {
110         ; Peephole 102   removed redundant mov
111         mov  dpl,%2
112         ljmp %3
113 %4:
114         mov  dpl,%5
115 %3:
116 %7:
117         mov  sp,bp
118         pop  bp
119 }
120
121 replace {
122         mov  %1,%2
123         ljmp %3
124 %4:
125         mov  a%1,%5
126 %3:
127         mov  dpl,%1
128 %7:
129         mov  sp,bp
130         pop  bp
131 } by {
132         ; Peephole 103   removed redundant mov
133         mov  dpl,%2
134         ljmp %3
135 %4:
136         mov  dpl,%5
137 %3:
138 %7:
139         mov  sp,bp
140         pop  bp
141 }
142
143 replace {
144         mov  a,bp
145         clr  c
146         add  a,#0x01
147         mov  r%1,a
148 } by {
149         ; Peephole 104   optimized increment (acc not set to r%1, flags undefined)
150         mov  r%1,bp
151         inc  r%1
152 }
153
154 replace {
155         mov  %1,a
156         mov  a,%1
157 } by {
158         ; Peephole 105   removed redundant mov
159         mov  %1,a
160 }
161
162 replace {
163         mov  %1,a
164         clr  c
165         mov  a,%1
166 } by {
167         ; Peephole 106   removed redundant mov 
168         mov  %1,a
169         clr  c
170 }
171
172 replace {
173         ljmp %1
174 %1:
175 } by {
176         ; Peephole 107   removed redundant ljmp
177 %1:
178 }
179
180 replace {
181         jc   %1
182         ljmp %5
183 %1:
184 } by {
185         ; Peephole 108   removed ljmp by inverse jump logic
186         jnc  %5
187 %1:
188 } if labelInRange
189
190 replace {
191         jz   %1
192         ljmp %5
193 %1:
194 } by {
195         ; Peephole 109   removed ljmp by inverse jump logic
196         jnz  %5
197 %1:
198 } if labelInRange
199
200 replace {
201         jnz  %1
202         ljmp %5
203 %1:
204 } by {
205         ; Peephole 110   removed ljmp by inverse jump logic
206         jz  %5
207 %1:
208 } if labelInRange
209
210 replace {
211         jb   %1,%2
212         ljmp %5
213 %2:
214 } by {
215         ; Peephole 111   removed ljmp by inverse jump logic
216         jnb  %1,%5
217 %2:
218 } if labelInRange
219
220 replace {
221         jnb  %1,%2
222         ljmp %5
223 %2:
224 } by {
225        ; Peephole 112   removed ljmp by inverse jump logic
226         jb   %1,%5
227 %2:
228 } if labelInRange
229
230 replace {
231         ljmp %5
232 %1:
233 } by {
234         ; Peephole 132   changed ljmp to sjmp
235         sjmp %5
236 %1:
237 } if labelInRange
238
239
240 replace {
241         clr  a
242         cjne %1,%2,%3
243         cpl  a
244 %3:
245         rrc  a
246         mov  %4,c
247 } by {
248         ; Peephole 113   optimized misc sequence
249         clr  %4
250         cjne %1,%2,%3
251         setb %4
252 %3:
253 } if labelRefCount %3 1
254
255 replace {
256         clr  a
257         cjne %1,%2,%3
258         cjne %10,%11,%3
259         cpl  a
260 %3:
261         rrc  a
262         mov  %4,c
263 } by {
264         ; Peephole 114   optimized misc sequence
265         clr  %4
266         cjne %1,%2,%3
267         cjne %10,%11,%3
268         setb %4
269 %3:
270 } if labelRefCount %3 2
271
272 replace {
273         clr  a
274         cjne %1,%2,%3
275         cpl  a
276 %3:
277         jnz  %4
278 } by {
279         ; Peephole 115   jump optimization 
280         cjne %1,%2,%3
281         sjmp %4
282 %3:
283 } if labelRefCount %3 1
284
285 replace {
286         clr  a
287         cjne %1,%2,%3
288         cjne %9,%10,%3
289         cpl  a
290 %3:
291         jnz  %4
292 } by {
293         ; Peephole 116   jump optimization
294         cjne %1,%2,%3
295         cjne %9,%10,%3
296         sjmp %4
297 %3:
298 } if labelRefCount %3 2
299
300 replace {
301         clr  a
302         cjne %1,%2,%3
303         cjne %9,%10,%3
304         cjne %11,%12,%3
305         cpl  a
306 %3:
307         jnz %4
308 } by {
309         ; Peephole 117   jump optimization
310         cjne %1,%2,%3
311         cjne %9,%10,%3
312         cjne %11,%12,%3
313         sjmp %4
314 %3:
315 } if labelRefCount %3 3
316
317 replace {
318         clr  a
319         cjne %1,%2,%3
320         cjne %9,%10,%3
321         cjne %11,%12,%3
322         cjne %13,%14,%3
323         cpl  a
324 %3:
325         jnz %4
326 } by {
327         ; Peephole 118   jump optimization
328         cjne %1,%2,%3
329         cjne %9,%10,%3
330         cjne %11,%12,%3
331         cjne %13,%14,%3
332         sjmp %4
333 %3:
334 } if labelRefCount %3 4
335
336 replace {
337         mov  a,#0x01
338         cjne %1,%2,%3
339         clr  a
340 %3:
341         jnz  %4
342 } by {
343         ; Peephole 119   jump optimization
344         cjne %1,%2,%4
345 %3:
346 } if labelRefCount %3 1
347
348 replace {
349         mov  a,#0x01
350         cjne %1,%2,%3
351         cjne %10,%11,%3
352         clr  a
353 %3:
354         jnz  %4
355 } by {
356         ; Peephole 120   jump optimization
357         cjne %1,%2,%4
358         cjne %10,%11,%4
359 %3:
360 } if labelRefCount %3 2
361
362 replace {
363         mov  a,#0x01
364         cjne %1,%2,%3
365         cjne %10,%11,%3
366         cjne %12,%13,%3
367         clr  a
368 %3:
369         jnz  %4
370 } by {
371         ; Peephole 121   jump optimization
372         cjne %1,%2,%4
373         cjne %10,%11,%4
374         cjne %12,%13,%4
375 %3:
376 } if labelRefCount %3 3
377
378 replace {
379         mov  a,#0x01
380         cjne %1,%2,%3
381         cjne %10,%11,%3
382         cjne %12,%13,%3
383         cjne %14,%15,%3
384         clr  a
385 %3:
386         jnz  %4
387 } by {
388         ; Peephole 122   jump optimization
389         cjne %1,%2,%4
390         cjne %10,%11,%4
391         cjne %12,%13,%4
392         cjne %14,%15,%4
393 %3:
394 } if labelRefCount %3 4
395
396 replace {
397         mov  a,#0x01
398         cjne %1,%2,%3
399         clr  a
400 %3:
401         jz   %4
402 } by {
403         ; Peephole 123   jump optimization
404         cjne %1,%2,%3
405         smp  %4
406 %3:
407 } if labelRefCount %3 1
408
409 replace {
410         mov  a,#0x01
411         cjne %1,%2,%3
412         cjne %10,%11,%3
413         clr  a
414 %3:
415         jz   %4
416 } by {
417         ; Peephole 124   jump optimization
418         cjne %1,%2,%3
419         cjne %10,%11,%3
420         sjmp  %4
421 %3:
422 } if labelRefCount %3 2
423
424 replace {
425         mov  a,#0x01
426         cjne %1,%2,%3
427         cjne %10,%11,%3
428         cjne %12,%13,%3
429         clr  a
430 %3:
431         jz   %4
432 } by {
433         ; Peephole 125   jump optimization
434         cjne %1,%2,%3
435         cjne %10,%11,%3
436         cjne %12,%13,%3
437         sjmp %4
438 %3:
439 } if labelRefCount %3 3
440
441 replace {
442         mov  a,#0x01
443         cjne %1,%2,%3
444         cjne %10,%11,%3
445         cjne %12,%13,%3
446         cjne %14,%15,%3
447         clr  a
448 %3:
449         jz   %4
450 } by {
451         ; Peephole 126   jump optimization
452         cjne %1,%2,%3
453         cjne %10,%11,%3
454         cjne %12,%13,%3
455         cjne %14,%15,%3
456         sjmp %4
457 %3:
458 } if labelRefCount %3 4
459
460 replace {
461         push psw
462         mov  psw,%1
463         push bp
464         mov  bp,%2
465 %3:
466         mov  %2,bp
467         pop  bp
468         pop  psw
469         ret
470 } by {
471         ; Peephole 127   removed misc sequence
472         ret
473 } if labelRefCount %3 0
474
475 replace {
476         clr  a
477         rlc  a
478         jz   %1
479 } by {
480         ; Peephole 128   jump optimization
481         jnc  %1
482 }
483
484 replace {
485         clr  a
486         rlc  a
487         jnz  %1
488 } by {
489         ; Peephole 129   jump optimization
490         jc   %1
491 }
492
493 replace { 
494         mov  r%1,@r%2
495 } by {
496         ; Peephole 130   changed target address mode r%1 to ar%1
497         mov  ar%1,@r%2
498 }
499
500 replace { 
501         mov  a,%1
502         subb a,#0x01
503         mov  %2,a
504         mov  %1,%2
505 } by {
506         ; Peephole 131   optimized decrement (not caring for c)
507         dec  %1         
508         mov  %2,%1      
509 }
510
511 replace {
512         mov  r%1,%2
513         mov  ar%3,@r%1
514         inc  r%3
515         mov  r%4,%2
516         mov  @r%4,ar%3
517 } by {
518         ; Peephole 133   removed redundant moves
519         mov  r%1,%2
520         inc  @r%1
521         mov  ar%3,@r%1
522 }
523
524 replace {
525         mov  r%1,%2
526         mov  ar%3,@r%1
527         dec  r%3
528         mov  r%4,%2
529         mov  @r%4,ar%3
530 } by {
531         ; Peephole 134   removed redundant moves
532         mov  r%1,%2
533         dec  @r%1
534         mov  ar%3,@r%1
535 }
536
537 replace {
538         mov  r%1,a
539         mov  a,r%2
540         orl  a,r%1
541 } by {
542         ; Peephole 135   removed redundant mov
543         mov  r%1,a
544         orl  a,r%2
545 }
546
547 replace {
548         mov  %1,a
549         mov  dpl,%2
550         mov  dph,%3
551         mov  dpx,%4
552         mov  a,%1
553 } by {
554         ; Peephole 136a   removed redundant moves
555         mov  %1,a
556         mov  dpl,%2
557         mov  dph,%3
558         mov  dpx,%4
559 } if 24bitMode
560
561 replace {
562         mov  %1,a
563         mov  dpl,%2
564         mov  dph,%3
565         mov  a,%1
566 } by {
567         ; Peephole 136   removed redundant moves
568         mov  %1,a
569         mov  dpl,%2
570         mov  dph,%3
571 }
572
573 // WTF? Doesn't look sensible to me...
574 //replace {
575 //        mov  b,#0x00
576 //        mov  a,%1
577 //        cjne %2,%3,%4
578 //        mov  b,#0x01
579 //%4:
580 //        mov  a,b
581 //        jz   %5
582 //} by {
583 //        ; Peephole 137   optimized misc jump sequence
584 //        mov  a,%1
585 //        cjne %2,%3,%5
586 //%4:
587 //} if labelRefCount %4 1
588 //
589 //replace {
590 //        mov  b,#0x00
591 //        mov  a,%1
592 //        cjne %2,%3,%4
593 //        mov  b,#0x01
594 //%4:
595 //        mov  a,b
596 //        jnz  %5
597 //} by {
598 //        ; Peephole 138   optimized misc jump sequence
599 //        mov  a,%1
600 //        cjne %2,%3,%4
601 //        sjmp %5
602 //%4:
603 //} if labelRefCount %4 1
604
605 replace {
606         mov  r%1,a
607         anl  ar%1,%2
608         mov  a,r%1
609 } by {
610         ; Peephole 139   removed redundant mov
611         anl  a,%2
612         mov  r%1,a
613 }
614
615 replace {
616         mov  r%1,a
617         orl  ar%1,%2
618         mov  a,r%1
619 } by {
620         ; Peephole 140   removed redundant mov
621         orl  a,%2
622         mov  r%1,a }
623
624 replace {
625         mov  r%1,a
626         xrl  ar%1,%2
627         mov  a,r%1
628 } by {
629         ; Peephole 141   removed redundant mov
630         xrl  a,%2
631         mov  r%1,a
632 }
633
634 replace {
635         mov  r%1,a
636         mov  r%2,ar%1
637         mov  ar%1,@r%2
638 } by {
639         ; Peephole 142   removed redundant moves
640         mov  r%2,a
641         mov  ar%1,@r%2
642 }
643
644 replace {
645         rlc  a
646         mov  acc.0,c
647 } by {
648         ; Peephole 143   converted rlc to rl
649         rl   a
650 }
651
652 replace {
653         rrc  a
654         mov  acc.7,c
655 } by {
656         ; Peephole 144   converted rrc to rc
657         rr   a
658 }
659
660 replace {
661         clr  c
662         addc a,%1
663 } by {
664         ; Peephole 145   changed to add without carry  
665         add  a,%1
666 }
667
668 replace {
669         clr  c
670         mov  a,%1
671         addc a,%2
672 } by {
673         ; Peephole 146   changed to add without carry
674         mov  a,%1
675         add  a,%2
676 }
677
678 replace {
679         orl  r%1,a
680 } by {
681         ; Peephole 147   changed target address mode r%1 to ar%1
682         orl  ar%1,a
683 }
684
685 replace {
686         anl  r%1,a
687 } by {
688         ; Peephole 148   changed target address mode r%1 to ar%1
689         anl  ar%1,a
690 }
691
692 replace {
693         xrl  r%1,a
694 } by {
695         ; Peephole 149   changed target address mode r%1 to ar%1
696         xrl  ar%1,a
697 }
698
699 replace {
700         mov  %1,dpl
701         mov  dpl,%1
702 %9:
703         ret
704 } by {
705         ; Peephole 150   removed misc moves via dpl before return
706 %9:
707         ret
708 }
709
710 replace {
711         mov  %1,dpl
712         mov  %2,dph
713         mov  dpl,%1
714         mov  dph,%2
715 %9:
716         ret
717 } by {
718         ; Peephole 151   removed misc moves via dph, dpl before return
719 %9:
720         ret
721 }
722
723 replace {
724         mov  %1,dpl
725         mov  %2,dph
726         mov  dpl,%1
727 %9:
728         ret
729 } by {
730         ; Peephole 152   removed misc moves via dph, dpl before return
731 %9:
732         ret
733 }
734
735 replace {
736         mov  %1,dpl
737         mov  %2,dph
738         mov  %3,b
739         mov  dpl,%1
740         mov  dph,%2
741         mov  b,%3
742 %9:
743         ret
744 } by {
745         ; Peephole 153   removed misc moves via dph, dpl, b before return
746 %9:
747         ret
748 }
749
750 replace {
751         mov  %1,dpl
752         mov  %2,dph
753         mov  %3,b
754         mov  dpl,%1
755 %9:
756         ret
757 } by {
758         ; Peephole 154   removed misc moves via dph, dpl, b before return
759 %9:
760         ret
761 }
762
763 replace {
764         mov  %1,dpl
765         mov  %2,dph
766         mov  %3,b
767         mov  dpl,%1
768         mov  dph,%2
769 %9:
770         ret
771 } by {
772         ; Peephole 155   removed misc moves via dph, dpl, b before return
773 %9:
774         ret
775 }
776
777 replace {
778         mov  %1,dpl
779         mov  %2,dph
780         mov  %3,b
781         mov  %4,a
782         mov  dpl,%1
783         mov  dph,%2
784         mov  b,%3
785         mov  a,%4
786 %9:
787         ret
788 } by {
789         ; Peephole 156   removed misc moves via dph, dpl, b, a before return
790 %9:
791         ret
792 }
793
794 replace {
795         mov  %1,dpl
796         mov  %2,dph
797         mov  %3,b
798         mov  %4,a
799         mov  dpl,%1
800         mov  dph,%2
801 %9:
802         ret
803 } by {
804         ; Peephole 157   removed misc moves via dph, dpl, b, a before return
805 %9:
806         ret
807 }
808
809 replace {
810         mov  %1,dpl
811         mov  %2,dph
812         mov  %3,b
813         mov  %4,a
814         mov  dpl,%1
815 %9:
816         ret } by {
817         ; Peephole 158   removed misc moves via dph, dpl, b, a before return
818 %9:
819         ret }
820
821 replace {
822         mov  %1,#%2
823         xrl  %1,#0x80
824 } by {
825         ; Peephole 159   avoided xrl during execution
826         mov  %1,#(%2 ^ 0x80)
827 }
828
829 replace {
830         jnc  %1
831         sjmp %2
832 %1:
833 } by {
834         ; Peephole 160   removed sjmp by inverse jump logic
835         jc   %2
836 %1:}
837
838 replace {
839         jc   %1
840         sjmp %2
841 %1:
842 } by {
843         ; Peephole 161   removed sjmp by inverse jump logic
844         jnc  %2
845 %1:}
846
847 replace {
848         jnz  %1
849         sjmp %2
850 %1:
851 } by {
852         ; Peephole 162   removed sjmp by inverse jump logic
853         jz   %2
854 %1:}
855
856 replace {
857         jz   %1
858         sjmp %2
859 %1:
860 } by {
861         ; Peephole 163   removed sjmp by inverse jump logic
862         jnz  %2
863 %1:}
864
865 replace {
866         jnb  %3,%1
867         sjmp %2
868 %1:
869 } by {
870         ; Peephole 164   removed sjmp by inverse jump logic
871         jb   %3,%2
872 %1:
873 }
874
875 replace {
876         jb   %3,%1
877         sjmp %2
878 %1:
879 } by {
880         ; Peephole 165   removed sjmp by inverse jump logic
881         jnb  %3,%2
882 %1:
883 }
884
885 replace {
886         mov  %1,%2
887         mov  %3,%1
888         mov  %2,%1
889 } by {
890         ; Peephole 166   removed redundant mov
891         mov  %1,%2
892         mov  %3,%1 }
893
894 replace {
895         mov  c,%1
896         cpl  c
897         mov  %1,c
898 } by {
899         ; Peephole 167   removed redundant bit moves (c not set to %1)
900         cpl  %1 }
901
902 replace {
903         jnb  %1,%2
904         sjmp %3
905 %2:} by {
906         ; Peephole 168   jump optimization
907         jb   %1,%3
908 %2:}
909
910 replace {
911         jb   %1,%2
912         sjmp %3
913 %2:} by {
914         ; Peephole 169   jump optimization
915         jnb  %1,%3
916 %2:}
917
918 replace {
919         clr  a
920         cjne %1,%2,%3
921         cpl  a
922 %3:
923         jz   %4
924 } by {
925         ; Peephole 170   jump optimization
926         cjne %1,%2,%4
927 %3:
928 } if labelRefCount %3 1
929
930 replace {
931         clr  a
932         cjne %1,%2,%3
933         cjne %9,%10,%3
934         cpl  a
935 %3:
936         jz   %4
937 } by {
938         ; Peephole 171   jump optimization
939         cjne %1,%2,%4
940         cjne %9,%10,%4
941 %3:
942 } if labelRefCount %3 2
943
944 replace {
945         clr  a
946         cjne %1,%2,%3
947         cjne %9,%10,%3
948         cjne %11,%12,%3
949         cpl  a
950 %3:
951         jz   %4
952 } by {
953         ; Peephole 172   jump optimization
954         cjne %1,%2,%4
955         cjne %9,%10,%4
956         cjne %11,%12,%4
957 %3:
958 } if labelRefCount %3 3
959
960 replace {
961         clr  a
962         cjne %1,%2,%3
963         cjne %9,%10,%3
964         cjne %11,%12,%3
965         cjne %13,%14,%3
966         cpl  a
967 %3:
968         jz   %4
969 } by {
970         ; Peephole 173   jump optimization
971         cjne %1,%2,%4
972         cjne %9,%10,%4
973         cjne %11,%12,%4
974         cjne %13,%14,%4
975 %3:
976 } if labelRefCount %3 4
977
978 replace {
979         mov  r%1,%2
980         clr  c
981         mov  a,r%1
982         subb a,#0x01
983         mov  %2,a
984 } by {
985         ; Peephole 174   optimized decrement (acc not set to %2, flags undefined)
986         mov  r%1,%2
987         dec  %2
988 }
989
990
991 replace {
992         mov  r%1,%2
993         mov  a,r%1
994         add  a,#0x01
995         mov  %2,a
996 } by {
997         ; Peephole 175   optimized increment (acc not set to %2, flags undefined)
998         mov  r%1,%2
999         inc  %2
1000 }
1001
1002 replace {
1003         mov  %1,@r%2
1004         inc  %1
1005         mov  @r%2,%1
1006 } by {
1007         ; Peephole 176   optimized increment, removed redundant mov
1008         inc  @r%2
1009         mov  %1,@r%2
1010 }
1011
1012 // this one will screw assignes to volatile/sfr's
1013 //replace {
1014 //        mov  %1,%2
1015 //        mov  %2,%1
1016 //} by {
1017 //        ; Peephole 177   removed redundant mov
1018 //        mov  %1,%2
1019 //}
1020
1021 replace {
1022         mov  a,%1
1023         mov  b,a
1024         mov  a,%2
1025 } by {
1026         ; Peephole 178   removed redundant mov
1027         mov  b,%1
1028         mov  a,%2
1029 }
1030
1031 // rules 179-182 provided by : Frieder <fe@lake.iup.uni-heidelberg.de>
1032 // saving 2 byte, 1 cycle
1033 replace {
1034         mov  b,#0x00
1035         mov  a,#0x00
1036 } by {
1037         ; Peephole 179   changed mov to clr
1038         clr  a
1039         mov  b,a
1040 }
1041
1042 // saving 1 byte, 0 cycles
1043 replace {
1044         mov  a,#0x00
1045 } by {
1046         ; Peephole 180   changed mov to clr
1047         clr  a
1048 }
1049
1050 replace {
1051         mov  dpl,#0x00
1052         mov  dph,#0x00
1053         mov  dpx,#0x00
1054 } by {
1055         ; Peephole 181a   used 24 bit load of dptr
1056         mov  dptr,#0x0000
1057 } if 24bitMode
1058
1059 // saving 3 byte, 2 cycles, return(NULL) profits here
1060 replace {
1061         mov  dpl,#0x00
1062         mov  dph,#0x00
1063 } by {
1064         ; Peephole 181   used 16 bit load of dptr
1065         mov  dptr,#0x0000
1066 }
1067
1068 replace {
1069         mov dpl,#%1
1070         mov dph,#(%1 >> 8)
1071         mov dpx,#(%1 >> 16)
1072 } by {
1073         ; Peephole 182b used 24 bit load of DPTR
1074         mov dptr,#%1
1075 }
1076
1077 // saves 2 bytes, ?? cycles.
1078 replace {
1079         mov  dpl,#0x%1
1080         mov  dph,#0x%2
1081         mov  dpx,#0x%3
1082 } by {
1083         ; Peephole 182a   used 24 bit load of dptr
1084         mov     dptr,#0x%3%2%1
1085 } if 24bitModeAndPortDS390
1086
1087 // saves 2 bytes, ?? cycles.
1088 replace {
1089         mov  dpl,#%1
1090         mov  dph,#%2
1091         mov  dpx,#%3
1092 } by {
1093         ; Peephole 182b   used 24 bit load of dptr
1094         mov  dptr,#((%3 << 16) + (%2 << 8) + %1)
1095 } if 24bitModeAndPortDS390
1096
1097 // saving 3 byte, 2 cycles, return(float_constant) profits here
1098 replace {
1099         mov  dpl,#0x%1
1100         mov  dph,#0x%2
1101 } by {
1102         ; Peephole 182c   used 16 bit load of dptr
1103         mov  dptr,#0x%2%1
1104 }
1105
1106 // saving 3 byte, 2 cycles, return(float_constant) profits here
1107 replace {
1108         mov  dpl,#%1
1109         mov  dph,#%2
1110 } by {
1111         ; Peephole 182   used 16 bit load of dptr
1112         mov  dptr,#(((%2)<<8) + %1)
1113 }
1114
1115 replace {
1116         anl  %1,#%2
1117         anl  %1,#%3
1118 } by {
1119         ; Peephole 183   avoided anl during execution
1120         anl  %1,#(%2 & %3)
1121 }
1122
1123 replace {
1124         mov  %1,a
1125         cpl  a
1126         mov  %1,a
1127 } by {
1128         ; Peephole 184   removed redundant mov
1129         cpl  a
1130         mov  %1,a
1131 }
1132
1133 replace {
1134 // acc being incremented might cause problems
1135         mov  %1,a
1136         inc  %1
1137 } by {
1138         ; Peephole 185   changed order of increment (acc incremented also!)
1139         inc  a
1140         mov  %1,a
1141 }
1142
1143 replace {
1144         add  a,#%1
1145         mov  dpl,a
1146         clr  a
1147         addc a,#(%1 >> 8)
1148         mov  dph,a
1149         clr  a
1150         movc a,@a+dptr
1151         mov  %2,a
1152         inc  dptr
1153         clr  a
1154         movc a,@a+dptr
1155         mov  %3,a
1156         inc  dptr
1157         clr  a
1158         movc a,@a+dptr
1159         mov  %4,a
1160         inc  dptr
1161         clr  a  
1162 } by {
1163         ; Peephole 186.a   optimized movc sequence
1164         mov  dptr,#%1
1165         mov  b,acc
1166         movc a,@a+dptr
1167         mov  %2,a
1168         mov  acc,b
1169         inc  dptr       
1170         movc a,@a+dptr
1171         mov  %3,a
1172         mov  acc,b
1173         inc  dptr
1174         mov  %4,a
1175         mov  acc,b
1176         inc  dptr
1177 }
1178
1179 replace {
1180         add  a,#%1
1181         mov  dpl,a
1182         clr  a
1183         addc a,#(%1 >> 8)
1184         mov  dph,a
1185         clr  a
1186         movc a,@a+dptr
1187         mov  %2,a
1188         inc  dptr
1189         clr  a
1190         movc a,@a+dptr
1191         mov  %3,a
1192         inc  dptr
1193         clr  a
1194 } by {
1195         ; Peephole 186.b   optimized movc sequence
1196         mov  dptr,#%1
1197         mov  b,acc
1198         movc a,@a+dptr
1199         mov  %2,a
1200         mov  acc,b
1201         inc  dptr       
1202         movc a,@a+dptr
1203         mov  %3,a
1204         mov  acc,b
1205         inc  dptr       
1206 }
1207
1208 replace {
1209         add  a,#%1
1210         mov  dpl,a
1211         clr  a
1212         addc a,#(%1 >> 8)
1213         mov  dph,a
1214         clr  a
1215         movc a,@a+dptr
1216         mov  %2,a
1217         inc  dptr
1218         clr  a
1219 } by {
1220         ; Peephole 186.c   optimized movc sequence
1221         mov  dptr,#%1
1222         mov  b,acc
1223         movc a,@a+dptr
1224         mov  %2,a
1225         mov  acc,b
1226         inc  dptr
1227 }
1228
1229 replace {
1230         add  a,#%1
1231         mov  dpl,a
1232         clr  a
1233         addc a,#(%1 >> 8)
1234         mov  dph,a
1235         clr  a
1236         movc a,@a+dptr
1237 } by {
1238         ; Peephole 186   optimized movc sequence
1239         mov  dptr,#%1
1240         movc a,@a+dptr
1241 }
1242
1243 replace {
1244         mov  r%1,%2
1245         anl  ar%1,#%3
1246         mov  a,r%1
1247 } by {
1248         ; Peephole 187   used a instead of ar%1 for anl
1249         mov  a,%2
1250         anl  a,#%3
1251         mov  r%1,a
1252 }
1253
1254 replace {
1255         mov  %1,a
1256         mov  dptr,%2
1257         movc a,@a+dptr
1258         mov  %1,a
1259 } by {
1260         ; Peephole 188   removed redundant mov
1261         mov  dptr,%2
1262         movc a,@a+dptr
1263         mov  %1,a
1264 }
1265
1266 replace {
1267         anl  a,#0x0f
1268         mov  %1,a
1269         mov  a,#0x0f
1270         anl  a,%1
1271 } by {
1272         ; Peephole 189   removed redundant mov and anl
1273         anl  a,#0x0f
1274         mov  %1,a
1275 }
1276
1277 // rules 190 & 191 need to be in order
1278 replace {
1279         mov  a,%1
1280         lcall __gptrput
1281         mov  a,%1
1282 } by {
1283         ; Peephole 190   removed redundant mov
1284         mov  a,%1
1285         lcall __gptrput
1286 }
1287
1288 replace {
1289         mov  %1,a
1290         mov  dpl,%2
1291         mov  dph,%3
1292         mov  b,%4
1293         mov  a,%1
1294 } by {
1295         ; Peephole 191   removed redundant mov
1296         mov  %1,a
1297         mov  dpl,%2
1298         mov  dph,%3
1299         mov  b,%4
1300 }
1301
1302 replace {
1303         mov  r%1,a
1304         mov  @r%2,ar%1
1305 } by {
1306         ; Peephole 192   used a instead of ar%1 as source
1307         mov  r%1,a
1308         mov  @r%2,a
1309 }
1310
1311 replace {
1312         jnz  %3
1313         mov  a,%4
1314         jnz  %3
1315         mov  a,%9
1316         jnz  %3
1317         mov  a,%12
1318         cjne %13,%14,%3
1319         sjmp %7
1320 %3:
1321         sjmp %8
1322 } by {
1323         ; Peephole 193.a optimized misc jump sequence
1324         jnz  %8
1325         mov  a,%4
1326         jnz  %8
1327         mov  a,%9
1328         jnz  %8
1329         mov  a,%12
1330         cjne %13,%14,%8
1331         sjmp %7
1332 ;%3:
1333 } if labelRefCount %3 4
1334
1335 replace {
1336         cjne %1,%2,%3
1337         mov  a,%4
1338         cjne %5,%6,%3
1339         mov  a,%9
1340         cjne %10,%11,%3
1341         mov  a,%12
1342         cjne %13,%14,%3
1343         sjmp %7
1344 %3:
1345         sjmp %8
1346 } by {
1347         ; Peephole 193   optimized misc jump sequence
1348         cjne %1,%2,%8
1349         mov  a,%4
1350         cjne %5,%6,%8
1351         mov  a,%9
1352         cjne %10,%11,%8
1353         mov  a,%12
1354         cjne %13,%14,%8
1355         sjmp %7
1356 ;%3:
1357 } if labelRefCount %3 4
1358
1359 replace {
1360         cjne @%1,%2,%3
1361         inc  %1
1362         cjne @%1,%6,%3
1363         inc  %1
1364         cjne @%1,%11,%3
1365         inc  %1
1366         cjne @%1,%14,%3
1367         sjmp %7
1368 %3:
1369         sjmp %8
1370 } by {
1371         ; Peephole 193.a   optimized misc jump sequence
1372         cjne @%1,%2,%8
1373         inc  %1
1374         cjne @%1,%6,%8
1375         inc  %1
1376         cjne @%1,%11,%8
1377         inc  %1
1378         cjne @%1,%14,%8
1379         sjmp %7
1380 ;%3:
1381 } if labelRefCount %3 4
1382
1383 replace {
1384         cjne %1,%2,%3
1385         cjne %5,%6,%3
1386         cjne %10,%11,%3
1387         cjne %13,%14,%3
1388         sjmp %7
1389 %3:
1390         sjmp %8
1391 } by {
1392         ; Peephole 194   optimized misc jump sequence
1393         cjne %1,%2,%8
1394         cjne %5,%6,%8
1395         cjne %10,%11,%8
1396         cjne %13,%14,%8
1397         sjmp %7
1398 ;%3:
1399 } if labelRefCount %3 4
1400
1401 replace {
1402         jnz  %3
1403         mov  a,%4
1404         jnz  %3
1405         mov  a,%9
1406         cjne %10,%11,%3
1407         sjmp %7
1408 %3:
1409         sjmp %8
1410 } by {
1411         ; Peephole 195.a optimized misc jump sequence
1412         jnz  %8
1413         mov  a,%4
1414         jnz  %8
1415         mov  a,%9
1416         cjne %10,%11,%8
1417         sjmp %7
1418 ;%3:
1419 } if labelRefCount %3 3
1420
1421 replace {
1422         cjne %1,%2,%3
1423         mov  a,%4
1424         cjne %5,%6,%3
1425         mov  a,%9
1426         cjne %10,%11,%3
1427         sjmp %7
1428 %3:
1429         sjmp %8
1430 } by {
1431         ; Peephole 195   optimized misc jump sequence
1432         cjne %1,%2,%8
1433         mov  a,%4
1434         cjne %5,%6,%8
1435         mov  a,%9
1436         cjne %10,%11,%8
1437         sjmp %7
1438 ;%3:
1439 } if labelRefCount %3 3
1440
1441 replace {
1442         cjne @%1,%2,%3
1443         inc  %1
1444         cjne @%1,%6,%3
1445         inc  %1
1446         cjne @%1,%11,%3
1447         sjmp %7
1448 %3:
1449         sjmp %8
1450 } by {
1451         ; Peephole 195.a   optimized misc jump sequence
1452         cjne @%1,%2,%8
1453         inc  %1
1454         cjne @%1,%6,%8
1455         inc  %1
1456         cjne @%1,%11,%8
1457         sjmp %7
1458 ;%3:
1459 } if labelRefCount %3 3
1460
1461 replace {
1462         cjne %1,%2,%3
1463         cjne %5,%6,%3
1464         cjne %10,%11,%3
1465         sjmp %7
1466 %3:
1467         sjmp %8
1468 } by {
1469         ; Peephole 196   optimized misc jump sequence
1470         cjne %1,%2,%8
1471         cjne %5,%6,%8
1472         cjne %10,%11,%8
1473         sjmp %7
1474 ;%3:
1475 } if labelRefCount %3 3
1476
1477 replace {
1478         jnz  %3
1479         mov  a,%4
1480         cjne %5,%6,%3
1481         sjmp %7
1482 %3:
1483         sjmp %8 
1484 } by {
1485         ; Peephole 197.a optimized misc jump sequence
1486         jnz  %8
1487         mov  a,%4
1488         cjne %5,%6,%8
1489         sjmp %7
1490 ;%3:     
1491 } if labelRefCount %3 2
1492
1493 replace {
1494         cjne %1,%2,%3
1495         mov  a,%4
1496         cjne %5,%6,%3
1497         sjmp %7
1498 %3:
1499         sjmp %8
1500 } by {
1501         ; Peephole 197   optimized misc jump sequence
1502         cjne %1,%2,%8
1503         mov  a,%4
1504         cjne %5,%6,%8
1505         sjmp %7
1506 ;%3:
1507 } if labelRefCount %3 2
1508
1509 replace {
1510         cjne @%1,%2,%3
1511         inc  %1
1512         cjne @%1,%6,%3
1513         sjmp %7
1514 %3:
1515         sjmp %8
1516 } by {
1517         ; Peephole 197.a   optimized misc jump sequence
1518         cjne @%1,%2,%8
1519         inc   %1
1520         cjne @%1,%6,%8
1521         sjmp %7
1522 ;%3:
1523 } if labelRefCount %3 2
1524
1525 replace {
1526         cjne %1,%2,%3
1527         cjne %5,%6,%3
1528         sjmp %7
1529 %3:
1530         sjmp %8
1531 } by {
1532         ; Peephole 198   optimized misc jump sequence
1533         cjne %1,%2,%8
1534         cjne %5,%6,%8
1535         sjmp %7
1536 ;%3:
1537 } if labelRefCount %3 2
1538
1539 replace {
1540         cjne %1,%2,%3
1541         sjmp %4
1542 %3:
1543         sjmp %5
1544 } by {
1545         ; Peephole 199   optimized misc jump sequence
1546         cjne %1,%2,%5
1547         sjmp %4
1548 ;%3:
1549 } if labelRefCount %3 1
1550
1551 replace {
1552         sjmp %1
1553 %1:
1554 } by {
1555         ; Peephole 200   removed redundant sjmp
1556 %1:
1557 }
1558
1559 replace {
1560         sjmp %1
1561 %2:
1562 %1:
1563 } by {
1564         ; Peephole 201   removed redundant sjmp
1565 %2:
1566 %1:
1567 }
1568
1569 replace {
1570         push  acc
1571         mov   dptr,%1
1572         pop   acc
1573 } by {
1574         ; Peephole 202   removed redundant push pop
1575         mov   dptr,%1
1576 }
1577
1578 replace {
1579         push  acc
1580         pop   acc
1581 } by {
1582         ; Peephole 202b   removed redundant push pop
1583 }
1584
1585 replace {
1586         mov  r%1,_spx
1587         lcall %2
1588         mov  r%1,_spx
1589 } by {
1590         ; Peephole 203   removed mov  r%1,_spx
1591         lcall %2
1592 }
1593
1594 replace {
1595         mov  %1,a
1596         add  a,acc
1597         mov  %1,a
1598 } by {
1599         ; Peephole 204   removed redundant mov
1600         add  a,acc
1601         mov  %1,a
1602 }
1603
1604 replace {
1605         djnz %1,%2
1606         sjmp  %3
1607 %2:
1608         sjmp  %4
1609 %3:
1610 } by {
1611         ; Peephole 205   optimized misc jump sequence
1612         djnz %1,%4
1613 %2:
1614 %3:
1615 } if labelRefCount %2 1
1616
1617 replace {
1618         mov  %1,%1
1619 } by {
1620         ; Peephole 206   removed redundant mov %1,%1
1621 }
1622
1623 replace {
1624         mov  a,_bp
1625         add  a,#0x00
1626         mov  %1,a
1627 } by {
1628         ; Peephole 207   removed zero add (acc not set to %1, flags undefined)
1629         mov  %1,_bp
1630 }
1631
1632 replace {
1633         push  acc
1634         mov   r%1,_bp
1635         pop   acc
1636 } by {
1637         ; Peephole 208   removed redundant push pop
1638         mov   r%1,_bp
1639 }
1640
1641 replace {
1642         mov  a,_bp
1643         add  a,#0x00
1644         inc  a
1645         mov  %1,a
1646 } by {
1647         ; Peephole 209   optimized increment (acc not set to %1, flags undefined)
1648         mov  %1,_bp
1649         inc  %1
1650 }
1651
1652 replace {
1653         mov  dptr,#((((%1 >> 16)) <<16) + (((%1 >> 8)) <<8) + %1)
1654 } by {
1655         ; Peephole 210a   simplified expression
1656         mov  dptr,#%1
1657 } if 24bitMode
1658
1659 replace {
1660         mov  dptr,#((((%1 >> 8)) <<8) + %1)
1661 } by {
1662         ; Peephole 210   simplified expression
1663         mov  dptr,#%1
1664 }
1665
1666 replace restart {
1667         push ar%1
1668         pop  ar%1
1669 } by {
1670         ; Peephole 211   removed redundant push r%1 pop r%1  
1671
1672
1673 replace {
1674         mov  a,_bp
1675         add  a,#0x01
1676         mov  r%1,a
1677 } by {
1678         ; Peephole 212  reduced add sequence to inc
1679         mov  r%1,_bp
1680         inc  r%1
1681 }
1682
1683 replace {
1684         mov  %1,#(( %2 >> 8 ) ^ 0x80)
1685 } by {
1686         ; Peephole 213.a inserted fix
1687         mov  %1,#(%2 >> 8)
1688         xrl  %1,#0x80
1689 } if portIsDS390
1690
1691 replace {
1692         mov  %1,#(( %2 >> 16 ) ^ 0x80)
1693 } by {
1694         ; Peephole 213.b inserted fix
1695         mov  %1,#(%2 >> 16)
1696         xrl  %1,#0x80
1697 } if portIsDS390
1698
1699 replace {
1700         mov  %1,#(( %2 + %3 >> 8 ) ^ 0x80)
1701 } by {  
1702         ; Peephole 213.c inserted fix
1703         mov  %1,#((%2 + %3) >> 8)
1704         xrl  %1,#0x80
1705 } if portIsDS390
1706
1707 replace  {
1708         mov  %1,a
1709         mov  a,%2
1710         add  a,%1
1711 } by {
1712         ; Peephole 214 reduced some extra movs
1713         mov  %1,a
1714         add  a,%2       
1715 } if operandsNotSame
1716
1717 replace {
1718         mov  %1,a
1719         add  a,%2
1720         mov  %1,a
1721 } by {
1722         ; Peephole 215 removed some movs
1723         add  a,%2
1724         mov  %1,a
1725 } if operandsNotSame
1726
1727 replace {
1728         mov   r%1,%2
1729         clr   a
1730         inc   r%1
1731         mov   @r%1,a
1732         dec   r%1
1733         mov   @r%1,a
1734 } by {
1735         ; Peephole 216 simplified clear (2bytes)
1736         mov   r%1,%2
1737         clr   a
1738         mov   @r%1,a
1739         inc   r%1
1740         mov   @r%1,a
1741 }
1742
1743 replace {
1744         mov   r%1,%2
1745         clr   a
1746         inc   r%1
1747         inc   r%1
1748         mov   @r%1,a
1749         dec   r%1
1750         mov   @r%1,a
1751         dec   r%1
1752         mov   @r%1,a
1753 } by {
1754         ; Peephole 217 simplified clear (3bytes)
1755         mov   r%1,%2
1756         clr   a
1757         mov   @r%1,a
1758         inc   r%1
1759         mov   @r%1,a
1760         inc   r%1
1761         mov   @r%1,a
1762 }
1763
1764 replace {
1765         mov   r%1,%2
1766         clr   a
1767         inc   r%1
1768         inc   r%1
1769         inc   r%1
1770         mov   @r%1,a
1771         dec   r%1
1772         mov   @r%1,a
1773         dec   r%1
1774         mov   @r%1,a
1775         dec   r%1
1776         mov   @r%1,a
1777 } by {
1778         ; Peephole 218 simplified clear (4bytes)
1779         mov   r%1,%2
1780         clr   a
1781         mov   @r%1,a
1782         inc   r%1
1783         mov   @r%1,a
1784         inc   r%1
1785         mov   @r%1,a
1786         inc   r%1
1787         mov   @r%1,a
1788 }
1789
1790 replace {
1791         clr   a
1792         movx  @dptr,a
1793         mov   dptr,%1
1794         clr   a
1795         movx  @dptr,a
1796 } by {
1797         ; Peephole 219 removed redundant clear
1798         clr   a
1799         movx  @dptr,a
1800         mov   dptr,%1
1801         movx  @dptr,a
1802 }
1803
1804 replace {
1805         clr   a
1806         movx  @dptr,a
1807         mov   dptr,%1
1808         movx  @dptr,a
1809         mov   dptr,%2
1810         clr   a
1811         movx  @dptr,a
1812 } by {
1813         ; Peephole 219a removed redundant clear
1814         clr   a
1815         movx  @dptr,a
1816         mov   dptr,%1
1817         movx  @dptr,a
1818         mov   dptr,%2
1819         movx  @dptr,a
1820 }
1821
1822 replace {
1823         mov     dps, #0
1824         mov     dps, #1
1825 } by {
1826         ; Peephole 220a removed bogus DPS set
1827         mov     dps, #1
1828 }
1829
1830 replace {
1831         mov     dps, #1
1832         mov     dps, #0
1833 } by {
1834         ; Peephole 220b removed bogus DPS set
1835         mov     dps, #0
1836 }
1837
1838 replace {
1839         mov     dps, #0
1840         mov     dps, #0x01
1841 } by {
1842         ; Peephole 220c removed bogus DPS set
1843 }
1844
1845 replace {
1846         mov     dps,#1
1847         inc     dptr
1848         mov     dps,#1
1849 } by {
1850         ; Peephole 220d removed bogus DPS set
1851         mov     dps,#1
1852         inc     dptr
1853 }
1854
1855 replace {
1856         mov     %1 + %2,(%2 + %1)
1857 } by {
1858         ; Peephole 221a remove redundant move
1859 }
1860
1861 replace {
1862         mov     (%1 + %2 + %3),((%2 + %1) + %3)
1863 } by {
1864         ; Peephole 221b remove redundant move
1865 }
1866
1867 replace {
1868         dec     r%1
1869         inc     r%1
1870 } by {
1871         ; removed dec/inc pair
1872 }
1873
1874 replace {
1875         mov     dps, #0
1876         mov     %1,a
1877         mov     dps, #1
1878 } by {
1879         ; Peephole 222 removed DPS abuse.
1880         mov     %1,a
1881         mov     dps, #1
1882 }
1883
1884 replace {
1885         mov     dps, #0
1886         xch     a, ap
1887         mov     %1, ap
1888         mov     dps, #1
1889 } by {
1890         ; Peephole 222a removed DPS abuse.
1891         xch     a, ap
1892         mov     %1, ap
1893         mov     dps, #1
1894 }
1895
1896 replace {
1897         mov     dps, #%1
1898         inc     dptr
1899         movx    a,@dptr
1900         mov     %2,a
1901         mov     dps, #%1
1902 } by {
1903         mov     dps, #%1
1904         inc     dptr
1905         movx    a,@dptr
1906         mov     %2,a
1907 ; Peephole 223: yet more DPS abuse removed.
1908 }
1909
1910 replace {
1911         mov     dps, #0
1912         inc     dps
1913 } by {
1914         mov     dps, #1
1915 }
1916
1917 replace {
1918         mov     dps, #%1
1919         mov     dptr, %2
1920         mov     dps, #%1
1921 } by {
1922         mov     dps, #%1
1923         mov     dptr, %2
1924 }
1925
1926 replace {
1927         mov     dps, #1
1928         mov     dptr, %1
1929         mov     dps, #0
1930         mov     dptr, %2
1931         inc     dps
1932 } by {
1933         mov     dps, #0
1934         mov     dptr, %2
1935         inc     dps
1936         mov     dptr, %1
1937 ; Peephole 224a: DPS usage re-arranged.
1938 }
1939
1940 replace {
1941         mov     dps, #%1
1942         mov     dptr, %2
1943         mov     dps, #%3
1944         mov     dptr, %4
1945         mov     dps, #%1
1946 } by {
1947         mov     dps, #%3
1948         mov     dptr, %4
1949         mov     dps, #%1
1950         mov     dptr, %2
1951 ; Peephole 224: DPS usage re-arranged.
1952 }
1953
1954 replace {
1955         mov     dps, #1
1956         mov     dptr, %1
1957         mov     dps, #0
1958 } by {
1959         mov     dps, #1
1960         mov     dptr, %1
1961         dec     dps
1962 }
1963
1964 replace {
1965         xch     a, ap
1966         add     a, ap
1967 } by {
1968         add     a, ap
1969 }
1970
1971 replace {
1972         xch     a, ap
1973         addc    a, ap
1974 } by {
1975         addc    a, ap
1976 }
1977
1978 replace {
1979         inc     dps
1980         mov     dps, #%1
1981 } by {
1982         mov     dps, #%1
1983 }
1984
1985 replace {
1986         dec     dps
1987         mov     dps, #%1
1988 } by {
1989         mov     dps, #%1
1990 }
1991
1992
1993 replace {
1994         add     a,#%2
1995         mov     dpl,a
1996         clr  a
1997         addc    a,#(%2 >> 8)
1998         mov     dph,a
1999         clr  a
2000         addc    a,#(%2 >> 16)
2001         mov     dpx,a
2002         clr     a
2003         movc    a,@a+dptr
2004 } by {
2005         ; Peephole 227.a movc optimize
2006         mov     dptr,#%2
2007         movc    a,@a+dptr
2008 }
2009
2010 replace {
2011         mov     r%1,%2
2012         mov     ar%1,%3
2013 } by {
2014         ; Peephole 228 redundant move
2015         mov     ar%1,%3
2016 }
2017
2018 replace {
2019         mov     r%1,a
2020         dec     r%1
2021         mov     a,r%1
2022 } by {
2023         ; Peephole 229.a redundant move
2024         dec     a
2025         mov     r%1,a
2026 }
2027
2028 replace {
2029         mov     r%1,a
2030         mov     r%2,b
2031         mov     a,r%1
2032 } by {
2033         ; Peephole 229.b redundant move
2034         mov     r%1,a
2035         mov     r%2,b
2036 }
2037
2038 replace {
2039         mov     r%1,a
2040         mov     r%2,b
2041         add     a,#%3
2042         mov     r%1,a
2043         mov     a,r%2
2044         addc    a,#(%3 >> 8)
2045         mov     r%2,a
2046 } by {
2047         ; Peephole 229.c redundant move
2048         add     a,#%3
2049         mov     r%1,a
2050         mov     a,b
2051         addc    a,#(%3 >> 8)
2052         mov     r%2,a
2053 }
2054
2055 replace {
2056         mov     a,%1
2057         mov     b,a
2058         movx    a,%2
2059 } by {
2060         ; Peephole 229.d redundant move
2061         mov     b,%1
2062         movx    a,%2
2063 }
2064
2065 replace {
2066         mov     dpl,r%1
2067         mov     dph,r%2
2068         mov     dpx,r%3
2069         movx    a,@dptr
2070         mov     r%4,a
2071         add     a,#0x01 
2072         mov     r%5,a
2073         mov     dpl,r%1
2074         mov     dph,r%2
2075         mov     dpx,r%3
2076         movx    @dptr,a
2077 } by {
2078         ; Peephole 230.a save reload dptr
2079         mov     dpl,r%1
2080         mov     dph,r%2
2081         mov     dpx,r%3
2082         movx    a,@dptr
2083         mov     r%4,a
2084         add     a,#0x01 
2085         mov     r%5,a
2086         movx    @dptr,a
2087 }
2088
2089 replace {
2090         mov     dpl,r%1
2091         mov     dph,r%2
2092         mov     dpx,r%3
2093         movx    a,@dptr
2094         mov     r%4,a
2095         dec     r%4
2096         mov     dpl,r%1
2097         mov     dph,r%2
2098         mov     dpx,r%3
2099         mov     a,r%4
2100         movx    @dptr,a
2101 } by {
2102         ; Peephole 230.b save reload dptr
2103         mov     dpl,r%1
2104         mov     dph,r%2
2105         mov     dpx,r%3
2106         movx    a,@dptr
2107         dec     a
2108         mov     r%4,a
2109         movx    @dptr,a
2110 }
2111
2112 replace {
2113         mov     dpl,r%1
2114         mov     dph,r%2
2115         mov     dpx,r%3
2116         movx    a,@dptr
2117         inc     a
2118         mov     r%4,a
2119         mov     dpl,r%1
2120         mov     dph,r%2
2121         mov     dpx,r%3
2122         mov     a,r%4
2123         movx    @dptr,a
2124 } by {
2125         ; Peephole 230.c save reload dptr
2126         mov     dpl,r%1
2127         mov     dph,r%2
2128         mov     dpx,r%3
2129         movx    a,@dptr
2130         inc     a
2131         mov     r%4,a
2132         movx    @dptr,a
2133 }
2134         
2135 replace {
2136         mov     r%1,dpl
2137         mov     r%2,dph
2138         mov     r%3,dpx
2139         mov     dpl,r%1
2140         mov     dph,r%2
2141         mov     dpx,r%3
2142 } by {
2143         ; Peephole 230.d save reload dptr
2144         mov     r%1,dpl
2145         mov     r%2,dph
2146         mov     r%3,dpx
2147 }
2148
2149 replace {
2150         mov     dpl,r%1
2151         mov     dph,r%2
2152         mov     dpx,r%3
2153         movx    a,@dptr
2154         mov     r%4,a
2155         orl     ar%4,#%5
2156         mov     dpl,r%1
2157         mov     dph,r%2
2158         mov     dpx,r%3
2159         mov     a,r1
2160         movx    @dptr,a
2161 } by {
2162         ; Peephole 230.e save reload dptr
2163         mov     dpl,r%1
2164         mov     dph,r%2
2165         mov     dpx,r%3
2166         movx    a,@dptr
2167         orl     a,#%5
2168         mov     r%4,a
2169         movx    @dptr,a
2170 }
2171         
2172 replace {
2173         mov     dpl,r%1
2174         mov     dph,r%2
2175         mov     dpx,r%3
2176         movx    a,@dptr
2177         mov     r%4,a
2178         anl     ar%4,#%5
2179         mov     dpl,r%1
2180         mov     dph,r%2
2181         mov     dpx,r%3
2182         mov     a,r1
2183         movx    @dptr,a
2184 } by {
2185         ; Peephole 230.e save reload dptr
2186         mov     dpl,r%1
2187         mov     dph,r%2
2188         mov     dpx,r%3
2189         movx    a,@dptr
2190         anl     a,#%5
2191         mov     r%4,a
2192         movx    @dptr,a
2193 }
2194
2195 replace {
2196         mov     r%1,dpl
2197         mov     r%2,dph
2198         mov     r%3,dpx
2199         mov     a,r%4
2200         inc     dps
2201         movx    @dptr,a
2202         inc     dptr
2203         mov     dps,#0
2204         mov     dpl,r%1
2205         mov     dph,r%2
2206         mov     dpx,r%3
2207 } by {
2208         ; Peephole 230.f save reload dptr
2209         mov     r%1,dpl
2210         mov     r%2,dph
2211         mov     r%3,dpx
2212         mov     a,r%4
2213         inc     dps
2214         movx    @dptr,a
2215         inc     dptr
2216         mov     dps,#0
2217 }
2218         
2219 replace {
2220         mov     ar%1,r%2
2221         mov     ar%3,r%1
2222         mov     r%1,#0x00
2223         mov     ar%2,r%4
2224         mov     r3,#0x00
2225 } by {
2226         ; Peephole 231.a simplified moves
2227         mov     ar%3,r%2
2228         mov     ar%2,r%4
2229         mov     r%4,#0
2230         mov     r%1,#0
2231 }
2232
2233 replace {
2234         mov     r%1,#0
2235         mov     r%2,#0
2236         mov     a,r%2
2237         orl     a,r%3
2238         mov     %4,a
2239         mov     a,r%5
2240         orl     a,r%1
2241         mov     %6,a
2242 } by {
2243         ; Peephole 231.b simplified or
2244         mov     r%1,#0
2245         mov     r%2,#0
2246         mov     a,r%3
2247         mov     %4,a
2248         mov     a,r%5
2249         mov     %6,a
2250 }
2251
2252 replace {
2253         mov     a,r%1
2254         mov     b,r%2
2255         mov     r%1,b
2256         mov     r%2,a
2257 } by {
2258         ; Peehole 232.a simplified xch
2259         mov     a,r%1
2260         xch     a,r%2
2261         mov     r%1,a
2262 }
2263
2264 replace {
2265         mov     a,#%1
2266         mov     b,#%2
2267         mov     r%3,b
2268         mov     r%4,a
2269 } by {
2270         ; Peehole 232.b simplified xch
2271         mov     r%3,#%2
2272         mov     r%4,#%1
2273 }
2274
2275 replace {
2276         mov     dpl1,#%1
2277         mov     dph1,#(%1 >> 8)
2278         mov     dpx1,#(%1 >> 16)
2279 } by {
2280         ; Peephole 233 24 bit load of dptr1
2281         inc     dps
2282         mov     dptr,#%1
2283         dec     dps
2284
2285
2286 // 14 rules by Fiorenzo D. Ramaglia <fd.ramaglia@tin.it>
2287
2288 replace {
2289         add  a,ar%1
2290 } by {
2291         ; Peephole 236a
2292         add  a,r%1
2293 }
2294
2295 replace {
2296         addc  a,ar%1
2297 } by {
2298         ; Peephole 236b
2299         addc  a,r%1
2300 }
2301
2302 replace {
2303         anl  a,ar%1
2304 } by {
2305         ; Peephole 236c
2306         anl  a,r%1
2307 }
2308
2309 replace {
2310         dec  ar%1
2311 } by {
2312         ; Peephole 236d
2313         dec  r%1
2314 }
2315
2316 replace {
2317         djnz  ar%1,%2
2318 } by {
2319         ; Peephole 236e
2320         djnz  r%1,%2
2321 }
2322
2323 replace {
2324         inc  ar%1
2325 } by {
2326         ; Peephole 236f
2327         inc  r%1
2328 }
2329
2330 replace {
2331         mov  a,ar%1
2332 } by {
2333         ; Peephole 236g
2334         mov  a,r%1
2335 }
2336
2337 replace {
2338         mov  ar%1,#%2
2339 } by {
2340         ; Peephole 236h
2341         mov  r%1,#%2
2342 }
2343
2344 replace {
2345         mov  ar%1,a
2346 } by {
2347         ; Peephole 236i
2348         mov  r%1,a
2349 }
2350
2351 replace {
2352         mov  ar%1,ar%2
2353 } by {
2354         ; Peephole 236j
2355         mov  r%1,ar%2
2356 }
2357
2358 replace {
2359         orl  a,ar%1
2360 } by {
2361         ; Peephole 236k
2362         orl  a,r%1
2363 }
2364
2365 replace {
2366         subb  a,ar%1
2367 } by {
2368         ; Peephole 236l
2369         subb  a,r%1
2370 }
2371
2372 replace {
2373         xch  a,ar%1
2374 } by {
2375         ; Peephole 236m
2376         xch  a,r%1
2377 }
2378
2379 replace {
2380         xrl  a,ar%1
2381 } by {
2382         ; Peephole 236n
2383         xrl  a,r%1
2384 }
2385
2386 replace {
2387         sjmp    %1
2388 %2:
2389         mov     %3,%4
2390 %1:
2391         ret
2392 } by {
2393         ; Peephole 237a  removed sjmp to ret
2394         ret
2395 %2:
2396         mov     %3,%4
2397 %1:
2398         ret
2399 }
2400
2401 replace {
2402         sjmp    %1
2403 %2:
2404         mov     %3,%4
2405         mov     dpl,%5
2406         mov     dph,%6
2407 %1:
2408         ret
2409 } by {
2410         ; Peephole 237b  removed sjmp to ret
2411         ret
2412 %2:
2413         mov     %3,%4
2414         mov     dpl,%5
2415         mov     dph,%6
2416 %1:
2417         ret
2418 }