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