a4117ac1eb399354d685588ed23c365e2851dd49
[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 {
21         xch     a,%1
22         xch     a,%1
23 } by {
24         ;       Peephole 2.a    removed redundant xch xch
25 }
26
27 replace {
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 {
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 {
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 } if notVolatile %1
71
72 replace {
73         mov     a,acc
74 } by {
75         ;       Peephole 100.a  removed redundant mov
76 }
77
78 replace {
79         mov     a,%1
80         movx    @dptr,a
81         inc     dptr
82         mov     a,%1
83         movx    @dptr,a
84 } by {
85         ;       Peephole 101    removed redundant mov
86         mov     a,%1
87         movx    @dptr,a
88         inc     dptr
89         movx    @dptr,a
90 } if notVolatile %1
91
92 replace {
93         mov     %1,%2
94         ljmp    %3
95 %4:
96         mov     %1,%5
97 %3:
98         mov     dpl,%1
99 %7:
100         mov     sp,bp
101         pop     bp
102 } by {
103         ;       Peephole 102    removed redundant mov
104         mov     dpl,%2
105         ljmp    %3
106 %4:
107         mov     dpl,%5
108 %3:
109 %7:
110         mov     sp,bp
111         pop     bp
112 } if notVolatile %1
113
114 replace {
115         mov     %1,%2
116         ljmp    %3
117 %4:
118         mov     a%1,%5
119 %3:
120         mov     dpl,%1
121 %7:
122         mov     sp,bp
123         pop     bp
124 } by {
125         ;       Peephole 103    removed redundant mov
126         mov     dpl,%2
127         ljmp    %3
128 %4:
129         mov     dpl,%5
130 %3:
131 %7:
132         mov     sp,bp
133         pop     bp
134 }
135
136 replace {
137         mov     a,bp
138         clr     c
139         add     a,#0x01
140         mov     r%1,a
141 } by {
142         ;       Peephole 104    optimized increment (acc not set to r%1, flags undefined)
143         mov     r%1,bp
144         inc     r%1
145 }
146
147 replace {
148         mov     %1,a
149         mov     a,%1
150 } by {
151         ;       Peephole 105    removed redundant mov
152         mov     %1,a
153 } if notVolatile %1
154
155 replace {
156         mov     %1,a
157         clr     c
158         mov     a,%1
159 } by {
160         ;       Peephole 106    removed redundant mov
161         mov     %1,a
162         clr     c
163 } if notVolatile %1
164
165 replace {
166         ljmp    %1
167 %1:
168 } by {
169         ;       Peephole 107    removed redundant ljmp
170 %1:
171 }
172
173 replace {
174         jc      %1
175         ljmp    %5
176 %1:
177 } by {
178         ;       Peephole 108    removed ljmp by inverse jump logic
179         jnc     %5
180 %1:
181 } if labelInRange
182
183 replace {
184         jz      %1
185         ljmp    %5
186 %1:
187 } by {
188         ;       Peephole 109    removed ljmp by inverse jump logic
189         jnz     %5
190 %1:
191 } if labelInRange
192
193 replace {
194         jnz     %1
195         ljmp    %5
196 %1:
197 } by {
198         ;       Peephole 110    removed ljmp by inverse jump logic
199         jz      %5
200 %1:
201 } if labelInRange
202
203 replace {
204         jb      %1,%2
205         ljmp    %5
206 %2:
207 } by {
208         ;       Peephole 111    removed ljmp by inverse jump logic
209         jnb     %1,%5
210 %2:
211 } if labelInRange
212
213 replace {
214         jnb     %1,%2
215         ljmp    %5
216 %2:
217 } by {
218         ;       Peephole 112.a  removed ljmp by inverse jump logic
219         jb      %1,%5
220 %2:
221 } if labelInRange
222
223 replace {
224         ljmp    %5
225 %1:
226 } by {
227         ;       Peephole 112.b  changed ljmp to sjmp
228         sjmp    %5
229 %1:
230 } if labelInRange
231
232
233 replace {
234         clr     a
235         cjne    %1,%2,%3
236         cpl     a
237 %3:
238         rrc     a
239         mov     %4,c
240 } by {
241         ;       Peephole 113    optimized misc sequence
242         clr     %4
243         cjne    %1,%2,%3
244         setb    %4
245 %3:
246 } if labelRefCount %3 1
247
248 replace {
249         clr     a
250         cjne    %1,%2,%3
251         cjne    %10,%11,%3
252         cpl     a
253 %3:
254         rrc     a
255         mov     %4,c
256 } by {
257         ;       Peephole 114    optimized misc sequence
258         clr     %4
259         cjne    %1,%2,%3
260         cjne    %10,%11,%3
261         setb    %4
262 %3:
263 } if labelRefCount %3 2
264
265 replace {
266         clr     a
267         cjne    %1,%2,%3
268         cpl     a
269 %3:
270         jnz     %4
271 } by {
272         ;       Peephole 115    jump optimization 
273         cjne    %1,%2,%3
274         sjmp    %4
275 %3:
276 } if labelRefCount %3 1
277
278 replace {
279         clr     a
280         cjne    %1,%2,%3
281         cjne    %9,%10,%3
282         cpl     a
283 %3:
284         jnz     %4
285 } by {
286         ;       Peephole 116    jump optimization
287         cjne    %1,%2,%3
288         cjne    %9,%10,%3
289         sjmp    %4
290 %3:
291 } if labelRefCount %3 2
292
293 replace {
294         clr     a
295         cjne    %1,%2,%3
296         cjne    %9,%10,%3
297         cjne    %11,%12,%3
298         cpl     a
299 %3:
300         jnz %4
301 } by {
302         ;       Peephole 117    jump optimization
303         cjne    %1,%2,%3
304         cjne    %9,%10,%3
305         cjne    %11,%12,%3
306         sjmp    %4
307 %3:
308 } if labelRefCount %3 3
309
310 replace {
311         clr     a
312         cjne    %1,%2,%3
313         cjne    %9,%10,%3
314         cjne    %11,%12,%3
315         cjne    %13,%14,%3
316         cpl     a
317 %3:
318         jnz     %4
319 } by {
320         ;       Peephole 118    jump optimization
321         cjne    %1,%2,%3
322         cjne    %9,%10,%3
323         cjne    %11,%12,%3
324         cjne    %13,%14,%3
325         sjmp    %4
326 %3:
327 } if labelRefCount %3 4
328
329 replace {
330         mov     a,#0x01
331         cjne    %1,%2,%3
332         clr     a
333 %3:
334         jnz     %4
335 } by {
336         ;       Peephole 119    jump optimization
337         cjne    %1,%2,%4
338 %3:
339 } if labelRefCount %3 1
340
341 replace {
342         mov     a,#0x01
343         cjne    %1,%2,%3
344         cjne    %10,%11,%3
345         clr     a
346 %3:
347         jnz     %4
348 } by {
349         ;       Peephole 120    jump optimization
350         cjne    %1,%2,%4
351         cjne    %10,%11,%4
352 %3:
353 } if labelRefCount %3 2
354
355 replace {
356         mov     a,#0x01
357         cjne    %1,%2,%3
358         cjne    %10,%11,%3
359         cjne    %12,%13,%3
360         clr     a
361 %3:
362         jnz  %4
363 } by {
364         ;       Peephole 121    jump optimization
365         cjne    %1,%2,%4
366         cjne    %10,%11,%4
367         cjne    %12,%13,%4
368 %3:
369 } if labelRefCount %3 3
370
371 replace {
372         mov     a,#0x01
373         cjne    %1,%2,%3
374         cjne    %10,%11,%3
375         cjne    %12,%13,%3
376         cjne    %14,%15,%3
377         clr     a
378 %3:
379         jnz     %4
380 } by {
381         ;       Peephole 122    jump optimization
382         cjne    %1,%2,%4
383         cjne    %10,%11,%4
384         cjne    %12,%13,%4
385         cjne    %14,%15,%4
386 %3:
387 } if labelRefCount %3 4
388
389 replace {
390         mov     a,#0x01
391         cjne    %1,%2,%3
392         clr     a
393 %3:
394         jz      %4
395 } by {
396         ;       Peephole 123    jump optimization
397         cjne    %1,%2,%3
398         smp     %4
399 %3:
400 } if labelRefCount %3 1
401
402 replace {
403         mov     a,#0x01
404         cjne    %1,%2,%3
405         cjne    %10,%11,%3
406         clr     a
407 %3:
408         jz      %4
409 } by {
410         ;       Peephole 124    jump optimization
411         cjne    %1,%2,%3
412         cjne    %10,%11,%3
413         sjmp    %4
414 %3:
415 } if labelRefCount %3 2
416
417 replace {
418         mov     a,#0x01
419         cjne    %1,%2,%3
420         cjne    %10,%11,%3
421         cjne    %12,%13,%3
422         clr     a
423 %3:
424         jz      %4
425 } by {
426         ;       Peephole 125    jump optimization
427         cjne    %1,%2,%3
428         cjne    %10,%11,%3
429         cjne    %12,%13,%3
430         sjmp    %4
431 %3:
432 } if labelRefCount %3 3
433
434 replace {
435         mov     a,#0x01
436         cjne    %1,%2,%3
437         cjne    %10,%11,%3
438         cjne    %12,%13,%3
439         cjne    %14,%15,%3
440         clr     a
441 %3:
442         jz      %4
443 } by {
444         ;       Peephole 126    jump optimization
445         cjne    %1,%2,%3
446         cjne    %10,%11,%3
447         cjne    %12,%13,%3
448         cjne    %14,%15,%3
449         sjmp    %4
450 %3:
451 } if labelRefCount %3 4
452
453 replace {
454         push    psw
455         mov     psw,%1
456         push    bp
457         mov     bp,%2
458 %3:
459         mov     %2,bp
460         pop     bp
461         pop     psw
462         ret
463 } by {
464         ;       Peephole 127    removed misc sequence
465         ret
466 } if labelRefCount %3 0
467
468 replace {
469         clr     a
470         rlc     a
471         jz      %1
472 } by {
473         ;       Peephole 128    jump optimization
474         jnc     %1
475 }
476
477 replace {
478         clr     a
479         rlc     a
480         jnz     %1
481 } by {
482         ;       Peephole 129    jump optimization
483         jc      %1
484 }
485
486 replace { 
487         mov     r%1,@r%2
488 } by {
489         ;       Peephole 130    changed target address mode r%1 to ar%1
490         mov     ar%1,@r%2
491 }
492
493 replace { 
494         mov     a,%1
495         subb    a,#0x01
496         mov     %2,a
497         mov     %1,%2
498 } by {
499         ;       Peephole 131    optimized decrement (not caring for c)
500         dec     %1         
501         mov     %2,%1      
502 }
503
504 replace {
505         mov     r%1,%2
506         mov     ar%3,@r%1
507         inc     r%3
508         mov     r%4,%2
509         mov     @r%4,ar%3
510 } by {
511         ;       Peephole 133    removed redundant moves
512         mov     r%1,%2
513         inc     @r%1
514         mov     ar%3,@r%1
515 } if notVolatile
516
517 replace {
518         mov     r%1,%2
519         mov     ar%3,@r%1
520         dec     r%3
521         mov     r%4,%2
522         mov     @r%4,ar%3
523 } by {
524         ;       Peephole 134    removed redundant moves
525         mov     r%1,%2
526         dec     @r%1
527         mov     ar%3,@r%1
528 } if notVolatile
529
530 replace {
531         mov     r%1,a
532         mov     a,r%2
533         orl     a,r%1
534 } by {
535         ;       Peephole 135    removed redundant mov
536         mov     r%1,a
537         orl     a,r%2
538 }
539
540 replace {
541         mov     %1,a
542         mov     dpl,%2
543         mov     dph,%3
544         mov     a,%1
545 } by {
546         ;       Peephole 136    removed redundant moves
547         mov     %1,a
548         mov     dpl,%2
549         mov     dph,%3
550 } if notVolatile %1
551
552 // WTF? Doesn't look sensible to me...
553 //replace {
554 //        mov  b,#0x00
555 //        mov  a,%1
556 //        cjne %2,%3,%4
557 //        mov  b,#0x01
558 //%4:
559 //        mov  a,b
560 //        jz   %5
561 //} by {
562 //        ;       Peephole 137   optimized misc jump sequence
563 //        mov  a,%1
564 //        cjne %2,%3,%5
565 //%4:
566 //} if labelRefCount %4 1
567 //
568 //replace {
569 //        mov  b,#0x00
570 //        mov  a,%1
571 //        cjne %2,%3,%4
572 //        mov  b,#0x01
573 //%4:
574 //        mov  a,b
575 //        jnz  %5
576 //} by {
577 //        ;       Peephole 138   optimized misc jump sequence
578 //        mov  a,%1
579 //        cjne %2,%3,%4
580 //        sjmp %5
581 //%4:
582 //} if labelRefCount %4 1
583
584 replace {
585         mov     r%1,a
586         anl     ar%1,%2
587         mov     a,r%1
588 } by {
589         ;       Peephole 139    removed redundant mov
590         anl     a,%2
591         mov     r%1,a
592 }
593
594 replace {
595         mov     r%1,a
596         orl     ar%1,%2
597         mov     a,r%1
598 } by {
599         ;       Peephole 140    removed redundant mov
600         orl     a,%2
601         mov     r%1,a }
602
603 replace {
604         mov     r%1,a
605         xrl     ar%1,%2
606         mov     a,r%1
607 } by {
608         ;       Peephole 141    removed redundant mov
609         xrl     a,%2
610         mov     r%1,a
611 }
612
613 replace {
614         mov     r%1,a
615         mov     r%2,ar%1
616         mov     ar%1,@r%2
617 } by {
618         ;       Peephole 142    removed redundant moves
619         mov     r%2,a
620         mov     ar%1,@r%2
621 }
622
623 replace {
624         rlc     a
625         mov     acc.0,c
626 } by {
627         ;       Peephole 143    converted rlc to rl
628         rl      a
629 }
630
631 replace {
632         rrc     a
633         mov     acc.7,c
634 } by {
635         ;       Peephole 144    converted rrc to rc
636         rr      a
637 }
638
639 replace {
640         clr     c
641         addc    a,%1
642 } by {
643         ;       Peephole 145    changed to add without carry
644         add     a,%1
645 }
646
647 replace {
648         clr     c
649         mov     a,%1
650         addc    a,%2
651 } by {
652         ;       Peephole 146    changed to add without carry
653         mov     a,%1
654         add     a,%2
655 }
656
657 replace {
658         orl     r%1,a
659 } by {
660         ;       Peephole 147    changed target address mode r%1 to ar%1
661         orl     ar%1,a
662 }
663
664 replace {
665         anl     r%1,a
666 } by {
667         ;       Peephole 148    changed target address mode r%1 to ar%1
668         anl     ar%1,a
669 }
670
671 replace {
672         xrl     r%1,a
673 } by {
674         ;       Peephole 149    changed target address mode r%1 to ar%1
675         xrl     ar%1,a
676 }
677
678 replace {
679         mov     %1,dpl
680         mov     dpl,%1
681 %9:
682         ret
683 } by {
684         ;       Peephole 150    removed misc moves via dpl before return
685 %9:
686         ret
687 }
688
689 replace {
690         mov     %1,dpl
691         mov     %2,dph
692         mov     dpl,%1
693         mov     dph,%2
694 %9:
695         ret
696 } by {
697         ;       Peephole 151    removed misc moves via dph, dpl before return
698 %9:
699         ret
700 }
701
702 replace {
703         mov     %1,dpl
704         mov     %2,dph
705         mov     dpl,%1
706 %9:
707         ret
708 } by {
709         ;       Peephole 152    removed misc moves via dph, dpl before return
710 %9:
711         ret
712 }
713
714 replace {
715         mov     %1,dpl
716         mov     %2,dph
717         mov     %3,b
718         mov     dpl,%1
719         mov     dph,%2
720         mov     b,%3
721 %9:
722         ret
723 } by {
724         ;       Peephole 153    removed misc moves via dph, dpl, b before return
725 %9:
726         ret
727 }
728
729 replace {
730         mov     %1,dpl
731         mov     %2,dph
732         mov     %3,b
733         mov     dpl,%1
734 %9:
735         ret
736 } by {
737         ;       Peephole 154    removed misc moves via dph, dpl, b before return
738 %9:
739         ret
740 }
741
742 replace {
743         mov     %1,dpl
744         mov     %2,dph
745         mov     %3,b
746         mov     dpl,%1
747         mov     dph,%2
748 %9:
749         ret
750 } by {
751         ;       Peephole 155    removed misc moves via dph, dpl, b before return
752 %9:
753         ret
754 }
755
756 replace {
757         mov     %1,dpl
758         mov     %2,dph
759         mov     %3,b
760         mov     %4,a
761         mov     dpl,%1
762         mov     dph,%2
763         mov     b,%3
764         mov     a,%4
765 %9:
766         ret
767 } by {
768         ;       Peephole 156    removed misc moves via dph, dpl, b, a before return
769 %9:
770         ret
771 }
772
773 replace {
774         mov     %1,dpl
775         mov     %2,dph
776         mov     %3,b
777         mov     %4,a
778         mov     dpl,%1
779         mov     dph,%2
780 %9:
781         ret
782 } by {
783         ;       Peephole 157    removed misc moves via dph, dpl, b, a before return
784 %9:
785         ret
786 }
787
788 replace {
789         mov     %1,dpl
790         mov     %2,dph
791         mov     %3,b
792         mov     %4,a
793         mov     dpl,%1
794 %9:
795         ret
796 } by {
797         ;       Peephole 158    removed misc moves via dph, dpl, b, a before return
798 %9:
799         ret
800 }
801
802 replace {
803         mov     %1,#%2
804         xrl     %1,#0x80
805 } by {
806         ;       Peephole 159    avoided xrl during execution
807         mov  %1,#(%2 ^ 0x80)
808 }
809
810 replace {
811         jnc     %1
812         sjmp    %2
813 %1:
814 } by {
815         ;       Peephole 160    removed sjmp by inverse jump logic
816         jc      %2
817 %1:
818 }
819
820 replace {
821         jc      %1
822         sjmp    %2
823 %1:
824 } by {
825         ;       Peephole 161    removed sjmp by inverse jump logic
826         jnc     %2
827 %1:
828 }
829
830 replace {
831         jnz     %1
832         sjmp    %2
833 %1:
834 } by {
835         ;       Peephole 162    removed sjmp by inverse jump logic
836         jz      %2
837 %1:
838 }
839
840 replace {
841         jz      %1
842         sjmp    %2
843 %1:
844 } by {
845         ;       Peephole 163    removed sjmp by inverse jump logic
846         jnz     %2
847 %1:
848 }
849
850 replace {
851         jnb     %3,%1
852         sjmp    %2
853 %1:
854 } by {
855         ;       Peephole 164    removed sjmp by inverse jump logic
856         jb      %3,%2
857 %1:
858 }
859
860 replace {
861         jb      %3,%1
862         sjmp    %2
863 %1:
864 } by {
865         ;       Peephole 165    removed sjmp by inverse jump logic
866         jnb     %3,%2
867 %1:
868 }
869
870 replace {
871         mov     %1,%2
872         mov     %3,%1
873         mov     %2,%1
874 } by {
875         ;       Peephole 166    removed redundant mov
876         mov     %1,%2
877         mov     %3,%1
878 } if notVolatile %1 %2
879
880 replace {
881         mov     c,%1
882         cpl     c
883         mov     %1,c
884 } by {
885         ;       Peephole 167    removed redundant bit moves (c not set to %1)
886         cpl     %1
887 }
888
889 replace {
890         jnb     %1,%2
891         sjmp    %3
892 %2:
893 } by {
894         ;       Peephole 168    jump optimization
895         jb      %1,%3
896 %2:
897 }
898
899 replace {
900         jb      %1,%2
901         sjmp    %3
902 %2:
903 } by {
904         ;       Peephole 169    jump optimization
905         jnb     %1,%3
906 %2:
907 }
908
909 replace {
910         clr     a
911         cjne    %1,%2,%3
912         cpl     a
913 %3:
914         jz      %4
915 } by {
916         ;       Peephole 170    jump optimization
917         cjne    %1,%2,%4
918 %3:
919 } if labelRefCount %3 1
920
921 replace {
922         clr     a
923         cjne    %1,%2,%3
924         cjne    %9,%10,%3
925         cpl     a
926 %3:
927         jz      %4
928 } by {
929         ;       Peephole 171    jump optimization
930         cjne    %1,%2,%4
931         cjne    %9,%10,%4
932 %3:
933 } if labelRefCount %3 2
934
935 replace {
936         clr     a
937         cjne    %1,%2,%3
938         cjne    %9,%10,%3
939         cjne    %11,%12,%3
940         cpl     a
941 %3:
942         jz      %4
943 } by {
944         ;       Peephole 172    jump optimization
945         cjne    %1,%2,%4
946         cjne    %9,%10,%4
947         cjne    %11,%12,%4
948 %3:
949 } if labelRefCount %3 3
950
951 replace {
952         clr     a
953         cjne    %1,%2,%3
954         cjne    %9,%10,%3
955         cjne    %11,%12,%3
956         cjne    %13,%14,%3
957         cpl     a
958 %3:
959         jz      %4
960 } by {
961         ;       Peephole 173    jump optimization
962         cjne    %1,%2,%4
963         cjne    %9,%10,%4
964         cjne    %11,%12,%4
965         cjne    %13,%14,%4
966 %3:
967 } if labelRefCount %3 4
968
969 replace {
970         mov     r%1,%2
971         clr     c
972         mov     a,r%1
973         subb    a,#0x01
974         mov     %2,a
975 } by {
976         ;       Peephole 174    optimized decrement (acc not set to %2, flags undefined)
977         mov     r%1,%2
978         dec     %2
979 }
980
981 replace {
982         mov     r%1,%2
983         mov     a,r%1
984         add     a,#0x01
985         mov     %2,a
986 } by {
987         ;       Peephole 175    optimized increment (acc not set to %2, flags undefined)
988         mov     r%1,%2
989         inc     %2
990 }
991
992 replace {
993         mov     %1,@r%2
994         inc     %1
995         mov     @r%2,%1
996 } by {
997         ;       Peephole 176    optimized increment, removed redundant mov
998         inc     @r%2
999         mov     %1,@r%2
1000 } if notVolatile
1001
1002 // this one will screw assignes to volatile/sfr's
1003 replace {
1004         mov  %1,%2
1005         mov  %2,%1
1006 } by {
1007         ;       Peephole 177.a  removed redundant mov
1008         mov  %1,%2
1009 } if notVolatile %1 %2
1010
1011 // applies to f.e. scott-add.asm (--model-large)
1012 replace {
1013         mov     r%1,a
1014         mov     a,ar%1
1015 } by {
1016         ;       Peephole 177.b  removed redundant mov
1017         mov     r%1,a
1018 }
1019
1020 // applies to f.e. bug-408972.c
1021 replace {
1022         mov     %1,%2
1023         mov     %1,%3
1024 } by {
1025         ;       Peephole 177.c  removed redundant move
1026         mov     %1,%3
1027 } if notVolatile %1 %2
1028
1029 // applies to f.e. bug-408972.c
1030 // not before peephole 177.c
1031 replace {
1032         mov     %1,%2
1033         mov     %3,%4
1034         mov     %2,%1
1035 } by {
1036         ;       Peephole 177.d  removed redundant move
1037         mov     %1,%2
1038         mov     %3,%4
1039 } if notVolatile %1 %2
1040
1041 replace {
1042         mov     a,%1
1043         mov     b,a
1044         mov     a,%2
1045 } by {
1046         ;       Peephole 178    removed redundant mov
1047         mov     b,%1
1048         mov     a,%2
1049 }
1050
1051 // rules 179-182 provided by : Frieder <fe@lake.iup.uni-heidelberg.de>
1052 // saving 2 byte, 1 cycle
1053 replace {
1054         mov     b,#0x00
1055         mov     a,#0x00
1056 } by {
1057         ;       Peephole 179    changed mov to clr
1058         clr     a
1059         mov     b,a
1060 }
1061
1062 // applies to:
1063 // volatile xdata char t; t=0x01; t=0x03;
1064 replace {
1065         mov     dptr,%1
1066         mov     a,%2
1067         movx    @dptr,a
1068         mov     dptr,%1
1069 } by {
1070         ;       Peephole 180.a  removed redundant mov to dptr
1071         mov     dptr,%1
1072         mov     a,%2
1073         movx    @dptr,a
1074 }
1075
1076 // volatile xdata char t; t=0x01; t=0x03; t=0x01;
1077 replace {
1078         mov     dptr,%1
1079         mov     a,%2
1080         movx    @dptr,a
1081         mov     a,%3
1082         movx    @dptr,a
1083         mov     dptr,%1
1084 } by {
1085         ;       Peephole 180.b  removed redundant mov to dptr
1086         mov     dptr,%1
1087         mov     a,%2
1088         movx    @dptr,a
1089         mov     a,%3
1090         movx    @dptr,a
1091 }
1092
1093 // saving 1 byte, 0 cycles
1094 replace {
1095         mov     a,#0x00
1096 } by {
1097         ;       Peephole 181    changed mov to clr
1098         clr     a
1099 }
1100
1101 // saving 3 bytes, 2 cycles
1102 // provided by Bernhard Held <bernhard.held@de.westinghouse.com>
1103 replace {
1104         mov     dpl,#%1
1105         mov     dph,#(%1 >> 8)
1106 } by {
1107         ;       Peephole 182.a  used 16 bit load of DPTR
1108         mov     dptr,#%1
1109 }
1110
1111 // saving 3 byte, 2 cycles, return(NULL) profits here
1112 replace {
1113         mov     dpl,#0x%1
1114         mov     dph,#0x%2
1115 } by {
1116         ;       Peephole 182.b  used 16 bit load of dptr
1117         mov     dptr,#0x%2%1
1118 }
1119
1120 // saving 3 byte, 2 cycles. Probably obsoleted by 182.b
1121 replace {
1122         mov     dpl,#%1
1123         mov     dph,#%2
1124 } by {
1125         ;       Peephole 182.c  used 16 bit load of dptr
1126         mov     dptr,#(((%2)<<8) + %1)
1127 }
1128
1129 replace {
1130         anl     %1,#%2
1131         anl     %1,#%3
1132 } by {
1133         ;       Peephole 183    avoided anl during execution
1134         anl     %1,#(%2 & %3)
1135 }
1136
1137 replace {
1138         mov     %1,a
1139         cpl     a
1140         mov     %1,a
1141 } by {
1142         ;       Peephole 184    removed redundant mov
1143         cpl     a
1144         mov     %1,a
1145 } if notVolatile %1
1146
1147 replace {
1148 // acc being incremented might cause problems
1149         mov     %1,a
1150         inc     %1
1151 } by {
1152         ;       Peephole 185    changed order of increment (acc incremented also!)
1153         inc     a
1154         mov     %1,a
1155 } if notVolatile %1
1156
1157 replace {
1158         add     a,#%1
1159         mov     dpl,a
1160         clr     a
1161         addc    a,#(%1 >> 8)
1162         mov     dph,a
1163         clr     a
1164         movc    a,@a+dptr
1165         mov     %2,a
1166         inc     dptr
1167         clr     a
1168         movc    a,@a+dptr
1169         mov     %3,a
1170         inc     dptr
1171         clr     a
1172         movc    a,@a+dptr
1173         mov     %4,a
1174         inc     dptr
1175         clr     a
1176 } by {
1177         ;       Peephole 186.a  optimized movc sequence
1178         mov     dptr,#%1
1179         mov     b,acc
1180         movc    a,@a+dptr
1181         mov     %2,a
1182         mov     acc,b
1183         inc     dptr
1184         movc    a,@a+dptr
1185         mov     %3,a
1186         mov     acc,b
1187         inc     dptr
1188         movc    a,@a+dptr
1189         mov     %4,a
1190         mov     acc,b
1191         inc     dptr
1192 }
1193
1194 replace {
1195         add     a,#%1
1196         mov     dpl,a
1197         clr     a
1198         addc    a,#(%1 >> 8)
1199         mov     dph,a
1200         clr     a
1201         movc    a,@a+dptr
1202         mov     %2,a
1203         inc     dptr
1204         clr     a
1205         movc    a,@a+dptr
1206         mov     %3,a
1207         inc     dptr
1208         clr     a
1209 } by {
1210         ;       Peephole 186.b  optimized movc sequence
1211         mov     dptr,#%1
1212         mov     b,acc
1213         movc    a,@a+dptr
1214         mov     %2,a
1215         mov     acc,b
1216         inc     dptr    
1217         movc    a,@a+dptr
1218         mov     %3,a
1219         mov     acc,b
1220         inc     dptr
1221 }
1222
1223 replace {
1224         add     a,#%1
1225         mov     dpl,a
1226         clr     a
1227         addc    a,#(%1 >> 8)
1228         mov     dph,a
1229         clr     a
1230         movc    a,@a+dptr
1231         mov     %2,a
1232         inc     dptr
1233         clr     a
1234 } by {
1235         ;       Peephole 186.c  optimized movc sequence
1236         mov     dptr,#%1
1237         mov     b,acc
1238         movc    a,@a+dptr
1239         mov     %2,a
1240         mov     acc,b
1241         inc     dptr
1242 }
1243
1244 // char indexed access to: char code table[] = {4,3,2,1}; 
1245 replace {
1246         add     a,#%1
1247         mov     dpl,a
1248         clr     a
1249         addc    a,#(%1 >> 8)
1250         mov     dph,a
1251         clr     a
1252         movc    a,@a+dptr
1253 } by {
1254         ;       Peephole 186.d  optimized movc sequence
1255         mov     dptr,#%1
1256         movc    a,@a+dptr
1257 }
1258
1259 // char indexed access to: int code table[] = {4,3,2,1}; 
1260 replace {
1261         mov     b,#0x02
1262         mul     ab
1263         add     a,#%2
1264         mov     dpl,a
1265         mov     a,b
1266         addc    a,#(%2 >> 8)
1267         mov     dph,a
1268         clr     a
1269         movc    a,@a+dptr
1270         mov     %3,a
1271         mov     a,#0x01
1272         movc    a,@a+dptr
1273 } by {
1274         ;       Peephole 186.e  optimized movc sequence (b, dptr differ)
1275         add     a,acc
1276         mov     b,a
1277         mov     dptr,#%2
1278         jnc     .+3
1279         inc     dph
1280         movc    a,@a+dptr
1281         mov     %3,a
1282         mov     a,b
1283         inc     a
1284         movc    a,@a+dptr
1285 }
1286
1287 replace {
1288         mov     r%1,%2
1289         anl     ar%1,#%3
1290         mov     a,r%1
1291 } by {
1292         ;       Peephole 187    used a instead of ar%1 for anl
1293         mov     a,%2
1294         anl     a,#%3
1295         mov     r%1,a
1296 }
1297
1298 replace {
1299         mov     %1,a
1300         mov     dptr,%2
1301         movc    a,@a+dptr
1302         mov     %1,a
1303 } by {
1304         ;       Peephole 188    removed redundant mov
1305         mov     dptr,%2
1306         movc    a,@a+dptr
1307         mov     %1,a
1308 } if notVolatile %1
1309
1310 replace {
1311         anl     a,#0x0f
1312         mov     %1,a
1313         mov     a,#0x0f
1314         anl     a,%1
1315 } by {
1316         ;       Peephole 189    removed redundant mov and anl
1317         anl     a,#0x0f
1318         mov     %1,a
1319 } if notVolatile %1
1320
1321 // rules 190 & 191 need to be in order
1322 replace {
1323         mov     a,%1
1324         lcall   __gptrput
1325         mov     a,%1
1326 } by {
1327         ;       Peephole 190    removed redundant mov
1328         mov     a,%1
1329         lcall   __gptrput
1330 } if notVolatile %1
1331
1332 replace {
1333         mov     %1,a
1334         mov     dpl,%2
1335         mov     dph,%3
1336         mov     b,%4
1337         mov     a,%1
1338 } by {
1339         ;       Peephole 191    removed redundant mov
1340         mov     %1,a
1341         mov     dpl,%2
1342         mov     dph,%3
1343         mov     b,%4
1344 } if notVolatile %1
1345
1346 replace {
1347         mov     r%1,a
1348         mov     @r%2,ar%1
1349 } by {
1350         ;       Peephole 192    used a instead of ar%1 as source
1351         mov     r%1,a
1352         mov     @r%2,a
1353 }
1354
1355 replace {
1356         jnz     %3
1357         mov     a,%4
1358         jnz     %3
1359         mov     a,%9
1360         jnz     %3
1361         mov     a,%12
1362         cjne    %13,%14,%3
1363         sjmp    %7
1364 %3:
1365         sjmp    %8
1366 } by {
1367         ;       Peephole 193.a  optimized misc jump sequence
1368         jnz     %8
1369         mov     a,%4
1370         jnz     %8
1371         mov     a,%9
1372         jnz     %8
1373         mov     a,%12
1374         cjne    %13,%14,%8
1375         sjmp    %7
1376 ;%3:
1377 } if labelRefCount %3 4
1378
1379 replace {
1380         cjne    %1,%2,%3
1381         mov     a,%4
1382         cjne    %5,%6,%3
1383         mov     a,%9
1384         cjne    %10,%11,%3
1385         mov     a,%12
1386         cjne    %13,%14,%3
1387         sjmp    %7
1388 %3:
1389         sjmp    %8
1390 } by {
1391         ;       Peephole 193.b  optimized misc jump sequence
1392         cjne    %1,%2,%8
1393         mov     a,%4
1394         cjne    %5,%6,%8
1395         mov     a,%9
1396         cjne    %10,%11,%8
1397         mov     a,%12
1398         cjne    %13,%14,%8
1399         sjmp    %7
1400 ;%3:
1401 } if labelRefCount %3 4
1402
1403 replace {
1404         cjne    @%1,%2,%3
1405         inc     %1
1406         cjne    @%1,%6,%3
1407         inc     %1
1408         cjne    @%1,%11,%3
1409         inc     %1
1410         cjne    @%1,%14,%3
1411         sjmp    %7
1412 %3:
1413         sjmp    %8
1414 } by {
1415         ;       Peephole 193.c  optimized misc jump sequence
1416         cjne    @%1,%2,%8
1417         inc     %1
1418         cjne    @%1,%6,%8
1419         inc     %1
1420         cjne    @%1,%11,%8
1421         inc     %1
1422         cjne    @%1,%14,%8
1423         sjmp    %7
1424 ;%3:
1425 } if labelRefCount %3 4
1426
1427 replace {
1428         cjne    %1,%2,%3
1429         cjne    %5,%6,%3
1430         cjne    %10,%11,%3
1431         cjne    %13,%14,%3
1432         sjmp    %7
1433 %3:
1434         sjmp    %8
1435 } by {
1436         ;       Peephole 194    optimized misc jump sequence
1437         cjne    %1,%2,%8
1438         cjne    %5,%6,%8
1439         cjne    %10,%11,%8
1440         cjne    %13,%14,%8
1441         sjmp    %7
1442 ;%3:
1443 } if labelRefCount %3 4
1444
1445 replace {
1446         jnz     %3
1447         mov     a,%4
1448         jnz     %3
1449         mov     a,%9
1450         cjne    %10,%11,%3
1451         sjmp    %7
1452 %3:
1453         sjmp    %8
1454 } by {
1455         ;       Peephole 195.a  optimized misc jump sequence
1456         jnz     %8
1457         mov     a,%4
1458         jnz     %8
1459         mov     a,%9
1460         cjne    %10,%11,%8
1461         sjmp    %7
1462 ;%3:
1463 } if labelRefCount %3 3
1464
1465 replace {
1466         cjne    %1,%2,%3
1467         mov     a,%4
1468         cjne    %5,%6,%3
1469         mov     a,%9
1470         cjne    %10,%11,%3
1471         sjmp    %7
1472 %3:
1473         sjmp    %8
1474 } by {
1475         ;       Peephole 195.b  optimized misc jump sequence
1476         cjne    %1,%2,%8
1477         mov     a,%4
1478         cjne    %5,%6,%8
1479         mov     a,%9
1480         cjne    %10,%11,%8
1481         sjmp    %7
1482 ;%3:
1483 } if labelRefCount %3 3
1484
1485 replace {
1486         cjne    @%1,%2,%3
1487         inc     %1
1488         cjne    @%1,%6,%3
1489         inc     %1
1490         cjne    @%1,%11,%3
1491         sjmp    %7
1492 %3:
1493         sjmp    %8
1494 } by {
1495         ;       Peephole 195.c  optimized misc jump sequence
1496         cjne    @%1,%2,%8
1497         inc     %1
1498         cjne    @%1,%6,%8
1499         inc     %1
1500         cjne    @%1,%11,%8
1501         sjmp    %7
1502 ;%3:
1503 } if labelRefCount %3 3
1504
1505 replace {
1506         cjne    %1,%2,%3
1507         cjne    %5,%6,%3
1508         cjne    %10,%11,%3
1509         sjmp    %7
1510 %3:
1511         sjmp    %8
1512 } by {
1513         ;       Peephole 196    optimized misc jump sequence
1514         cjne    %1,%2,%8
1515         cjne    %5,%6,%8
1516         cjne    %10,%11,%8
1517         sjmp    %7
1518 ;%3:
1519 } if labelRefCount %3 3
1520
1521 replace {
1522         jnz     %3
1523         mov     a,%4
1524         cjne    %5,%6,%3
1525         sjmp    %7
1526 %3:
1527         sjmp    %8 
1528 } by {
1529         ;       Peephole 197.a  optimized misc jump sequence
1530         jnz     %8
1531         mov     a,%4
1532         cjne    %5,%6,%8
1533         sjmp    %7
1534 ;%3:     
1535 } if labelRefCount %3 2
1536
1537 replace {
1538         cjne    %1,%2,%3
1539         mov     a,%4
1540         cjne    %5,%6,%3
1541         sjmp    %7
1542 %3:
1543         sjmp    %8
1544 } by {
1545         ;       Peephole 197.b  optimized misc jump sequence
1546         cjne    %1,%2,%8
1547         mov     a,%4
1548         cjne    %5,%6,%8
1549         sjmp    %7
1550 ;%3:
1551 } if labelRefCount %3 2
1552
1553 replace {
1554         cjne     @%1,%2,%3
1555         inc     %1
1556         cjne    @%1,%6,%3
1557         sjmp    %7
1558 %3:
1559         sjmp    %8
1560 } by {
1561         ;       Peephole 197.c  optimized misc jump sequence
1562         cjne    @%1,%2,%8
1563         inc     %1
1564         cjne    @%1,%6,%8
1565         sjmp    %7
1566 ;%3:
1567 } if labelRefCount %3 2
1568
1569 replace {
1570         cjne    %1,%2,%3
1571         cjne    %5,%6,%3
1572         sjmp    %7
1573 %3:
1574         sjmp    %8
1575 } by {
1576         ;       Peephole 198    optimized misc jump sequence
1577         cjne    %1,%2,%8
1578         cjne    %5,%6,%8
1579         sjmp    %7
1580 ;%3:
1581 } if labelRefCount %3 2
1582
1583 replace {
1584         cjne    %1,%2,%3
1585         sjmp    %4
1586 %3:
1587         sjmp    %5
1588 } by {
1589         ;       Peephole 199    optimized misc jump sequence
1590         cjne    %1,%2,%5
1591         sjmp    %4
1592 ;%3:
1593 } if labelRefCount %3 1
1594
1595 replace {
1596         sjmp    %1
1597 %1:
1598 } by {
1599         ;       Peephole 200    removed redundant sjmp
1600 %1:
1601 }
1602
1603 replace {
1604         sjmp    %1
1605 %2:
1606 %1:
1607 } by {
1608         ;       Peephole 201    removed redundant sjmp
1609 %2:
1610 %1:
1611 }
1612
1613 replace {
1614         push    acc
1615         mov     dptr,%1
1616         pop     acc
1617 } by {
1618         ;       Peephole 202    removed redundant push pop
1619         mov     dptr,%1
1620 }
1621
1622 replace {
1623         mov     r%1,_spx
1624         lcall   %2
1625         mov     r%1,_spx
1626 } by {
1627         ;       Peephole 203    removed mov  r%1,_spx
1628         lcall   %2
1629 }
1630
1631 replace {
1632         mov     %1,a
1633         add     a,acc
1634         mov     %1,a
1635 } by {
1636         ;       Peephole 204    removed redundant mov
1637         add     a,acc
1638         mov     %1,a
1639 } if notVolatile %1
1640
1641 replace {
1642         djnz    %1,%2
1643         sjmp    %3
1644 %2:
1645         sjmp    %4
1646 %3:
1647 } by {
1648         ;       Peephole 205    optimized misc jump sequence
1649         djnz    %1,%4
1650 %2:
1651 %3:
1652 } if labelRefCount %2 1
1653
1654 replace {
1655         mov     %1,%1
1656 } by {
1657         ;       Peephole 206    removed redundant mov %1,%1
1658 } if notVolatile
1659
1660 replace {
1661         mov     a,_bp
1662         add     a,#0x00
1663         mov     %1,a
1664 } by {
1665         ;       Peephole 207    removed zero add (acc not set to %1, flags undefined)
1666         mov     %1,_bp
1667 }
1668
1669 replace {
1670         push    acc
1671         mov     r%1,_bp
1672         pop     acc
1673 } by {
1674         ;       Peephole 208    removed redundant push pop
1675         mov     r%1,_bp
1676 }
1677
1678 replace {
1679         mov     a,_bp
1680         add     a,#0x00
1681         inc     a
1682         mov     %1,a
1683 } by {
1684         ;       Peephole 209    optimized increment (acc not set to %1, flags undefined)
1685         mov     %1,_bp
1686         inc     %1
1687 }
1688
1689 replace {
1690         mov     dptr,#((((%1 >> 8)) <<8) + %1)
1691 } by {
1692         ;       Peephole 210    simplified expression
1693         mov     dptr,#%1
1694 }
1695
1696 replace {
1697         push    %1
1698         pop     %1
1699 } by {
1700         ;       Peephole 211    removed redundant push %1 pop %1  
1701
1702
1703 replace {
1704         mov     a,_bp
1705         add     a,#0x01
1706         mov     r%1,a
1707 } by {
1708         ;       Peephole 212    reduced add sequence to inc
1709         mov     r%1,_bp
1710         inc     r%1
1711 }
1712
1713 replace {
1714         mov     %1,#(( %2 >> 8 ) ^ 0x80)
1715 } by {
1716         ;       Peephole 213.a  inserted fix
1717         mov     %1,#(%2 >> 8)
1718         xrl     %1,#0x80
1719 }
1720
1721 replace {
1722         mov     %1,#(( %2 + %3 >> 8 ) ^ 0x80)
1723 } by {
1724         ;       Peephole 213.b  inserted fix     
1725         mov     %1,#((%2 + %3) >> 8)
1726         xrl     %1,#0x80
1727 }
1728
1729
1730 replace  {
1731         mov     %1,a
1732         mov     a,%2
1733         add     a,%1
1734 } by {
1735         ;       Peephole 214    reduced some extra moves
1736         mov     %1,a
1737         add     a,%2
1738 } if operandsNotSame
1739
1740 replace {
1741         mov     %1,a
1742         add     a,%2
1743         mov     %1,a
1744 } by {
1745         ;       Peephole 215    removed some moves
1746         add     a,%2
1747         mov     %1,a
1748 } if operandsNotSame
1749
1750 replace {
1751         mov     r%1,%2
1752         clr     a
1753         inc     r%1
1754         mov     @r%1,a
1755         dec     r%1
1756         mov     @r%1,a
1757 } by {
1758         ;       Peephole 216    simplified clear (2bytes)
1759         mov     r%1,%2
1760         clr     a
1761         mov     @r%1,a
1762         inc     r%1
1763         mov     @r%1,a
1764 }
1765
1766 replace {
1767         mov     r%1,%2
1768         clr     a
1769         inc     r%1
1770         inc     r%1
1771         mov     @r%1,a
1772         dec     r%1
1773         mov     @r%1,a
1774         dec     r%1
1775         mov     @r%1,a
1776 } by {
1777         ;       Peephole 217    simplified clear (3bytes)
1778         mov     r%1,%2
1779         clr     a
1780         mov     @r%1,a
1781         inc     r%1
1782         mov     @r%1,a
1783         inc     r%1
1784         mov     @r%1,a
1785 }
1786
1787 replace {
1788         mov     r%1,%2
1789         clr     a
1790         inc     r%1
1791         inc     r%1
1792         inc     r%1
1793         mov     @r%1,a
1794         dec     r%1
1795         mov     @r%1,a
1796         dec     r%1
1797         mov     @r%1,a
1798         dec     r%1
1799         mov     @r%1,a
1800 } by {
1801         ;       Peephole 218    simplified clear (4bytes)
1802         mov     r%1,%2
1803         clr     a
1804         mov     @r%1,a
1805         inc     r%1
1806         mov     @r%1,a
1807         inc     r%1
1808         mov     @r%1,a
1809         inc     r%1
1810         mov     @r%1,a
1811 }
1812
1813 replace {
1814         clr     a
1815         movx    @dptr,a
1816         mov     dptr,%1
1817         clr     a
1818         movx    @dptr,a
1819 } by {
1820         ;       Peephole 219    removed redundant clear
1821         clr     a
1822         movx    @dptr,a
1823         mov     dptr,%1
1824         movx    @dptr,a
1825 }
1826
1827 replace {
1828         clr     a
1829         movx    @dptr,a
1830         mov     dptr,%1
1831         movx    @dptr,a
1832         mov     dptr,%2
1833         clr     a
1834         movx    @dptr,a
1835 } by {
1836         ;       Peephole 219.a  removed redundant clear
1837         clr     a
1838         movx    @dptr,a
1839         mov     dptr,%1
1840         movx    @dptr,a
1841         mov     dptr,%2
1842         movx    @dptr,a
1843 }
1844
1845 replace {
1846         mov     dps,#0x00
1847         mov     dps,#0x01
1848 } by {
1849         ;       Peephole 220.a  removed bogus DPS set
1850         mov     dps,#0x01
1851 }
1852
1853 replace {
1854         mov     dps,#0x01
1855         mov     dps,#0x00
1856 } by {
1857         ;       Peephole 220.b  removed bogus DPS set
1858         mov     dps,#0x00
1859 }
1860
1861 replace {
1862         mov     %1 + %2,(%2 + %1)
1863 } by {
1864         ;       Peephole 221.a  remove redundant move
1865 } if notVolatile
1866
1867 replace {
1868         mov     (%1 + %2 + %3),((%2 + %1) + %3)
1869 } by {
1870         ;       Peephole 221.b  remove redundant move
1871 } if notVolatile
1872
1873 replace {
1874         dec     r%1
1875         inc     r%1
1876 } by {
1877         ;       Peephole 222    removed dec/inc pair
1878 }
1879
1880 replace {
1881         mov     %1,dpl
1882         mov     %2,dph
1883         mov     dpl,%1
1884         mov     dph,%2
1885 } by {
1886         ;       Peephole 223    removed redundant dph/dpl moves
1887         mov     %1,dpl
1888         mov     %2,dph
1889 } if notVolatile %1 %2
1890
1891 replace {
1892         mov     %1,dpl
1893         mov     (%1 + 1),dph
1894         mov     dpl,%1
1895         mov     dph,(%1 + 1)
1896 } by {
1897         ;       Peephole 224    removed redundant dph/dpl moves
1898         mov     %1,dpl
1899         mov     (%1 + 1),dph
1900 } if notVolatile %1
1901
1902 replace {
1903         mov     a,%1
1904         movx    @dptr,a
1905         mov     dpl,%2
1906         mov     dph,%3
1907         mov     b,%4
1908         mov     a,%1
1909 } by {
1910         ;       Peephole 225    removed redundant move to acc
1911         mov     a,%1
1912         movx    @dptr,a
1913         mov     dpl,%2
1914         mov     dph,%3
1915         mov     b,%4
1916 } if notVolatile %1
1917
1918 replace {
1919         clr     a
1920         movx    @dptr,a
1921         inc     dptr
1922         movx    @dptr,a
1923         inc     dptr
1924         clr     a
1925 } by {
1926         ;       Peephole 226    removed unnecessary clr
1927         clr     a
1928         movx    @dptr,a
1929         inc     dptr
1930         movx    @dptr,a
1931         inc     dptr
1932 }
1933
1934 replace {
1935         mov     dptr,#%1
1936         clr     a
1937         inc     dptr
1938         inc     dptr
1939         inc     dptr
1940         movx    @dptr,a
1941         lcall   __decdptr
1942         movx    @dptr,a
1943         lcall   __decdptr
1944         movx    @dptr,a
1945         lcall   __decdptr
1946         movx    @dptr,a
1947 } by {
1948         ;       Peephole 227    replaced inefficient 32 bit clear
1949         mov     dptr,#%1
1950         clr     a
1951         movx    @dptr,a
1952         inc     dptr
1953         movx    @dptr,a
1954         inc     dptr
1955         movx    @dptr,a
1956         inc     dptr
1957         movx    @dptr,a
1958         mov     dptr,#%1
1959 }
1960
1961 replace {
1962         mov     dptr,#%1
1963         clr     a
1964         inc     dptr
1965         inc     dptr
1966         inc     dptr
1967         movx    @dptr,a
1968         lcall   __decdptr
1969         movx    @dptr,a
1970         lcall   __decdptr
1971         movx    @dptr,a
1972         lcall   __decdptr
1973         mov     a,#%2
1974         movx    @dptr,a
1975 } by {
1976         ;       Peephole 228    replaced inefficient 32 constant
1977         mov     dptr,#%1
1978         mov     a,#%2
1979         movx    @dptr,a
1980         inc     dptr
1981         clr     a
1982         movx    @dptr,a
1983         inc     dptr
1984         movx    @dptr,a
1985         inc     dptr
1986         movx    @dptr,a
1987         mov     dptr,#%1
1988 }
1989
1990 replace {
1991         mov     dptr,#%1
1992         clr     a
1993         inc     dptr
1994         movx    @dptr,a
1995         lcall   __decdptr
1996         movx    @dptr,a
1997 } by {
1998         ;       Peephole 229    replaced inefficient 16 bit clear
1999         mov     dptr,#%1
2000         clr     a
2001         movx    @dptr,a
2002         inc     dptr
2003         movx    @dptr,a
2004         mov     dptr,#%1
2005 }
2006
2007 replace {
2008         mov     dptr,#%1
2009         clr     a
2010         inc     dptr
2011         movx    @dptr,a
2012         lcall   __decdptr
2013         mov     a,#%2
2014         movx    @dptr,a
2015 } by {
2016         ;       Peephole 230    replaced inefficient 16 bit constant
2017         mov     dptr,#%1
2018         mov     a,#%2
2019         movx    @dptr,a
2020         inc     dptr
2021         clr     a
2022         movx    @dptr,a
2023         mov     dptr,#%1
2024 }
2025
2026 // this last peephole often removes the last mov from 227-230
2027 replace {
2028         mov     dptr,#%1
2029         mov     dptr,#%2
2030 } by {
2031         ;       Peephole 231    removed redundant mov to dptr
2032         mov     dptr,#%2
2033 }
2034
2035 replace {
2036         movx    a,@dptr
2037 } by {
2038         ;       Peephole 232    using movc to read xdata (--xram-movc)
2039         clr     a
2040         movc    a,@a+dptr
2041 } if xramMovcOption
2042
2043 replace {
2044         lcall   _gptrget
2045 } by {
2046         ;       Peephole 233    using _gptrgetc instead of _gptrget (--xram-movc)
2047         lcall   _gptrgetc
2048 } if xramMovcOption
2049
2050 replace {
2051         mov     r%1,a
2052         mov     dpl,r%1
2053 %2:
2054         ret
2055 } by {
2056         ;       Peephole 234    loading dpl directly from a(ccumulator), r%1 not set
2057         mov     dpl,a
2058 %2:
2059         ret
2060 }
2061
2062 replace {
2063         mov     r%1,a
2064         mov     dpl,r%2
2065         mov     dph,r%1
2066 %3:
2067         ret
2068 } by {
2069         ;       Peephole 235    loading dph directly from a(ccumulator), r%1 not set
2070         mov     dpl,r%2
2071         mov     dph,a
2072 %3:
2073         ret
2074 }
2075
2076 // 14 rules by Fiorenzo D. Ramaglia <fd.ramaglia@tin.it>
2077
2078 replace {
2079         add     a,ar%1
2080 } by {
2081         ;       Peephole 236.a  used r%1 instead of ar%1
2082         add     a,r%1
2083 }
2084
2085 replace {
2086         addc    a,ar%1
2087 } by {
2088         ;       Peephole 236.b  used r%1 instead of ar%1
2089         addc    a,r%1
2090 }
2091
2092 replace {
2093         anl     a,ar%1
2094 } by {
2095         ;       Peephole 236.c  used r%1 instead of ar%1
2096         anl     a,r%1
2097 }
2098
2099 replace {
2100         dec     ar%1
2101 } by {
2102         ;       Peephole 236.d  used r%1 instead of ar%1
2103         dec     r%1
2104 }
2105
2106 replace {
2107         djnz    ar%1,%2
2108 } by {
2109         ;       Peephole 236.e  used r%1 instead of ar%1
2110         djnz    r%1,%2
2111 }
2112
2113 replace {
2114         inc     ar%1
2115 } by {
2116         ;       Peephole 236.f  used r%1 instead of ar%1
2117         inc     r%1
2118 }
2119
2120 replace {
2121         mov     a,ar%1
2122 } by {
2123         ;       Peephole 236.g  used r%1 instead of ar%1
2124         mov     a,r%1
2125 }
2126
2127 replace {
2128         mov     ar%1,#%2
2129 } by {
2130         ;       Peephole 236.h  used r%1 instead of ar%1
2131         mov     r%1,#%2
2132 }
2133
2134 replace {
2135         mov     ar%1,a
2136 } by {
2137         ;       Peephole 236.i  used r%1 instead of ar%1
2138         mov     r%1,a
2139 }
2140
2141 replace {
2142         mov     ar%1,ar%2
2143 } by {
2144         ;       Peephole 236.j  used r%1 instead of ar%1
2145         mov     r%1,ar%2
2146 }
2147
2148 replace {
2149         orl     a,ar%1
2150 } by {
2151         ;       Peephole 236.k  used r%1 instead of ar%1
2152         orl     a,r%1
2153 }
2154
2155 replace {
2156         subb    a,ar%1
2157 } by {
2158         ;       Peephole 236.l  used r%1 instead of ar%1
2159         subb    a,r%1
2160 }
2161
2162 replace {
2163         xch     a,ar%1
2164 } by {
2165         ;       Peephole 236.m  used r%1 instead of ar%1
2166         xch     a,r%1
2167 }
2168
2169 replace {
2170         xrl     a,ar%1
2171 } by {
2172         ;       Peephole 236.n  used r%1 instead of ar%1
2173         xrl     a,r%1
2174 }
2175
2176 replace {
2177         sjmp    %1
2178 %2:
2179         mov     %3,%4
2180 %1:
2181         ret
2182 } by {
2183         ;       Peephole 237.a  removed sjmp to ret
2184         ret
2185 %2:
2186         mov     %3,%4
2187 %1:
2188         ret
2189 }
2190
2191 replace {
2192         sjmp    %1
2193 %2:
2194         mov     %3,%4
2195         mov     dpl,%5
2196         mov     dph,%6
2197 %1:
2198         ret
2199 } by {
2200         ;       Peephole 237.b  removed sjmp to ret
2201         ret
2202 %2:
2203         mov     %3,%4
2204         mov     dpl,%5
2205         mov     dph,%6
2206 %1:
2207         ret
2208 }
2209
2210 // applies to f.e. device/lib/log10f.c
2211 replace {
2212         mov     %1,%9
2213         mov     %2,%10
2214         mov     %3,%11
2215         mov     %4,%12
2216         
2217         mov     %5,%13
2218         mov     %6,%14
2219         mov     %7,%15
2220         mov     %8,%16
2221
2222         mov     %9,%1
2223         mov     %10,%2
2224         mov     %11,%3
2225         mov     %12,%4
2226 } by {
2227         mov     %1,%9
2228         mov     %2,%10
2229         mov     %3,%11
2230         mov     %4,%12
2231         
2232         mov     %5,%13
2233         mov     %6,%14
2234         mov     %7,%15
2235         mov     %8,%16
2236         ;       Peephole 238.a  removed 4 redundant moves
2237 } if operandsNotSame8 %1 %2 %3 %4 %5 %6 %7 %8
2238
2239 // applies to device/lib/log10f.c
2240 replace {
2241         mov     %1,%5
2242         mov     %2,%6
2243         mov     %3,%7
2244         mov     %4,%8
2245         
2246         mov     %5,%1
2247         mov     %6,%2
2248         mov     %7,%3
2249 } by {
2250         mov     %1,%5
2251         mov     %2,%6
2252         mov     %3,%7
2253         mov     %4,%8
2254         ;       Peephole 238.b  removed 3 redundant moves
2255 } if operandsNotSame7 %1 %2 %3 %4 %5 %6 %7
2256
2257 // applies to f.e. device/lib/time.c
2258 replace {
2259         mov     %1,%5
2260         mov     %2,%6
2261         
2262         mov     %3,%7
2263         mov     %4,%8
2264
2265         mov     %5,%1
2266         mov     %6,%2
2267 } by {
2268         mov     %1,%5
2269         mov     %2,%6
2270         
2271         mov     %3,%7
2272         mov     %4,%8
2273         ;       Peephole 238.c  removed 2 redundant moves
2274 } if operandsNotSame4 %1 %2 %3 %4
2275
2276 // applies to f.e. support/regression/tests/bug-524209.c
2277 replace {
2278         mov     %1,%4
2279         mov     %2,%5
2280         mov     %3,%6
2281
2282         mov     %4,%1
2283         mov     %5,%2
2284         mov     %6,%3
2285 } by {
2286         mov     %1,%4
2287         mov     %2,%5
2288         mov     %3,%6
2289         ;       Peephole 238.d  removed 3 redundant moves
2290 } if operandsNotSame6 %1 %2 %3 %4 %5 %6 
2291
2292 // applies to f.e. ser_ir.asm
2293 replace {
2294         mov     r%1,acc
2295 } by {
2296         ;       Peephole 239    used a instead of acc
2297         mov     r%1,a
2298 }
2299
2300 replace restart {
2301         mov     a,%1
2302         addc    a,#0x00
2303 } by {
2304         ;       Peephole 240    use clr instead of addc a,#0
2305         clr     a
2306         addc    a,%1
2307 }
2308
2309 // peepholes 241.a to 241.c and 241.d to 241.f need to be in order
2310 replace {
2311         cjne    r%1,#%2,%3
2312         cjne    r%4,#%5,%3
2313         cjne    r%6,#%7,%3
2314         cjne    r%8,#%9,%3
2315         mov     a,#0x01
2316         sjmp    %10      
2317 %3:     
2318         clr     a
2319 %10:     
2320 } by {
2321         ;       Peephole 241.a  optimized compare
2322         clr     a
2323         cjne    r%1,#%2,%3
2324         cjne    r%4,#%5,%3
2325         cjne    r%6,#%7,%3
2326         cjne    r%8,#%9,%3
2327         inc     a
2328 %3:
2329 %10:
2330
2331
2332 // applies to f.e. time.c
2333 replace {
2334         cjne    r%1,#%2,%3
2335         cjne    r%4,#%5,%3
2336         mov     a,#0x01
2337         sjmp    %6      
2338 %3:     
2339         clr     a
2340 %6:     
2341 } by {
2342         ;       Peephole 241.b  optimized compare
2343         clr     a
2344         cjne    r%1,#%2,%3
2345         cjne    r%4,#%5,%3
2346         inc     a
2347 %3:
2348 %6:
2349
2350
2351 // applies to f.e. malloc.c
2352 replace {
2353         cjne    r%1,#%2,%3
2354         mov     a,#0x01
2355         sjmp    %4
2356 %3:
2357         clr     a
2358 %4:     
2359 } by {
2360         ;       Peephole 241.c  optimized compare
2361         clr     a
2362         cjne    r%1,#%2,%3
2363         inc     a
2364 %3:
2365 %4:
2366
2367
2368 // applies to f.e. j = (k!=0x1000); 
2369 // with volatile idata long k;
2370 replace {
2371         cjne    @r%1,#%2,%3
2372         inc     r%1     
2373         cjne    @r%1,#%4,%3
2374         inc     r%1     
2375         cjne    @r%1,#%5,%3
2376         inc     r%1     
2377         cjne    @r%1,#%6,%3
2378         mov     a,#0x01
2379         sjmp    %7      
2380 %3:     
2381         clr     a
2382 %7:
2383 } by {
2384         ;       Peephole 241.d  optimized compare
2385         clr     a
2386         cjne    @r%1,#%2,%3
2387         inc     r%1
2388         cjne    @r%1,#%4,%3
2389         inc     r%1
2390         cjne    @r%1,#%5,%3
2391         inc     r%1
2392         cjne    @r%1,#%6,%3
2393         inc     a
2394 %3:
2395 %7:
2396
2397
2398 // applies to f.e. j = (k!=0x1000);
2399 // with volatile idata int k;
2400 replace {
2401         cjne    @r%1,#%2,%3
2402         inc     r%1     
2403         cjne    @r%1,#%4,%3
2404         mov     a,#0x01
2405         sjmp    %7      
2406 %3:     
2407         clr     a
2408 %7:     
2409 } by {
2410         ;       Peephole 241.e  optimized compare
2411         clr     a
2412         cjne    @r%1,#%2,%3
2413         inc     r%1
2414         cjne    @r%1,#%4,%3
2415         inc     a
2416 %3:
2417 %7:
2418
2419
2420 // applies to f.e. vprintf.asm (--stack-auto)
2421 replace {
2422         cjne    @r%1,#%2,%3
2423         mov     a,#0x01
2424         sjmp    %7
2425 %3:
2426         clr     a
2427 %7:     
2428 } by {
2429         ;       Peephole 241.f  optimized compare
2430         clr     a
2431         cjne    @r%1,#%2,%3
2432         inc     a
2433 %3:
2434 %7:
2435
2436
2437 // applies to f.e. scott-bool1.c
2438 replace {
2439         jnz     %1
2440         mov     %2,%3
2441 %1:
2442         jz      %4
2443 } by {
2444         ;       Peephole 242.a  avoided branch jnz to jz
2445         jnz     %1
2446         mov     %2,%3
2447         jz      %4
2448 %1:
2449 } if labelRefCount %1 1
2450
2451 // applies to f.e. scott-bool1.c
2452 replace {
2453         jnz     %1
2454         mov     %2,%3
2455         orl     a,%5
2456 %1:
2457         jz      %4
2458 } by {
2459         ;       Peephole 242.b  avoided branch jnz to jz
2460         jnz     %1
2461         mov     %2,%3
2462         orl     a,%5
2463         jz      %4
2464 %1:
2465 } if labelRefCount %1 1
2466
2467 // applies to f.e. logic.c
2468 replace {
2469         jnz     %1
2470         mov     %2,%3
2471         orl     a,%5
2472         orl     a,%6
2473         orl     a,%7
2474 %1:
2475         jz      %4
2476 } by {
2477         ;       Peephole 242.c  avoided branch jnz to jz
2478         jnz     %1
2479         mov     %2,%3
2480         orl     a,%5
2481         orl     a,%6
2482         orl     a,%7
2483         jz      %4
2484 %1:
2485 } if labelRefCount %1 1
2486
2487 // applies to f.e. vprintf.c
2488 // this is a rare case, usually the "tail increment" is noticed earlier
2489 replace {
2490         cjne    %1,%2,%3
2491         inc     %4
2492 %3:
2493         sjmp    %5      
2494 } by {
2495         ;       Peephole 243    avoided branch to sjmp
2496         cjne    %1,%2,%5
2497         inc     %4
2498 %3:
2499         sjmp    %5      
2500 } if labelInRange
2501
2502 // applies to f.e. simplefloat.c (saving 1 cycle)
2503 replace {
2504         mov     r%1,dpl
2505         mov     a,r%1
2506 } by {
2507         ;       Peephole 244.a  moving first to a instead of r%1
2508         mov     a,dpl
2509         mov     r%1,a
2510 }
2511
2512 // applies to f.e. _itoa.c (saving 1 cycle)
2513 replace {
2514         mov     r%1,dph
2515         mov     a,r%1
2516 } by {
2517         ;       Peephole 244.b  moving first to a instead of r%1
2518         mov     a,dph
2519         mov     r%1,a
2520 }
2521
2522
2523 // applies to f.e. bug-460010.c (saving 1 cycle)
2524 replace {
2525         mov     r%1,a
2526         mov     dpl,r%1
2527 } by {
2528         ;       Peephole 244.c  loading dpl from a instead of r%1
2529         mov     r%1,a
2530         mov     dpl,a
2531 }
2532
2533 replace {
2534         mov     r%1,a
2535         mov     dph,r%1
2536 } by {
2537         ;       Peephole 244.d  loading dph from a instead of r%1
2538         mov     r%1,a
2539         mov     dph,a
2540 }
2541
2542 // this one is safe but disables 245.a 245.b
2543 // please remove 245 if 245.a 245.b are found to be safe
2544 // applies to f.e. scott-compare.c
2545 replace {
2546         clr     a
2547         rlc     a
2548         mov     r%1,a
2549         cjne    a,#0x01,%2
2550 %2:     
2551         clr     a
2552         rlc     a
2553         mov     r%1,a
2554 } by {
2555         ;       Peephole 245    optimized complement (r%1 and acc set needed?)
2556         cpl     c
2557         clr     a
2558         rlc     a
2559         mov     r%1,a   
2560 } if labelRefCount %2 1
2561
2562 // this one will not be triggered if 245 is present
2563 // please remove 245 if 245.a 245.b are found to be safe
2564 // applies to f.e. vprintf.c
2565 replace {
2566         clr     a
2567         rlc     a
2568         mov     r%1,a
2569         cjne    a,#0x01,%2
2570 %2:     
2571         clr     a
2572         rlc     a
2573         mov     r%1,a
2574         jz      %3
2575 } by {
2576         ;       Peephole 245.a  optimized conditional jump (r%1 and acc not set!)
2577         jc      %3
2578 } if labelRefCount %2 1
2579
2580 // this one will not be triggered if 245 is present
2581 // please remove 245 if 245.a 245.b are found to be safe
2582 // applies to f.e. scott-compare.c
2583 replace {
2584         clr     a
2585         rlc     a
2586         mov     r%1,a
2587         cjne    a,#0x01,%2
2588 %2:     
2589         clr     a
2590         rlc     a
2591         mov     r%1,a
2592         jnz     %3
2593 } by {
2594         ;       Peephole 245.b  optimized conditional jump (r%1 and acc not set!)
2595         jnc     %3
2596 } if labelRefCount %2 1
2597
2598
2599 // rules 246.x apply to f.e. bitfields.c
2600 replace {
2601         mov     dptr,#%1
2602         movx    a,@dptr
2603         anl     a,#%2
2604         movx    @dptr,a
2605         mov     dptr,#%1
2606         movx    a,@dptr
2607         anl     a,#%3
2608         movx    @dptr,a
2609 } by {
2610         ;       Peephole 246.a  combined clr/clr 
2611         mov     dptr,#%1
2612         movx    a,@dptr
2613         anl     a,#%2&%3
2614         movx    @dptr,a
2615 } if notVolatile %1
2616
2617 replace {
2618         mov     dptr,#%1
2619         movx    a,@dptr
2620         orl     a,#%2
2621         movx    @dptr,a
2622         mov     dptr,#%1
2623         movx    a,@dptr
2624         orl     a,#%3
2625         movx    @dptr,a
2626 } by {
2627         ;       Peephole 246.b  combined set/set 
2628         mov     dptr,#%1
2629         movx    a,@dptr
2630         orl     a,#%2|%3
2631         movx    @dptr,a
2632 } if notVolatile %1
2633
2634 replace {
2635         mov     dptr,#%1
2636         movx    a,@dptr
2637         orl     a,#%2
2638         movx    @dptr,a
2639         mov     dptr,#%1
2640         movx    a,@dptr
2641         anl     a,#%3
2642         movx    @dptr,a
2643 } by {
2644         ;       Peephole 246.c  combined set/clr 
2645         mov     dptr,#%1
2646         movx    a,@dptr
2647         orl     a,#%2
2648         anl     a,#%3
2649         movx    @dptr,a
2650 } if notVolatile %1
2651
2652 replace {
2653         mov     dptr,#%1
2654         movx    a,@dptr
2655         anl     a,#%2
2656         movx    @dptr,a
2657         mov     dptr,#%1
2658         movx    a,@dptr
2659         orl     a,#%3
2660         movx    @dptr,a
2661 } by {
2662         ;       Peephole 246.d  combined clr/set 
2663         mov     dptr,#%1
2664         movx    a,@dptr
2665         anl     a,#%2
2666         orl     a,#%3
2667         movx    @dptr,a
2668 } if notVolatile %1
2669
2670 replace {
2671         mov     dptr,#%1
2672         movx    a,@dptr
2673         orl     a,#%2
2674         anl     a,#%3
2675         movx    @dptr,a
2676         mov     dptr,#%1
2677         movx    a,@dptr
2678         anl     a,#%4
2679         movx    @dptr,a
2680 } by {
2681         ;       Peephole 246.e  combined set/clr/clr 
2682         mov     dptr,#%1
2683         movx    a,@dptr
2684         orl     a,#%2
2685         anl     a,#%3&%4
2686         movx    @dptr,a
2687 } if notVolatile %1
2688
2689 replace {
2690         mov     dptr,#%1
2691         movx    a,@dptr
2692         orl     a,#%2
2693         anl     a,#%3
2694         movx    @dptr,a
2695         mov     dptr,#%1
2696         movx    a,@dptr
2697         orl     a,#%4
2698         movx    @dptr,a
2699 } by {
2700         ;       Peephole 246.f  combined set/clr/set 
2701         mov     dptr,#%1
2702         movx    a,@dptr
2703         orl     a,#%2
2704         anl     a,#%3
2705         orl     a,#%4
2706         movx    @dptr,a
2707 } if notVolatile %1
2708
2709 replace {
2710         mov     dptr,#%1
2711         movx    a,@dptr
2712         anl     a,#%2
2713         orl     a,#%3
2714         movx    @dptr,a
2715         mov     dptr,#%1
2716         movx    a,@dptr
2717         anl     a,#%4
2718         movx    @dptr,a
2719 } by {
2720         ;       Peephole 246.g  combined clr/set/clr 
2721         mov     dptr,#%1
2722         movx    a,@dptr
2723         anl     a,#%2
2724         orl     a,#%3
2725         anl     a,#%4
2726         movx    @dptr,a
2727 } if notVolatile %1
2728
2729 replace {
2730         mov     dptr,#%1
2731         movx    a,@dptr
2732         anl     a,#%2
2733         orl     a,#%3
2734         movx    @dptr,a
2735         mov     dptr,#%1
2736         movx    a,@dptr
2737         orl     a,#%4
2738         movx    @dptr,a
2739 } by {
2740         ;       Peephole 246.h  combined clr/set/set 
2741         mov     dptr,#%1
2742         movx    a,@dptr
2743         anl     a,#%2
2744         orl     a,#%3|%4
2745         movx    @dptr,a
2746 } if notVolatile %1
2747
2748
2749
2750
2751 // rules 247.x apply to f.e. bitfields.c
2752 replace {
2753         mov     r%5,#%1
2754         mov     a,@r%5
2755         anl     a,#%2
2756         mov     @r%5,a
2757         mov     r%5,#%1
2758         mov     a,@r%5
2759         anl     a,#%3
2760         mov     @r%5,a
2761 } by {
2762         ;       Peephole 247.a  combined clr/clr 
2763         mov     r%5,#%1
2764         mov     a,@r%5
2765         anl     a,#%2&%3
2766         mov     @r%5,a
2767 } if notVolatile %1
2768
2769 replace {
2770         mov     r%5,#%1
2771         mov     a,@r%5
2772         orl     a,#%2
2773         mov     @r%5,a
2774         mov     r%5,#%1
2775         mov     a,@r%5
2776         orl     a,#%3
2777         mov     @r%5,a
2778 } by {
2779         ;       Peephole 247.b  combined set/set 
2780         mov     r%5,#%1
2781         mov     a,@r%5
2782         orl     a,#%2|%3
2783         mov     @r%5,a
2784 } if notVolatile %1
2785
2786 replace {
2787         mov     r%5,#%1
2788         mov     a,@r%5
2789         orl     a,#%2
2790         mov     @r%5,a
2791         mov     r%5,#%1
2792         mov     a,@r%5
2793         anl     a,#%3
2794         mov     @r%5,a
2795 } by {
2796         ;       Peephole 247.c  combined set/clr 
2797         mov     r%5,#%1
2798         mov     a,@r%5
2799         orl     a,#%2
2800         anl     a,#%3
2801         mov     @r%5,a
2802 } if notVolatile %1
2803
2804 replace {
2805         mov     r%5,#%1
2806         mov     a,@r%5
2807         anl     a,#%2
2808         mov     @r%5,a
2809         mov     r%5,#%1
2810         mov     a,@r%5
2811         orl     a,#%3
2812         mov     @r%5,a
2813 } by {
2814         ;       Peephole 247.d  combined clr/set 
2815         mov     r%5,#%1
2816         mov     a,@r%5
2817         anl     a,#%2
2818         orl     a,#%3
2819         mov     @r%5,a
2820 } if notVolatile %1
2821
2822 replace {
2823         mov     r%5,#%1
2824         mov     a,@r%5
2825         orl     a,#%2
2826         anl     a,#%3
2827         mov     @r%5,a
2828         mov     r%5,#%1
2829         mov     a,@r%5
2830         anl     a,#%4
2831         mov     @r%5,a
2832 } by {
2833         ;       Peephole 247.e  combined set/clr/clr 
2834         mov     r%5,#%1
2835         mov     a,@r%5
2836         orl     a,#%2
2837         anl     a,#%3&%4
2838         mov     @r%5,a
2839 } if notVolatile %1
2840
2841 replace {
2842         mov     r%5,#%1
2843         mov     a,@r%5
2844         orl     a,#%2
2845         anl     a,#%3
2846         mov     @r%5,a
2847         mov     r%5,#%1
2848         mov     a,@r%5
2849         orl     a,#%4
2850         mov     @r%5,a
2851 } by {
2852         ;       Peephole 247.f  combined set/clr/set 
2853         mov     r%5,#%1
2854         mov     a,@r%5
2855         orl     a,#%2
2856         anl     a,#%3
2857         orl     a,#%4
2858         mov     @r%5,a
2859 } if notVolatile %1
2860
2861 replace {
2862         mov     r%5,#%1
2863         mov     a,@r%5
2864         anl     a,#%2
2865         orl     a,#%3
2866         mov     @r%5,a
2867         mov     r%5,#%1
2868         mov     a,@r%5
2869         anl     a,#%4
2870         mov     @r%5,a
2871 } by {
2872         ;       Peephole 247.g  combined clr/set/clr 
2873         mov     r%5,#%1
2874         mov     a,@r%5
2875         anl     a,#%2
2876         orl     a,#%3
2877         anl     a,#%4
2878         mov     @r%5,a
2879 } if notVolatile %1
2880
2881 replace {
2882         mov     r%5,#%1
2883         mov     a,@r%5
2884         anl     a,#%2
2885         orl     a,#%3
2886         mov     @r%5,a
2887         mov     r%5,#%1
2888         mov     a,@r%4
2889         orl     a,#%4
2890         mov     @r%5,a
2891 } by {
2892         ;       Peephole 247.h  combined clr/set/set 
2893         mov     r%5,#%1
2894         mov     a,@r%5
2895         anl     a,#%2
2896         orl     a,#%3|%4
2897         mov     @r%5,a
2898 } if notVolatile %1
2899
2900
2901 // Peepholes 248.x have to be compatible with the keyword volatile.
2902 // They optimize typical accesses to memory mapped I/O devices:
2903 // volatile xdata char t; t|=0x01; 
2904 replace {
2905         mov     dptr,%1
2906         movx    a,@dptr
2907         mov     r%2,a
2908         mov     dptr,%1
2909         mov     a,%3
2910         orl     a,r%2
2911         movx    @dptr,a
2912 } by {
2913         ;       Peephole 248.a  optimized or to xdata
2914         mov     dptr,%1
2915         movx    a,@dptr
2916         mov     r%2,a
2917         orl     a,%3
2918         movx    @dptr,a
2919 }
2920
2921 // volatile xdata char t; t&=0x01; 
2922 replace {
2923         mov     dptr,%1
2924         movx    a,@dptr
2925         mov     r%2,a
2926         mov     dptr,%1
2927         mov     a,%3
2928         anl     a,r%2
2929         movx    @dptr,a
2930 } by {
2931         ;       Peephole 248.b  optimized and to xdata
2932         mov     dptr,%1
2933         movx    a,@dptr
2934         mov     r%2,a
2935         anl     a,%3
2936         movx    @dptr,a
2937 }
2938
2939 // volatile xdata char t; t^=0x01; 
2940 replace {
2941         mov     dptr,%1
2942         movx    a,@dptr
2943         mov     r%2,a
2944         mov     dptr,%1
2945         mov     a,%3
2946         xrl     a,r%2
2947         movx    @dptr,a
2948 } by {
2949         ;       Peephole 248.c  optimized xor to xdata
2950         mov     dptr,%1
2951         movx    a,@dptr
2952         mov     r%2,a
2953         xrl     a,%3
2954         movx    @dptr,a
2955 }
2956
2957 // volatile xdata char t; t|=0x01; t&=~0x01; t|=0x01;
2958 replace {
2959         mov     dptr,%1
2960         movx    a,@dptr
2961         mov     r%2,a
2962         orl     a,%3
2963         movx    @dptr,a
2964
2965         mov     dptr,%1
2966         movx    a,@dptr
2967         mov     r%2,a
2968         anl     a,%4
2969         movx    @dptr,a
2970
2971         mov     dptr,%1
2972         movx    a,@dptr
2973         mov     r%2,a
2974         orl     a,%5
2975         movx    @dptr,a
2976 } by {
2977         ;       Peephole 248.d  optimized or/and/or to volatile xdata
2978         mov     dptr,%1
2979         movx    a,@dptr
2980         orl     a,%3
2981         movx    @dptr,a
2982         movx    a,@dptr
2983         anl     a,%4
2984         movx    @dptr,a
2985         movx    a,@dptr
2986         mov     r%2,a
2987         orl     a,%5
2988         movx    @dptr,a
2989 }
2990
2991 // volatile xdata char t; t&=~0x01; t|=0x01; t&=~0x01;
2992 replace {
2993         mov     dptr,%1
2994         movx    a,@dptr
2995         mov     r%2,a
2996         anl     a,%3
2997         movx    @dptr,a
2998
2999         mov     dptr,%1
3000         movx    a,@dptr
3001         mov     r%2,a
3002         orl     a,%4
3003         movx    @dptr,a
3004
3005         mov     dptr,%1
3006         movx    a,@dptr
3007         mov     r%2,a
3008         anl     a,%5
3009         movx    @dptr,a
3010 } by {
3011         ;       Peephole 248.e  optimized and/or/and to volatile xdata
3012         mov     dptr,%1
3013         movx    a,@dptr
3014         anl     a,%3
3015         movx    @dptr,a
3016         movx    a,@dptr
3017         orl     a,%4
3018         movx    @dptr,a
3019         movx    a,@dptr
3020         mov     r%2,a
3021         anl     a,%5
3022         movx    @dptr,a
3023 }
3024
3025 // volatile xdata char t; t|=0x01; t&=~0x01;
3026 replace {
3027         mov     dptr,%1
3028         movx    a,@dptr
3029         mov     r%2,a
3030         orl     a,%3
3031         movx    @dptr,a
3032
3033         mov     dptr,%1
3034         movx    a,@dptr
3035         mov     r%2,a
3036         anl     a,%4
3037         movx    @dptr,a
3038 } by {
3039         ;       Peephole 248.f  optimized or/and to volatile xdata
3040         mov     dptr,%1
3041         movx    a,@dptr
3042         orl     a,%3
3043         movx    @dptr,a
3044         movx    a,@dptr
3045         mov     r%2,a
3046         anl     a,%4
3047         movx    @dptr,a
3048 }
3049
3050 // volatile xdata char t; t&=~0x01; t|=0x01;
3051 replace {
3052         mov     dptr,%1
3053         movx    a,@dptr
3054         mov     r%2,a
3055         anl     a,%3
3056         movx    @dptr,a
3057
3058         mov     dptr,%1
3059         movx    a,@dptr
3060         mov     r%2,a
3061         orl     a,%4
3062         movx    @dptr,a
3063 } by {
3064         ;       Peephole 248.g  optimized and/or to volatile xdata
3065         mov     dptr,%1
3066         movx    a,@dptr
3067         anl     a,%3
3068         movx    @dptr,a
3069         movx    a,@dptr
3070         mov     r%2,a
3071         orl     a,%4
3072         movx    @dptr,a
3073 }
3074
3075 // volatile xdata char t; t^=0x01; t^=0x01;
3076 replace {
3077         mov     dptr,%1
3078         movx    a,@dptr
3079         mov     r%2,a
3080         xrl     a,%3
3081         movx    @dptr,a
3082
3083         mov     dptr,%1
3084         movx    a,@dptr
3085         mov     r%2,a
3086         xrl     a,%4
3087         movx    @dptr,a
3088 } by {
3089         ;       Peephole 248.h  optimized xor/xor to volatile xdata
3090         mov     dptr,%1
3091         movx    a,@dptr
3092         xrl     a,%3
3093         movx    @dptr,a
3094         movx    a,@dptr
3095         mov     r%2,a
3096         xrl     a,%4
3097         movx    @dptr,a
3098 }
3099
3100 replace {
3101         jnz     %1
3102 %1:
3103 } by {
3104         ;       Peephole 249a    jump optimization
3105 } if labelRefCount %1 1
3106
3107 replace {
3108         jz      %1
3109 %1:
3110 } by {
3111         ;       Peephole 249b    jump optimization
3112 } if labelRefCount %1 1
3113
3114
3115 // This allows non-interrupt and interrupt code to safely compete
3116 // for a resource without the non-interrupt code having to disable
3117 // interrupts:
3118 // volatile bit resource_is_free;
3119 // if( resource_is_free ) {
3120 //     resource_is_free=0; do_something; resource_is_free=1;
3121 // }
3122 replace {
3123         jnb     %1,%2
3124 %3:
3125         clr     %1
3126 } by {
3127         ;       Peephole 250.a  using atomic test and clear
3128         jbc     %1,%3
3129         sjmp    %2
3130 %3:
3131 } if labelRefCount %3 0
3132
3133 replace {
3134         jb      %1,%2
3135         ljmp    %3
3136 %2:
3137         clr     %1
3138 } by {
3139         ;       Peephole 250.b  using atomic test and clear
3140         jbc     %1,%2
3141         ljmp    %3
3142 %2:
3143 } if labelRefCount %2 1
3144
3145
3146 // not before peephole 250.b
3147 replace {
3148         ljmp    %5
3149 } by {
3150         ;       Peephole 251.a  replaced ljmp to ret with ret
3151         ret
3152 } if labelIsReturnOnly
3153
3154 // not before peephole 250.b
3155 replace {
3156         sjmp    %5
3157 } by {
3158         ;       Peephole 251.b  replaced sjmp to ret with ret
3159         ret
3160 } if labelIsReturnOnly
3161
3162 // applies to shifts.c and when accessing arrays with an unsigned integer index
3163 // saving 1 byte, 2 cycles
3164 replace {
3165         mov     r%1,%2
3166         mov     a,(%2 + 1)
3167         xch     a,r%1
3168         add     a,acc
3169         xch     a,r%1
3170         rlc     a
3171         mov     r%3,a
3172 } by {
3173         ;       Peephole 252    optimized left shift
3174         mov     a,%2
3175         add     a,acc
3176         mov     r%1,a
3177         mov     a,(%2 + 1)
3178         rlc     a
3179         mov     r%3,a
3180 }
3181
3182 // applies to: void test( char c ) { if( c ) func1(); else func2(); }
3183 replace {
3184         lcall   %1
3185         ret
3186 } by {
3187         ;       Peephole 253.a  replaced lcall/ret with ljmp
3188         ljmp    %1
3189 }
3190
3191 // applies to: void test( char c ) { if( c ) func1(); else func2(); }
3192 replace {
3193         lcall   %1
3194 %2:
3195         ret
3196 } by {
3197         ;       Peephole 253.b  replaced lcall/ret with ljmp
3198         ljmp    %1
3199 } if labelRefCount %2 0
3200
3201 // applies to f.e. scott-bool1.c
3202 replace {
3203         lcall   %1
3204 %2:
3205         ret
3206 } by {
3207         ;       Peephole 253.c  replaced lcall with ljmp
3208         ljmp    %1
3209 %2:
3210         ret
3211 }