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