* doc/sdccman.lyx: documented numeric ranges, WEBDOC #1442369
[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         movc a,@a+dptr
1175         mov  %4,a
1176         mov  acc,b
1177         inc  dptr
1178 }
1179
1180 replace {
1181         add  a,#%1
1182         mov  dpl,a
1183         clr  a
1184         addc a,#(%1 >> 8)
1185         mov  dph,a
1186         clr  a
1187         movc a,@a+dptr
1188         mov  %2,a
1189         inc  dptr
1190         clr  a
1191         movc a,@a+dptr
1192         mov  %3,a
1193         inc  dptr
1194         clr  a
1195 } by {
1196         ; Peephole 186.b   optimized movc sequence
1197         mov  dptr,#%1
1198         mov  b,acc
1199         movc a,@a+dptr
1200         mov  %2,a
1201         mov  acc,b
1202         inc  dptr
1203         movc a,@a+dptr
1204         mov  %3,a
1205         mov  acc,b
1206         inc  dptr
1207 }
1208
1209 replace {
1210         add  a,#%1
1211         mov  dpl,a
1212         clr  a
1213         addc a,#(%1 >> 8)
1214         mov  dph,a
1215         clr  a
1216         movc a,@a+dptr
1217         mov  %2,a
1218         inc  dptr
1219         clr  a
1220 } by {
1221         ; Peephole 186.c   optimized movc sequence
1222         mov  dptr,#%1
1223         mov  b,acc
1224         movc a,@a+dptr
1225         mov  %2,a
1226         mov  acc,b
1227         inc  dptr
1228 }
1229
1230 // disabled due to bug #1434401
1231 //// char indexed access to: char code table[] = {4,3,2,1};
1232 //replace {
1233 //      add  a,#%1
1234 //      mov  dpl,a
1235 //      clr  a
1236 //      addc a,#(%1 >> 8)
1237 //      mov  dph,a
1238 //      clr  a
1239 //      movc a,@a+dptr
1240 //} by {
1241 //      ; Peephole 186.d  optimized movc sequence
1242 //      mov  dptr,#%1
1243 //      movc a,@a+dptr
1244 //}
1245
1246 replace {
1247         mov  r%1,%2
1248         anl  ar%1,#%3
1249         mov  a,r%1
1250 } by {
1251         ; Peephole 187   used a instead of ar%1 for anl
1252         mov  a,%2
1253         anl  a,#%3
1254         mov  r%1,a
1255 }
1256
1257 replace {
1258         mov  %1,a
1259         mov  dptr,%2
1260         movc a,@a+dptr
1261         mov  %1,a
1262 } by {
1263         ; Peephole 188   removed redundant mov
1264         mov  dptr,%2
1265         movc a,@a+dptr
1266         mov  %1,a
1267 }
1268
1269 replace {
1270         anl  a,#0x0f
1271         mov  %1,a
1272         mov  a,#0x0f
1273         anl  a,%1
1274 } by {
1275         ; Peephole 189   removed redundant mov and anl
1276         anl  a,#0x0f
1277         mov  %1,a
1278 }
1279
1280 // rules 190 & 191 need to be in order
1281 replace {
1282         mov  a,%1
1283         lcall __gptrput
1284         mov  a,%1
1285 } by {
1286         ; Peephole 190   removed redundant mov
1287         mov  a,%1
1288         lcall __gptrput
1289 }
1290
1291 replace {
1292         mov  %1,a
1293         mov  dpl,%2
1294         mov  dph,%3
1295         mov  b,%4
1296         mov  a,%1
1297 } by {
1298         ; Peephole 191   removed redundant mov
1299         mov  %1,a
1300         mov  dpl,%2
1301         mov  dph,%3
1302         mov  b,%4
1303 }
1304
1305 replace {
1306         mov  r%1,a
1307         mov  @r%2,ar%1
1308 } by {
1309         ; Peephole 192   used a instead of ar%1 as source
1310         mov  r%1,a
1311         mov  @r%2,a
1312 }
1313
1314 replace {
1315         jnz  %3
1316         mov  a,%4
1317         jnz  %3
1318         mov  a,%9
1319         jnz  %3
1320         mov  a,%12
1321         cjne %13,%14,%3
1322         sjmp %7
1323 %3:
1324         sjmp %8
1325 } by {
1326         ; Peephole 193.a optimized misc jump sequence
1327         jnz  %8
1328         mov  a,%4
1329         jnz  %8
1330         mov  a,%9
1331         jnz  %8
1332         mov  a,%12
1333         cjne %13,%14,%8
1334         sjmp %7
1335 ;%3:
1336 } if labelRefCount %3 4
1337
1338 replace {
1339         cjne %1,%2,%3
1340         mov  a,%4
1341         cjne %5,%6,%3
1342         mov  a,%9
1343         cjne %10,%11,%3
1344         mov  a,%12
1345         cjne %13,%14,%3
1346         sjmp %7
1347 %3:
1348         sjmp %8
1349 } by {
1350         ; Peephole 193   optimized misc jump sequence
1351         cjne %1,%2,%8
1352         mov  a,%4
1353         cjne %5,%6,%8
1354         mov  a,%9
1355         cjne %10,%11,%8
1356         mov  a,%12
1357         cjne %13,%14,%8
1358         sjmp %7
1359 ;%3:
1360 } if labelRefCount %3 4
1361
1362 replace {
1363         cjne @%1,%2,%3
1364         inc  %1
1365         cjne @%1,%6,%3
1366         inc  %1
1367         cjne @%1,%11,%3
1368         inc  %1
1369         cjne @%1,%14,%3
1370         sjmp %7
1371 %3:
1372         sjmp %8
1373 } by {
1374         ; Peephole 193.a   optimized misc jump sequence
1375         cjne @%1,%2,%8
1376         inc  %1
1377         cjne @%1,%6,%8
1378         inc  %1
1379         cjne @%1,%11,%8
1380         inc  %1
1381         cjne @%1,%14,%8
1382         sjmp %7
1383 ;%3:
1384 } if labelRefCount %3 4
1385
1386 replace {
1387         cjne %1,%2,%3
1388         cjne %5,%6,%3
1389         cjne %10,%11,%3
1390         cjne %13,%14,%3
1391         sjmp %7
1392 %3:
1393         sjmp %8
1394 } by {
1395         ; Peephole 194   optimized misc jump sequence
1396         cjne %1,%2,%8
1397         cjne %5,%6,%8
1398         cjne %10,%11,%8
1399         cjne %13,%14,%8
1400         sjmp %7
1401 ;%3:
1402 } if labelRefCount %3 4
1403
1404 replace {
1405         jnz  %3
1406         mov  a,%4
1407         jnz  %3
1408         mov  a,%9
1409         cjne %10,%11,%3
1410         sjmp %7
1411 %3:
1412         sjmp %8
1413 } by {
1414         ; Peephole 195.a optimized misc jump sequence
1415         jnz  %8
1416         mov  a,%4
1417         jnz  %8
1418         mov  a,%9
1419         cjne %10,%11,%8
1420         sjmp %7
1421 ;%3:
1422 } if labelRefCount %3 3
1423
1424 replace {
1425         cjne %1,%2,%3
1426         mov  a,%4
1427         cjne %5,%6,%3
1428         mov  a,%9
1429         cjne %10,%11,%3
1430         sjmp %7
1431 %3:
1432         sjmp %8
1433 } by {
1434         ; Peephole 195   optimized misc jump sequence
1435         cjne %1,%2,%8
1436         mov  a,%4
1437         cjne %5,%6,%8
1438         mov  a,%9
1439         cjne %10,%11,%8
1440         sjmp %7
1441 ;%3:
1442 } if labelRefCount %3 3
1443
1444 replace {
1445         cjne @%1,%2,%3
1446         inc  %1
1447         cjne @%1,%6,%3
1448         inc  %1
1449         cjne @%1,%11,%3
1450         sjmp %7
1451 %3:
1452         sjmp %8
1453 } by {
1454         ; Peephole 195.a   optimized misc jump sequence
1455         cjne @%1,%2,%8
1456         inc  %1
1457         cjne @%1,%6,%8
1458         inc  %1
1459         cjne @%1,%11,%8
1460         sjmp %7
1461 ;%3:
1462 } if labelRefCount %3 3
1463
1464 replace {
1465         cjne %1,%2,%3
1466         cjne %5,%6,%3
1467         cjne %10,%11,%3
1468         sjmp %7
1469 %3:
1470         sjmp %8
1471 } by {
1472         ; Peephole 196   optimized misc jump sequence
1473         cjne %1,%2,%8
1474         cjne %5,%6,%8
1475         cjne %10,%11,%8
1476         sjmp %7
1477 ;%3:
1478 } if labelRefCount %3 3
1479
1480 replace {
1481         jnz  %3
1482         mov  a,%4
1483         cjne %5,%6,%3
1484         sjmp %7
1485 %3:
1486         sjmp %8
1487 } by {
1488         ; Peephole 197.a optimized misc jump sequence
1489         jnz  %8
1490         mov  a,%4
1491         cjne %5,%6,%8
1492         sjmp %7
1493 ;%3:
1494 } if labelRefCount %3 2
1495
1496 replace {
1497         cjne %1,%2,%3
1498         mov  a,%4
1499         cjne %5,%6,%3
1500         sjmp %7
1501 %3:
1502         sjmp %8
1503 } by {
1504         ; Peephole 197   optimized misc jump sequence
1505         cjne %1,%2,%8
1506         mov  a,%4
1507         cjne %5,%6,%8
1508         sjmp %7
1509 ;%3:
1510 } if labelRefCount %3 2
1511
1512 replace {
1513         cjne @%1,%2,%3
1514         inc  %1
1515         cjne @%1,%6,%3
1516         sjmp %7
1517 %3:
1518         sjmp %8
1519 } by {
1520         ; Peephole 197.a   optimized misc jump sequence
1521         cjne @%1,%2,%8
1522         inc   %1
1523         cjne @%1,%6,%8
1524         sjmp %7
1525 ;%3:
1526 } if labelRefCount %3 2
1527
1528 replace {
1529         cjne %1,%2,%3
1530         cjne %5,%6,%3
1531         sjmp %7
1532 %3:
1533         sjmp %8
1534 } by {
1535         ; Peephole 198   optimized misc jump sequence
1536         cjne %1,%2,%8
1537         cjne %5,%6,%8
1538         sjmp %7
1539 ;%3:
1540 } if labelRefCount %3 2
1541
1542 replace {
1543         cjne %1,%2,%3
1544         sjmp %4
1545 %3:
1546         sjmp %5
1547 } by {
1548         ; Peephole 199   optimized misc jump sequence
1549         cjne %1,%2,%5
1550         sjmp %4
1551 ;%3:
1552 } if labelRefCount %3 1
1553
1554 replace {
1555         sjmp %1
1556 %1:
1557 } by {
1558         ; Peephole 200   removed redundant sjmp
1559 %1:
1560 }
1561
1562 replace {
1563         sjmp %1
1564 %2:
1565 %1:
1566 } by {
1567         ; Peephole 201   removed redundant sjmp
1568 %2:
1569 %1:
1570 }
1571
1572 replace {
1573         push  acc
1574         mov   dptr,%1
1575         pop   acc
1576 } by {
1577         ; Peephole 202   removed redundant push pop
1578         mov   dptr,%1
1579 }
1580
1581 replace {
1582         push  acc
1583         pop   acc
1584 } by {
1585         ; Peephole 202b   removed redundant push pop
1586 }
1587
1588 replace {
1589         mov  r%1,_spx
1590         lcall %2
1591         mov  r%1,_spx
1592 } by {
1593         ; Peephole 203   removed mov  r%1,_spx
1594         lcall %2
1595 }
1596
1597 replace {
1598         mov  %1,a
1599         add  a,acc
1600         mov  %1,a
1601 } by {
1602         ; Peephole 204   removed redundant mov
1603         add  a,acc
1604         mov  %1,a
1605 }
1606
1607 replace {
1608         djnz %1,%2
1609         sjmp  %3
1610 %2:
1611         sjmp  %4
1612 %3:
1613 } by {
1614         ; Peephole 205   optimized misc jump sequence
1615         djnz %1,%4
1616 %2:
1617 %3:
1618 } if labelRefCount %2 1
1619
1620 replace {
1621         mov  %1,%1
1622 } by {
1623         ; Peephole 206   removed redundant mov %1,%1
1624 }
1625
1626 replace {
1627         mov  a,_bp
1628         add  a,#0x00
1629         mov  %1,a
1630 } by {
1631         ; Peephole 207   removed zero add (acc not set to %1, flags undefined)
1632         mov  %1,_bp
1633 }
1634
1635 replace {
1636         push  acc
1637         mov   r%1,_bp
1638         pop   acc
1639 } by {
1640         ; Peephole 208   removed redundant push pop
1641         mov   r%1,_bp
1642 }
1643
1644 replace {
1645         mov  a,_bp
1646         add  a,#0x00
1647         inc  a
1648         mov  %1,a
1649 } by {
1650         ; Peephole 209   optimized increment (acc not set to %1, flags undefined)
1651         mov  %1,_bp
1652         inc  %1
1653 }
1654
1655 replace {
1656         mov  dptr,#((((%1 >> 16)) <<16) + (((%1 >> 8)) <<8) + %1)
1657 } by {
1658         ; Peephole 210a   simplified expression
1659         mov  dptr,#%1
1660 } if 24bitMode
1661
1662 replace {
1663         mov  dptr,#((((%1 >> 8)) <<8) + %1)
1664 } by {
1665         ; Peephole 210   simplified expression
1666         mov  dptr,#%1
1667 }
1668
1669 replace restart {
1670         push ar%1
1671         pop  ar%1
1672 } by {
1673         ; Peephole 211   removed redundant push r%1 pop r%1
1674 }
1675
1676 replace {
1677         mov  a,_bp
1678         add  a,#0x01
1679         mov  r%1,a
1680 } by {
1681         ; Peephole 212  reduced add sequence to inc
1682         mov  r%1,_bp
1683         inc  r%1
1684 }
1685
1686 replace {
1687         mov  %1,#(( %2 >> 8 ) ^ 0x80)
1688 } by {
1689         ; Peephole 213.a inserted fix
1690         mov  %1,#(%2 >> 8)
1691         xrl  %1,#0x80
1692 } if portIsDS390
1693
1694 replace {
1695         mov  %1,#(( %2 >> 16 ) ^ 0x80)
1696 } by {
1697         ; Peephole 213.b inserted fix
1698         mov  %1,#(%2 >> 16)
1699         xrl  %1,#0x80
1700 } if portIsDS390
1701
1702 replace {
1703         mov  %1,#(( %2 + %3 >> 8 ) ^ 0x80)
1704 } by {
1705         ; Peephole 213.c inserted fix
1706         mov  %1,#((%2 + %3) >> 8)
1707         xrl  %1,#0x80
1708 } if portIsDS390
1709
1710 replace  {
1711         mov  %1,a
1712         mov  a,%2
1713         add  a,%1
1714 } by {
1715         ; Peephole 214 reduced some extra movs
1716         mov  %1,a
1717         add  a,%2
1718 } if operandsNotSame
1719
1720 replace {
1721         mov  %1,a
1722         add  a,%2
1723         mov  %1,a
1724 } by {
1725         ; Peephole 215 removed some movs
1726         add  a,%2
1727         mov  %1,a
1728 } if operandsNotSame
1729
1730 replace {
1731         mov   r%1,%2
1732         clr   a
1733         inc   r%1
1734         mov   @r%1,a
1735         dec   r%1
1736         mov   @r%1,a
1737 } by {
1738         ; Peephole 216 simplified clear (2bytes)
1739         mov   r%1,%2
1740         clr   a
1741         mov   @r%1,a
1742         inc   r%1
1743         mov   @r%1,a
1744 }
1745
1746 replace {
1747         mov   r%1,%2
1748         clr   a
1749         inc   r%1
1750         inc   r%1
1751         mov   @r%1,a
1752         dec   r%1
1753         mov   @r%1,a
1754         dec   r%1
1755         mov   @r%1,a
1756 } by {
1757         ; Peephole 217 simplified clear (3bytes)
1758         mov   r%1,%2
1759         clr   a
1760         mov   @r%1,a
1761         inc   r%1
1762         mov   @r%1,a
1763         inc   r%1
1764         mov   @r%1,a
1765 }
1766
1767 replace {
1768         mov   r%1,%2
1769         clr   a
1770         inc   r%1
1771         inc   r%1
1772         inc   r%1
1773         mov   @r%1,a
1774         dec   r%1
1775         mov   @r%1,a
1776         dec   r%1
1777         mov   @r%1,a
1778         dec   r%1
1779         mov   @r%1,a
1780 } by {
1781         ; Peephole 218 simplified clear (4bytes)
1782         mov   r%1,%2
1783         clr   a
1784         mov   @r%1,a
1785         inc   r%1
1786         mov   @r%1,a
1787         inc   r%1
1788         mov   @r%1,a
1789         inc   r%1
1790         mov   @r%1,a
1791 }
1792
1793 replace {
1794         clr   a
1795         movx  @dptr,a
1796         mov   dptr,%1
1797         clr   a
1798         movx  @dptr,a
1799 } by {
1800         ; Peephole 219 removed redundant clear
1801         clr   a
1802         movx  @dptr,a
1803         mov   dptr,%1
1804         movx  @dptr,a
1805 }
1806
1807 replace {
1808         clr   a
1809         movx  @dptr,a
1810         mov   dptr,%1
1811         movx  @dptr,a
1812         mov   dptr,%2
1813         clr   a
1814         movx  @dptr,a
1815 } by {
1816         ; Peephole 219a removed redundant clear
1817         clr   a
1818         movx  @dptr,a
1819         mov   dptr,%1
1820         movx  @dptr,a
1821         mov   dptr,%2
1822         movx  @dptr,a
1823 }
1824
1825 replace {
1826         mov     dps, #0
1827         mov     dps, #1
1828 } by {
1829         ; Peephole 220a removed bogus DPS set
1830         mov     dps, #1
1831 }
1832
1833 replace {
1834         mov     dps, #1
1835         mov     dps, #0
1836 } by {
1837         ; Peephole 220b removed bogus DPS set
1838         mov     dps, #0
1839 }
1840
1841 replace {
1842         mov     dps, #0
1843         mov     dps, #0x01
1844 } by {
1845         ; Peephole 220c removed bogus DPS set
1846 }
1847
1848 replace {
1849         mov     dps,#1
1850         inc     dptr
1851         mov     dps,#1
1852 } by {
1853         ; Peephole 220d removed bogus DPS set
1854         mov     dps,#1
1855         inc     dptr
1856 }
1857
1858 replace {
1859         mov     %1 + %2,(%2 + %1)
1860 } by {
1861         ; Peephole 221a remove redundant move
1862 }
1863
1864 replace {
1865         mov     (%1 + %2 + %3),((%2 + %1) + %3)
1866 } by {
1867         ; Peephole 221b remove redundant move
1868 }
1869
1870 replace {
1871         dec     r%1
1872         inc     r%1
1873 } by {
1874         ; removed dec/inc pair
1875 }
1876
1877 replace {
1878         mov     dps, #0
1879         mov     %1,a
1880         mov     dps, #1
1881 } by {
1882         ; Peephole 222 removed DPS abuse.
1883         mov     %1,a
1884         mov     dps, #1
1885 }
1886
1887 replace {
1888         mov     dps, #0
1889         xch     a, ap
1890         mov     %1, ap
1891         mov     dps, #1
1892 } by {
1893         ; Peephole 222a removed DPS abuse.
1894         xch     a, ap
1895         mov     %1, ap
1896         mov     dps, #1
1897 }
1898
1899 replace {
1900         mov     dps, #%1
1901         inc     dptr
1902         movx    a,@dptr
1903         mov     %2,a
1904         mov     dps, #%1
1905 } by {
1906         mov     dps, #%1
1907         inc     dptr
1908         movx    a,@dptr
1909         mov     %2,a
1910 ; Peephole 223: yet more DPS abuse removed.
1911 }
1912
1913 replace {
1914         mov     dps, #0
1915         inc     dps
1916 } by {
1917         mov     dps, #1
1918 }
1919
1920 replace {
1921         mov     dps, #%1
1922         mov     dptr, %2
1923         mov     dps, #%1
1924 } by {
1925         mov     dps, #%1
1926         mov     dptr, %2
1927 }
1928
1929 replace {
1930         mov     dps, #1
1931         mov     dptr, %1
1932         mov     dps, #0
1933         mov     dptr, %2
1934         inc     dps
1935 } by {
1936         mov     dps, #0
1937         mov     dptr, %2
1938         inc     dps
1939         mov     dptr, %1
1940 ; Peephole 224a: DPS usage re-arranged.
1941 }
1942
1943 replace {
1944         mov     dps, #%1
1945         mov     dptr, %2
1946         mov     dps, #%3
1947         mov     dptr, %4
1948         mov     dps, #%1
1949 } by {
1950         mov     dps, #%3
1951         mov     dptr, %4
1952         mov     dps, #%1
1953         mov     dptr, %2
1954 ; Peephole 224: DPS usage re-arranged.
1955 }
1956
1957 replace {
1958         mov     dps, #1
1959         mov     dptr, %1
1960         mov     dps, #0
1961 } by {
1962         mov     dps, #1
1963         mov     dptr, %1
1964         dec     dps
1965 }
1966
1967 replace {
1968         xch     a, ap
1969         add     a, ap
1970 } by {
1971         add     a, ap
1972 }
1973
1974 replace {
1975         xch     a, ap
1976         addc    a, ap
1977 } by {
1978         addc    a, ap
1979 }
1980
1981 replace {
1982         inc     dps
1983         mov     dps, #%1
1984 } by {
1985         mov     dps, #%1
1986 }
1987
1988 replace {
1989         dec     dps
1990         mov     dps, #%1
1991 } by {
1992         mov     dps, #%1
1993 }
1994
1995
1996 // disabled due to bug #1434401
1997 //replace {
1998 //      add     a,#%2
1999 //      mov     dpl,a
2000 //      clr  a
2001 //      addc    a,#(%2 >> 8)
2002 //      mov     dph,a
2003 //      clr  a
2004 //      addc    a,#(%2 >> 16)
2005 //      mov     dpx,a
2006 //      clr     a
2007 //      movc    a,@a+dptr
2008 //} by {
2009 //      ; Peephole 227.a movc optimize
2010 //      mov     dptr,#%2
2011 //      movc    a,@a+dptr
2012 //}
2013
2014 replace {
2015         mov     r%1,%2
2016         mov     ar%1,%3
2017 } by {
2018         ; Peephole 228 redundant move
2019         mov     ar%1,%3
2020 }
2021
2022 replace {
2023         mov     r%1,a
2024         dec     r%1
2025         mov     a,r%1
2026 } by {
2027         ; Peephole 229.a redundant move
2028         dec     a
2029         mov     r%1,a
2030 }
2031
2032 replace {
2033         mov     r%1,a
2034         mov     r%2,b
2035         mov     a,r%1
2036 } by {
2037         ; Peephole 229.b redundant move
2038         mov     r%1,a
2039         mov     r%2,b
2040 }
2041
2042 replace {
2043         mov     r%1,a
2044         mov     r%2,b
2045         add     a,#%3
2046         mov     r%1,a
2047         mov     a,r%2
2048         addc    a,#(%3 >> 8)
2049         mov     r%2,a
2050 } by {
2051         ; Peephole 229.c redundant move
2052         add     a,#%3
2053         mov     r%1,a
2054         mov     a,b
2055         addc    a,#(%3 >> 8)
2056         mov     r%2,a
2057 }
2058
2059 replace {
2060         mov     a,%1
2061         mov     b,a
2062         movx    a,%2
2063 } by {
2064         ; Peephole 229.d redundant move
2065         mov     b,%1
2066         movx    a,%2
2067 }
2068
2069 replace {
2070         mov     dpl,r%1
2071         mov     dph,r%2
2072         mov     dpx,r%3
2073         movx    a,@dptr
2074         mov     r%4,a
2075         add     a,#0x01
2076         mov     r%5,a
2077         mov     dpl,r%1
2078         mov     dph,r%2
2079         mov     dpx,r%3
2080         movx    @dptr,a
2081 } by {
2082         ; Peephole 230.a save reload dptr
2083         mov     dpl,r%1
2084         mov     dph,r%2
2085         mov     dpx,r%3
2086         movx    a,@dptr
2087         mov     r%4,a
2088         add     a,#0x01
2089         mov     r%5,a
2090         movx    @dptr,a
2091 }
2092
2093 replace {
2094         mov     dpl,r%1
2095         mov     dph,r%2
2096         mov     dpx,r%3
2097         movx    a,@dptr
2098         mov     r%4,a
2099         dec     r%4
2100         mov     dpl,r%1
2101         mov     dph,r%2
2102         mov     dpx,r%3
2103         mov     a,r%4
2104         movx    @dptr,a
2105 } by {
2106         ; Peephole 230.b save reload dptr
2107         mov     dpl,r%1
2108         mov     dph,r%2
2109         mov     dpx,r%3
2110         movx    a,@dptr
2111         dec     a
2112         mov     r%4,a
2113         movx    @dptr,a
2114 }
2115
2116 replace {
2117         mov     dpl,r%1
2118         mov     dph,r%2
2119         mov     dpx,r%3
2120         movx    a,@dptr
2121         inc     a
2122         mov     r%4,a
2123         mov     dpl,r%1
2124         mov     dph,r%2
2125         mov     dpx,r%3
2126         mov     a,r%4
2127         movx    @dptr,a
2128 } by {
2129         ; Peephole 230.c save reload dptr
2130         mov     dpl,r%1
2131         mov     dph,r%2
2132         mov     dpx,r%3
2133         movx    a,@dptr
2134         inc     a
2135         mov     r%4,a
2136         movx    @dptr,a
2137 }
2138
2139 replace {
2140         mov     r%1,dpl
2141         mov     r%2,dph
2142         mov     r%3,dpx
2143         mov     dpl,r%1
2144         mov     dph,r%2
2145         mov     dpx,r%3
2146 } by {
2147         ; Peephole 230.d save reload dptr
2148         mov     r%1,dpl
2149         mov     r%2,dph
2150         mov     r%3,dpx
2151 }
2152
2153 replace {
2154         mov     dpl,r%1
2155         mov     dph,r%2
2156         mov     dpx,r%3
2157         movx    a,@dptr
2158         mov     r%4,a
2159         orl     ar%4,#%5
2160         mov     dpl,r%1
2161         mov     dph,r%2
2162         mov     dpx,r%3
2163         mov     a,r1
2164         movx    @dptr,a
2165 } by {
2166         ; Peephole 230.e save reload dptr
2167         mov     dpl,r%1
2168         mov     dph,r%2
2169         mov     dpx,r%3
2170         movx    a,@dptr
2171         orl     a,#%5
2172         mov     r%4,a
2173         movx    @dptr,a
2174 }
2175
2176 replace {
2177         mov     dpl,r%1
2178         mov     dph,r%2
2179         mov     dpx,r%3
2180         movx    a,@dptr
2181         mov     r%4,a
2182         anl     ar%4,#%5
2183         mov     dpl,r%1
2184         mov     dph,r%2
2185         mov     dpx,r%3
2186         mov     a,r1
2187         movx    @dptr,a
2188 } by {
2189         ; Peephole 230.e save reload dptr
2190         mov     dpl,r%1
2191         mov     dph,r%2
2192         mov     dpx,r%3
2193         movx    a,@dptr
2194         anl     a,#%5
2195         mov     r%4,a
2196         movx    @dptr,a
2197 }
2198
2199 replace {
2200         mov     r%1,dpl
2201         mov     r%2,dph
2202         mov     r%3,dpx
2203         mov     a,r%4
2204         inc     dps
2205         movx    @dptr,a
2206         inc     dptr
2207         mov     dps,#0
2208         mov     dpl,r%1
2209         mov     dph,r%2
2210         mov     dpx,r%3
2211 } by {
2212         ; Peephole 230.f save reload dptr
2213         mov     r%1,dpl
2214         mov     r%2,dph
2215         mov     r%3,dpx
2216         mov     a,r%4
2217         inc     dps
2218         movx    @dptr,a
2219         inc     dptr
2220         mov     dps,#0
2221 }
2222
2223 replace {
2224         mov     ar%1,r%2
2225         mov     ar%3,r%1
2226         mov     r%1,#0x00
2227         mov     ar%2,r%4
2228         mov     r3,#0x00
2229 } by {
2230         ; Peephole 231.a simplified moves
2231         mov     ar%3,r%2
2232         mov     ar%2,r%4
2233         mov     r%4,#0
2234         mov     r%1,#0
2235 }
2236
2237 replace {
2238         mov     r%1,#0
2239         mov     r%2,#0
2240         mov     a,r%2
2241         orl     a,r%3
2242         mov     %4,a
2243         mov     a,r%5
2244         orl     a,r%1
2245         mov     %6,a
2246 } by {
2247         ; Peephole 231.b simplified or
2248         mov     r%1,#0
2249         mov     r%2,#0
2250         mov     a,r%3
2251         mov     %4,a
2252         mov     a,r%5
2253         mov     %6,a
2254 }
2255
2256 replace {
2257         mov     a,r%1
2258         mov     b,r%2
2259         mov     r%1,b
2260         mov     r%2,a
2261 } by {
2262         ; Peehole 232.a simplified xch
2263         mov     a,r%1
2264         xch     a,r%2
2265         mov     r%1,a
2266 }
2267
2268 replace {
2269         mov     a,#%1
2270         mov     b,#%2
2271         mov     r%3,b
2272         mov     r%4,a
2273 } by {
2274         ; Peehole 232.b simplified xch
2275         mov     r%3,#%2
2276         mov     r%4,#%1
2277 }
2278
2279 replace {
2280         mov     dpl1,#%1
2281         mov     dph1,#(%1 >> 8)
2282         mov     dpx1,#(%1 >> 16)
2283 } by {
2284         ; Peephole 233 24 bit load of dptr1
2285         inc     dps
2286         mov     dptr,#%1
2287         dec     dps
2288 }
2289
2290 // 14 rules by Fiorenzo D. Ramaglia <fd.ramaglia@tin.it>
2291
2292 replace {
2293         add  a,ar%1
2294 } by {
2295         ; Peephole 236a
2296         add  a,r%1
2297 }
2298
2299 replace {
2300         addc  a,ar%1
2301 } by {
2302         ; Peephole 236b
2303         addc  a,r%1
2304 }
2305
2306 replace {
2307         anl  a,ar%1
2308 } by {
2309         ; Peephole 236c
2310         anl  a,r%1
2311 }
2312
2313 replace {
2314         dec  ar%1
2315 } by {
2316         ; Peephole 236d
2317         dec  r%1
2318 }
2319
2320 replace {
2321         djnz  ar%1,%2
2322 } by {
2323         ; Peephole 236e
2324         djnz  r%1,%2
2325 }
2326
2327 replace {
2328         inc  ar%1
2329 } by {
2330         ; Peephole 236f
2331         inc  r%1
2332 }
2333
2334 replace {
2335         mov  a,ar%1
2336 } by {
2337         ; Peephole 236g
2338         mov  a,r%1
2339 }
2340
2341 replace {
2342         mov  ar%1,#%2
2343 } by {
2344         ; Peephole 236h
2345         mov  r%1,#%2
2346 }
2347
2348 replace {
2349         mov  ar%1,a
2350 } by {
2351         ; Peephole 236i
2352         mov  r%1,a
2353 }
2354
2355 replace {
2356         mov  ar%1,ar%2
2357 } by {
2358         ; Peephole 236j
2359         mov  r%1,ar%2
2360 }
2361
2362 replace {
2363         orl  a,ar%1
2364 } by {
2365         ; Peephole 236k
2366         orl  a,r%1
2367 }
2368
2369 replace {
2370         subb  a,ar%1
2371 } by {
2372         ; Peephole 236l
2373         subb  a,r%1
2374 }
2375
2376 replace {
2377         xch  a,ar%1
2378 } by {
2379         ; Peephole 236m
2380         xch  a,r%1
2381 }
2382
2383 replace {
2384         xrl  a,ar%1
2385 } by {
2386         ; Peephole 236n
2387         xrl  a,r%1
2388 }
2389
2390 replace {
2391         sjmp    %1
2392 %2:
2393         mov     %3,%4
2394 %1:
2395         ret
2396 } by {
2397         ; Peephole 237a  removed sjmp to ret
2398         ret
2399 %2:
2400         mov     %3,%4
2401 %1:
2402         ret
2403 }
2404
2405 replace {
2406         sjmp    %1
2407 %2:
2408         mov     %3,%4
2409         mov     dpl,%5
2410         mov     dph,%6
2411 %1:
2412         ret
2413 } by {
2414         ; Peephole 237b  removed sjmp to ret
2415         ret
2416 %2:
2417         mov     %3,%4
2418         mov     dpl,%5
2419         mov     dph,%6
2420 %1:
2421         ret
2422 }
2423
2424 // applies to f.e. device/lib/log10f.c
2425 replace {
2426         mov     %1,%9
2427         mov     %2,%10
2428         mov     %3,%11
2429         mov     %4,%12
2430
2431         mov     %5,%13
2432         mov     %6,%14
2433         mov     %7,%15
2434         mov     %8,%16
2435
2436         mov     %9,%1
2437         mov     %10,%2
2438         mov     %11,%3
2439         mov     %12,%4
2440 } by {
2441         mov     %1,%9
2442         mov     %2,%10
2443         mov     %3,%11
2444         mov     %4,%12
2445
2446         mov     %5,%13
2447         mov     %6,%14
2448         mov     %7,%15
2449         mov     %8,%16
2450         ;       Peephole 238.a  removed 4 redundant moves
2451 } if operandsNotSame8 %1 %2 %3 %4 %5 %6 %7 %8
2452
2453 // applies to device/lib/log10f.c
2454 replace {
2455         mov     %1,%5
2456         mov     %2,%6
2457         mov     %3,%7
2458         mov     %4,%8
2459
2460         mov     %5,%1
2461         mov     %6,%2
2462         mov     %7,%3
2463 } by {
2464         mov     %1,%5
2465         mov     %2,%6
2466         mov     %3,%7
2467         mov     %4,%8
2468         ;       Peephole 238.b  removed 3 redundant moves
2469 } if operandsNotSame7 %1 %2 %3 %4 %5 %6 %7
2470
2471 // applies to f.e. device/lib/time.c
2472 replace {
2473         mov     %1,%5
2474         mov     %2,%6
2475
2476         mov     %3,%7
2477         mov     %4,%8
2478
2479         mov     %5,%1
2480         mov     %6,%2
2481 } by {
2482         mov     %1,%5
2483         mov     %2,%6
2484
2485         mov     %3,%7
2486         mov     %4,%8
2487         ;       Peephole 238.c  removed 2 redundant moves
2488 } if operandsNotSame4 %1 %2 %3 %4
2489
2490 // applies to f.e. support/regression/tests/bug-524209.c
2491 replace {
2492         mov     %1,%4
2493         mov     %2,%5
2494         mov     %3,%6
2495
2496         mov     %4,%1
2497         mov     %5,%2
2498         mov     %6,%3
2499 } by {
2500         mov     %1,%4
2501         mov     %2,%5
2502         mov     %3,%6
2503         ;       Peephole 238.d  removed 3 redundant moves
2504 } if operandsNotSame6 %1 %2 %3 %4 %5 %6
2505
2506 // applies to f.e. ser_ir.asm
2507 replace {
2508         mov     r%1,acc
2509 } by {
2510         ;       Peephole 239    used a instead of acc
2511         mov     r%1,a
2512 }
2513
2514 replace restart {
2515         mov     a,%1
2516         addc    a,#0x00
2517 } by {
2518         ;       Peephole 240    use clr instead of addc a,#0
2519         clr     a
2520         addc    a,%1
2521 }
2522
2523 // peepholes 241.a to 241.c and 241.d to 241.f need to be in order
2524 replace {
2525         cjne    r%1,#%2,%3
2526         cjne    r%4,#%5,%3
2527         cjne    r%6,#%7,%3
2528         cjne    r%8,#%9,%3
2529         mov     a,#0x01
2530         sjmp    %10
2531 %3:
2532         clr     a
2533 %10:
2534 } by {
2535         ;       Peephole 241.a  optimized compare
2536         clr     a
2537         cjne    r%1,#%2,%3
2538         cjne    r%4,#%5,%3
2539         cjne    r%6,#%7,%3
2540         cjne    r%8,#%9,%3
2541         inc     a
2542 %3:
2543 %10:
2544 }
2545
2546 // applies to f.e. time.c
2547 replace {
2548         cjne    r%1,#%2,%3
2549         cjne    r%4,#%5,%3
2550         mov     a,#0x01
2551         sjmp    %6
2552 %3:
2553         clr     a
2554 %6:
2555 } by {
2556         ;       Peephole 241.b  optimized compare
2557         clr     a
2558         cjne    r%1,#%2,%3
2559         cjne    r%4,#%5,%3
2560         inc     a
2561 %3:
2562 %6:
2563 }
2564
2565 // applies to f.e. malloc.c
2566 replace {
2567         cjne    r%1,#%2,%3
2568         mov     a,#0x01
2569         sjmp    %4
2570 %3:
2571         clr     a
2572 %4:
2573 } by {
2574         ;       Peephole 241.c  optimized compare
2575         clr     a
2576         cjne    r%1,#%2,%3
2577         inc     a
2578 %3:
2579 %4:
2580 }
2581
2582 // applies to f.e. j = (k!=0x1000);
2583 // with volatile idata long k;
2584 replace {
2585         cjne    @r%1,#%2,%3
2586         inc     r%1
2587         cjne    @r%1,#%4,%3
2588         inc     r%1
2589         cjne    @r%1,#%5,%3
2590         inc     r%1
2591         cjne    @r%1,#%6,%3
2592         mov     a,#0x01
2593         sjmp    %7
2594 %3:
2595         clr     a
2596 %7:
2597 } by {
2598         ;       Peephole 241.d  optimized compare
2599         clr     a
2600         cjne    @r%1,#%2,%3
2601         inc     r%1
2602         cjne    @r%1,#%4,%3
2603         inc     r%1
2604         cjne    @r%1,#%5,%3
2605         inc     r%1
2606         cjne    @r%1,#%6,%3
2607         inc     a
2608 %3:
2609 %7:
2610 }
2611
2612 // applies to f.e. j = (k!=0x1000);
2613 // with volatile idata int k;
2614 replace {
2615         cjne    @r%1,#%2,%3
2616         inc     r%1
2617         cjne    @r%1,#%4,%3
2618         mov     a,#0x01
2619         sjmp    %7
2620 %3:
2621         clr     a
2622 %7:
2623 } by {
2624         ;       Peephole 241.e  optimized compare
2625         clr     a
2626         cjne    @r%1,#%2,%3
2627         inc     r%1
2628         cjne    @r%1,#%4,%3
2629         inc     a
2630 %3:
2631 %7:
2632 }
2633
2634 // applies to f.e. vprintf.asm (--stack-auto)
2635 replace {
2636         cjne    @r%1,#%2,%3
2637         mov     a,#0x01
2638         sjmp    %7
2639 %3:
2640         clr     a
2641 %7:
2642 } by {
2643         ;       Peephole 241.f  optimized compare
2644         clr     a
2645         cjne    @r%1,#%2,%3
2646         inc     a
2647 %3:
2648 %7:
2649 }
2650
2651 // applies to f.e. scott-bool1.c
2652 replace {
2653         jnz     %1
2654         mov     %2,%3
2655 %1:
2656         jz      %4
2657 } by {
2658         ;       Peephole 242.a  avoided branch jnz to jz
2659         jnz     %1
2660         mov     %2,%3
2661         jz      %4
2662 %1:
2663 } if labelRefCount %1 1
2664
2665 // applies to f.e. scott-bool1.c
2666 replace {
2667         jnz     %1
2668         mov     %2,%3
2669         orl     a,%5
2670 %1:
2671         jz      %4
2672 } by {
2673         ;       Peephole 242.b  avoided branch jnz to jz
2674         jnz     %1
2675         mov     %2,%3
2676         orl     a,%5
2677         jz      %4
2678 %1:
2679 } if labelRefCount %1 1
2680
2681 // applies to f.e. logic.c
2682 replace {
2683         jnz     %1
2684         mov     %2,%3
2685         orl     a,%5
2686         orl     a,%6
2687         orl     a,%7
2688 %1:
2689         jz      %4
2690 } by {
2691         ;       Peephole 242.c  avoided branch jnz to jz
2692         jnz     %1
2693         mov     %2,%3
2694         orl     a,%5
2695         orl     a,%6
2696         orl     a,%7
2697         jz      %4
2698 %1:
2699 } if labelRefCount %1 1
2700
2701 replace {
2702         jnz     %1
2703 %1:
2704 } by {
2705         ;       Peephole 243a    jump optimization
2706 } if labelRefCount %1 1
2707
2708 replace {
2709         jz      %1
2710 %1:
2711 } by {
2712         ;       Peephole 243b    jump optimization
2713 } if labelRefCount %1 1
2714
2715
2716 // This allows non-interrupt and interrupt code to safely compete
2717 // for a resource without the non-interrupt code having to disable
2718 // interrupts:
2719 // volatile bit resource_is_free;
2720 // if( resource_is_free ) {
2721 //     resource_is_free=0; do_something; resource_is_free=1;
2722 // }
2723 replace {
2724         jnb     %1,%2
2725 %3:
2726         clr     %1
2727 } by {
2728         ;       Peephole 244.a  using atomic test and clear
2729         jbc     %1,%3
2730         sjmp    %2
2731 %3:
2732 } if labelRefCount %3 0
2733
2734 replace {
2735         jb      %1,%2
2736         ljmp    %3
2737 %2:
2738         clr     %1
2739 } by {
2740         ;       Peephole 244.b  using atomic test and clear
2741         jbc     %1,%2
2742         ljmp    %3
2743 %2:
2744 } if labelRefCount %2 1
2745