Try to make the peephole optimizer smarter by maintaining
[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 replace {
1232         add     a,#%1
1233         mov     dpl,a
1234         clr     a
1235         addc    a,#(%1 >> 8)
1236         mov     dph,a
1237         clr     a
1238         movc    a,@a+dptr
1239 } by {
1240         ;       Peephole 186.d  optimized movc sequence
1241         mov     dptr,#%1
1242         movc    a,@a+dptr
1243 }
1244
1245 replace {
1246         mov     r%1,%2
1247         anl     ar%1,#%3
1248         mov     a,r%1
1249 } by {
1250         ;       Peephole 187    used a instead of ar%1 for anl
1251         mov     a,%2
1252         anl     a,#%3
1253         mov     r%1,a
1254 }
1255
1256 replace {
1257         mov     %1,a
1258         mov     dptr,%2
1259         movc    a,@a+dptr
1260         mov     %1,a
1261 } by {
1262         ;       Peephole 188    removed redundant mov
1263         mov     dptr,%2
1264         movc    a,@a+dptr
1265         mov     %1,a
1266 } if notVolatile %1
1267
1268 replace {
1269         anl     a,#0x0f
1270         mov     %1,a
1271         mov     a,#0x0f
1272         anl     a,%1
1273 } by {
1274         ;       Peephole 189    removed redundant mov and anl
1275         anl     a,#0x0f
1276         mov     %1,a
1277 } if notVolatile %1
1278
1279 // rules 190 & 191 need to be in order
1280 replace {
1281         mov     a,%1
1282         lcall   __gptrput
1283         mov     a,%1
1284 } by {
1285         ;       Peephole 190    removed redundant mov
1286         mov     a,%1
1287         lcall   __gptrput
1288 } if notVolatile %1
1289
1290 replace {
1291         mov     %1,a
1292         mov     dpl,%2
1293         mov     dph,%3
1294         mov     b,%4
1295         mov     a,%1
1296 } by {
1297         ;       Peephole 191    removed redundant mov
1298         mov     %1,a
1299         mov     dpl,%2
1300         mov     dph,%3
1301         mov     b,%4
1302 } if notVolatile %1
1303
1304 replace {
1305         mov     r%1,a
1306         mov     @r%2,ar%1
1307 } by {
1308         ;       Peephole 192    used a instead of ar%1 as source
1309         mov     r%1,a
1310         mov     @r%2,a
1311 }
1312
1313 replace {
1314         jnz     %3
1315         mov     a,%4
1316         jnz     %3
1317         mov     a,%9
1318         jnz     %3
1319         mov     a,%12
1320         cjne    %13,%14,%3
1321         sjmp    %7
1322 %3:
1323         sjmp    %8
1324 } by {
1325         ;       Peephole 193.a  optimized misc jump sequence
1326         jnz     %8
1327         mov     a,%4
1328         jnz     %8
1329         mov     a,%9
1330         jnz     %8
1331         mov     a,%12
1332         cjne    %13,%14,%8
1333         sjmp    %7
1334 ;%3:
1335 } if labelRefCount %3 4
1336
1337 replace {
1338         cjne    %1,%2,%3
1339         mov     a,%4
1340         cjne    %5,%6,%3
1341         mov     a,%9
1342         cjne    %10,%11,%3
1343         mov     a,%12
1344         cjne    %13,%14,%3
1345         sjmp    %7
1346 %3:
1347         sjmp    %8
1348 } by {
1349         ;       Peephole 193.b  optimized misc jump sequence
1350         cjne    %1,%2,%8
1351         mov     a,%4
1352         cjne    %5,%6,%8
1353         mov     a,%9
1354         cjne    %10,%11,%8
1355         mov     a,%12
1356         cjne    %13,%14,%8
1357         sjmp    %7
1358 ;%3:
1359 } if labelRefCount %3 4
1360
1361 replace {
1362         cjne    @%1,%2,%3
1363         inc     %1
1364         cjne    @%1,%6,%3
1365         inc     %1
1366         cjne    @%1,%11,%3
1367         inc     %1
1368         cjne    @%1,%14,%3
1369         sjmp    %7
1370 %3:
1371         sjmp    %8
1372 } by {
1373         ;       Peephole 193.c  optimized misc jump sequence
1374         cjne    @%1,%2,%8
1375         inc     %1
1376         cjne    @%1,%6,%8
1377         inc     %1
1378         cjne    @%1,%11,%8
1379         inc     %1
1380         cjne    @%1,%14,%8
1381         sjmp    %7
1382 ;%3:
1383 } if labelRefCount %3 4
1384
1385 replace {
1386         cjne    %1,%2,%3
1387         cjne    %5,%6,%3
1388         cjne    %10,%11,%3
1389         cjne    %13,%14,%3
1390         sjmp    %7
1391 %3:
1392         sjmp    %8
1393 } by {
1394         ;       Peephole 194    optimized misc jump sequence
1395         cjne    %1,%2,%8
1396         cjne    %5,%6,%8
1397         cjne    %10,%11,%8
1398         cjne    %13,%14,%8
1399         sjmp    %7
1400 ;%3:
1401 } if labelRefCount %3 4
1402
1403 replace {
1404         jnz     %3
1405         mov     a,%4
1406         jnz     %3
1407         mov     a,%9
1408         cjne    %10,%11,%3
1409         sjmp    %7
1410 %3:
1411         sjmp    %8
1412 } by {
1413         ;       Peephole 195.a  optimized misc jump sequence
1414         jnz     %8
1415         mov     a,%4
1416         jnz     %8
1417         mov     a,%9
1418         cjne    %10,%11,%8
1419         sjmp    %7
1420 ;%3:
1421 } if labelRefCount %3 3
1422
1423 replace {
1424         cjne    %1,%2,%3
1425         mov     a,%4
1426         cjne    %5,%6,%3
1427         mov     a,%9
1428         cjne    %10,%11,%3
1429         sjmp    %7
1430 %3:
1431         sjmp    %8
1432 } by {
1433         ;       Peephole 195.b  optimized misc jump sequence
1434         cjne    %1,%2,%8
1435         mov     a,%4
1436         cjne    %5,%6,%8
1437         mov     a,%9
1438         cjne    %10,%11,%8
1439         sjmp    %7
1440 ;%3:
1441 } if labelRefCount %3 3
1442
1443 replace {
1444         cjne    @%1,%2,%3
1445         inc     %1
1446         cjne    @%1,%6,%3
1447         inc     %1
1448         cjne    @%1,%11,%3
1449         sjmp    %7
1450 %3:
1451         sjmp    %8
1452 } by {
1453         ;       Peephole 195.c  optimized misc jump sequence
1454         cjne    @%1,%2,%8
1455         inc     %1
1456         cjne    @%1,%6,%8
1457         inc     %1
1458         cjne    @%1,%11,%8
1459         sjmp    %7
1460 ;%3:
1461 } if labelRefCount %3 3
1462
1463 replace {
1464         cjne    %1,%2,%3
1465         cjne    %5,%6,%3
1466         cjne    %10,%11,%3
1467         sjmp    %7
1468 %3:
1469         sjmp    %8
1470 } by {
1471         ;       Peephole 196    optimized misc jump sequence
1472         cjne    %1,%2,%8
1473         cjne    %5,%6,%8
1474         cjne    %10,%11,%8
1475         sjmp    %7
1476 ;%3:
1477 } if labelRefCount %3 3
1478
1479 replace {
1480         jnz     %3
1481         mov     a,%4
1482         cjne    %5,%6,%3
1483         sjmp    %7
1484 %3:
1485         sjmp    %8 
1486 } by {
1487         ;       Peephole 197.a  optimized misc jump sequence
1488         jnz     %8
1489         mov     a,%4
1490         cjne    %5,%6,%8
1491         sjmp    %7
1492 ;%3:     
1493 } if labelRefCount %3 2
1494
1495 replace {
1496         cjne    %1,%2,%3
1497         mov     a,%4
1498         cjne    %5,%6,%3
1499         sjmp    %7
1500 %3:
1501         sjmp    %8
1502 } by {
1503         ;       Peephole 197.b  optimized misc jump sequence
1504         cjne    %1,%2,%8
1505         mov     a,%4
1506         cjne    %5,%6,%8
1507         sjmp    %7
1508 ;%3:
1509 } if labelRefCount %3 2
1510
1511 replace {
1512         cjne     @%1,%2,%3
1513         inc     %1
1514         cjne    @%1,%6,%3
1515         sjmp    %7
1516 %3:
1517         sjmp    %8
1518 } by {
1519         ;       Peephole 197.c  optimized misc jump sequence
1520         cjne    @%1,%2,%8
1521         inc     %1
1522         cjne    @%1,%6,%8
1523         sjmp    %7
1524 ;%3:
1525 } if labelRefCount %3 2
1526
1527 replace {
1528         cjne    %1,%2,%3
1529         cjne    %5,%6,%3
1530         sjmp    %7
1531 %3:
1532         sjmp    %8
1533 } by {
1534         ;       Peephole 198    optimized misc jump sequence
1535         cjne    %1,%2,%8
1536         cjne    %5,%6,%8
1537         sjmp    %7
1538 ;%3:
1539 } if labelRefCount %3 2
1540
1541 replace {
1542         cjne    %1,%2,%3
1543         sjmp    %4
1544 %3:
1545         sjmp    %5
1546 } by {
1547         ;       Peephole 199    optimized misc jump sequence
1548         cjne    %1,%2,%5
1549         sjmp    %4
1550 ;%3:
1551 } if labelRefCount %3 1
1552
1553 replace {
1554         sjmp    %1
1555 %1:
1556 } by {
1557         ;       Peephole 200    removed redundant sjmp
1558 %1:
1559 }
1560
1561 replace {
1562         sjmp    %1
1563 %2:
1564 %1:
1565 } by {
1566         ;       Peephole 201    removed redundant sjmp
1567 %2:
1568 %1:
1569 }
1570
1571 replace {
1572         push    acc
1573         mov     dptr,%1
1574         pop     acc
1575 } by {
1576         ;       Peephole 202    removed redundant push pop
1577         mov     dptr,%1
1578 }
1579
1580 replace {
1581         mov     r%1,_spx
1582         lcall   %2
1583         mov     r%1,_spx
1584 } by {
1585         ;       Peephole 203    removed mov  r%1,_spx
1586         lcall   %2
1587 }
1588
1589 replace {
1590         mov     %1,a
1591         add     a,acc
1592         mov     %1,a
1593 } by {
1594         ;       Peephole 204    removed redundant mov
1595         add     a,acc
1596         mov     %1,a
1597 } if notVolatile %1
1598
1599 replace {
1600         djnz    %1,%2
1601         sjmp    %3
1602 %2:
1603         sjmp    %4
1604 %3:
1605 } by {
1606         ;       Peephole 205    optimized misc jump sequence
1607         djnz    %1,%4
1608 %2:
1609 %3:
1610 } if labelRefCount %2 1
1611
1612 replace {
1613         mov     %1,%1
1614 } by {
1615         ;       Peephole 206    removed redundant mov %1,%1
1616 } if notVolatile
1617
1618 replace {
1619         mov     a,_bp
1620         add     a,#0x00
1621         mov     %1,a
1622 } by {
1623         ;       Peephole 207    removed zero add (acc not set to %1, flags undefined)
1624         mov     %1,_bp
1625 }
1626
1627 replace {
1628         push    acc
1629         mov     r%1,_bp
1630         pop     acc
1631 } by {
1632         ;       Peephole 208    removed redundant push pop
1633         mov     r%1,_bp
1634 }
1635
1636 replace {
1637         mov     a,_bp
1638         add     a,#0x00
1639         inc     a
1640         mov     %1,a
1641 } by {
1642         ;       Peephole 209    optimized increment (acc not set to %1, flags undefined)
1643         mov     %1,_bp
1644         inc     %1
1645 }
1646
1647 replace {
1648         mov     dptr,#((((%1 >> 8)) <<8) + %1)
1649 } by {
1650         ;       Peephole 210    simplified expression
1651         mov     dptr,#%1
1652 }
1653
1654 replace {
1655         push    %1
1656         pop     %1
1657 } by {
1658         ;       Peephole 211    removed redundant push %1 pop %1  
1659
1660
1661 replace {
1662         mov     a,_bp
1663         add     a,#0x01
1664         mov     r%1,a
1665 } by {
1666         ;       Peephole 212    reduced add sequence to inc
1667         mov     r%1,_bp
1668         inc     r%1
1669 }
1670
1671 replace {
1672         mov     %1,#(( %2 >> 8 ) ^ 0x80)
1673 } by {
1674         ;       Peephole 213.a  inserted fix
1675         mov     %1,#(%2 >> 8)
1676         xrl     %1,#0x80
1677 }
1678
1679 replace {
1680         mov     %1,#(( %2 + %3 >> 8 ) ^ 0x80)
1681 } by {
1682         ;       Peephole 213.b  inserted fix     
1683         mov     %1,#((%2 + %3) >> 8)
1684         xrl     %1,#0x80
1685 }
1686
1687
1688 replace  {
1689         mov     %1,a
1690         mov     a,%2
1691         add     a,%1
1692 } by {
1693         ;       Peephole 214    reduced some extra moves
1694         mov     %1,a
1695         add     a,%2
1696 } if operandsNotSame
1697
1698 replace {
1699         mov     %1,a
1700         add     a,%2
1701         mov     %1,a
1702 } by {
1703         ;       Peephole 215    removed some moves
1704         add     a,%2
1705         mov     %1,a
1706 } if operandsNotSame
1707
1708 replace {
1709         mov     r%1,%2
1710         clr     a
1711         inc     r%1
1712         mov     @r%1,a
1713         dec     r%1
1714         mov     @r%1,a
1715 } by {
1716         ;       Peephole 216    simplified clear (2bytes)
1717         mov     r%1,%2
1718         clr     a
1719         mov     @r%1,a
1720         inc     r%1
1721         mov     @r%1,a
1722 }
1723
1724 replace {
1725         mov     r%1,%2
1726         clr     a
1727         inc     r%1
1728         inc     r%1
1729         mov     @r%1,a
1730         dec     r%1
1731         mov     @r%1,a
1732         dec     r%1
1733         mov     @r%1,a
1734 } by {
1735         ;       Peephole 217    simplified clear (3bytes)
1736         mov     r%1,%2
1737         clr     a
1738         mov     @r%1,a
1739         inc     r%1
1740         mov     @r%1,a
1741         inc     r%1
1742         mov     @r%1,a
1743 }
1744
1745 replace {
1746         mov     r%1,%2
1747         clr     a
1748         inc     r%1
1749         inc     r%1
1750         inc     r%1
1751         mov     @r%1,a
1752         dec     r%1
1753         mov     @r%1,a
1754         dec     r%1
1755         mov     @r%1,a
1756         dec     r%1
1757         mov     @r%1,a
1758 } by {
1759         ;       Peephole 218    simplified clear (4bytes)
1760         mov     r%1,%2
1761         clr     a
1762         mov     @r%1,a
1763         inc     r%1
1764         mov     @r%1,a
1765         inc     r%1
1766         mov     @r%1,a
1767         inc     r%1
1768         mov     @r%1,a
1769 }
1770
1771 replace {
1772         clr     a
1773         movx    @dptr,a
1774         mov     dptr,%1
1775         clr     a
1776         movx    @dptr,a
1777 } by {
1778         ;       Peephole 219    removed redundant clear
1779         clr     a
1780         movx    @dptr,a
1781         mov     dptr,%1
1782         movx    @dptr,a
1783 }
1784
1785 replace {
1786         clr     a
1787         movx    @dptr,a
1788         mov     dptr,%1
1789         movx    @dptr,a
1790         mov     dptr,%2
1791         clr     a
1792         movx    @dptr,a
1793 } by {
1794         ;       Peephole 219.a  removed redundant clear
1795         clr     a
1796         movx    @dptr,a
1797         mov     dptr,%1
1798         movx    @dptr,a
1799         mov     dptr,%2
1800         movx    @dptr,a
1801 }
1802
1803 replace {
1804         mov     dps,#0x00
1805         mov     dps,#0x01
1806 } by {
1807         ;       Peephole 220.a  removed bogus DPS set
1808         mov     dps,#0x01
1809 }
1810
1811 replace {
1812         mov     dps,#0x01
1813         mov     dps,#0x00
1814 } by {
1815         ;       Peephole 220.b  removed bogus DPS set
1816         mov     dps,#0x00
1817 }
1818
1819 replace {
1820         mov     %1 + %2,(%2 + %1)
1821 } by {
1822         ;       Peephole 221.a  remove redundant move
1823 } if notVolatile
1824
1825 replace {
1826         mov     (%1 + %2 + %3),((%2 + %1) + %3)
1827 } by {
1828         ;       Peephole 221.b  remove redundant move
1829 } if notVolatile
1830
1831 replace {
1832         dec     r%1
1833         inc     r%1
1834 } by {
1835         ;       Peephole 222    removed dec/inc pair
1836 }
1837
1838 replace {
1839         mov     %1,dpl
1840         mov     %2,dph
1841         mov     dpl,%1
1842         mov     dph,%2
1843 } by {
1844         ;       Peephole 223    removed redundant dph/dpl moves
1845         mov     %1,dpl
1846         mov     %2,dph
1847 } if notVolatile %1 %2
1848
1849 replace {
1850         mov     %1,dpl
1851         mov     (%1 + 1),dph
1852         mov     dpl,%1
1853         mov     dph,(%1 + 1)
1854 } by {
1855         ;       Peephole 224    removed redundant dph/dpl moves
1856         mov     %1,dpl
1857         mov     (%1 + 1),dph
1858 } if notVolatile %1
1859
1860 replace {
1861         mov     a,%1
1862         movx    @dptr,a
1863         mov     dpl,%2
1864         mov     dph,%3
1865         mov     b,%4
1866         mov     a,%1
1867 } by {
1868         ;       Peephole 225    removed redundant move to acc
1869         mov     a,%1
1870         movx    @dptr,a
1871         mov     dpl,%2
1872         mov     dph,%3
1873         mov     b,%4
1874 } if notVolatile %1
1875
1876 replace {
1877         clr     a
1878         movx    @dptr,a
1879         inc     dptr
1880         movx    @dptr,a
1881         inc     dptr
1882         clr     a
1883 } by {
1884         ;       Peephole 226    removed unnecessary clr
1885         clr     a
1886         movx    @dptr,a
1887         inc     dptr
1888         movx    @dptr,a
1889         inc     dptr
1890 }
1891
1892 replace {
1893         mov     dptr,#%1
1894         clr     a
1895         inc     dptr
1896         inc     dptr
1897         inc     dptr
1898         movx    @dptr,a
1899         lcall   __decdptr
1900         movx    @dptr,a
1901         lcall   __decdptr
1902         movx    @dptr,a
1903         lcall   __decdptr
1904         movx    @dptr,a
1905 } by {
1906         ;       Peephole 227    replaced inefficient 32 bit clear
1907         mov     dptr,#%1
1908         clr     a
1909         movx    @dptr,a
1910         inc     dptr
1911         movx    @dptr,a
1912         inc     dptr
1913         movx    @dptr,a
1914         inc     dptr
1915         movx    @dptr,a
1916         mov     dptr,#%1
1917 }
1918
1919 replace {
1920         mov     dptr,#%1
1921         clr     a
1922         inc     dptr
1923         inc     dptr
1924         inc     dptr
1925         movx    @dptr,a
1926         lcall   __decdptr
1927         movx    @dptr,a
1928         lcall   __decdptr
1929         movx    @dptr,a
1930         lcall   __decdptr
1931         mov     a,#%2
1932         movx    @dptr,a
1933 } by {
1934         ;       Peephole 228    replaced inefficient 32 constant
1935         mov     dptr,#%1
1936         mov     a,#%2
1937         movx    @dptr,a
1938         inc     dptr
1939         clr     a
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         movx    @dptr,a
1953         lcall   __decdptr
1954         movx    @dptr,a
1955 } by {
1956         ;       Peephole 229    replaced inefficient 16 bit clear
1957         mov     dptr,#%1
1958         clr     a
1959         movx    @dptr,a
1960         inc     dptr
1961         movx    @dptr,a
1962         mov     dptr,#%1
1963 }
1964
1965 replace {
1966         mov     dptr,#%1
1967         clr     a
1968         inc     dptr
1969         movx    @dptr,a
1970         lcall   __decdptr
1971         mov     a,#%2
1972         movx    @dptr,a
1973 } by {
1974         ;       Peephole 230    replaced inefficient 16 bit constant
1975         mov     dptr,#%1
1976         mov     a,#%2
1977         movx    @dptr,a
1978         inc     dptr
1979         clr     a
1980         movx    @dptr,a
1981         mov     dptr,#%1
1982 }
1983
1984 // this last peephole often removes the last mov from 227-230
1985 replace {
1986         mov     dptr,#%1
1987         mov     dptr,#%2
1988 } by {
1989         ;       Peephole 231    removed redundant mov to dptr
1990         mov     dptr,#%2
1991 }
1992
1993 replace {
1994         movx    a,@dptr
1995 } by {
1996         ;       Peephole 232    using movc to read xdata (--xram-movc)
1997         clr     a
1998         movc    a,@a+dptr
1999 } if xramMovcOption
2000
2001 replace {
2002         lcall   _gptrget
2003 } by {
2004         ;       Peephole 233    using _gptrgetc instead of _gptrget (--xram-movc)
2005         lcall   _gptrgetc
2006 } if xramMovcOption
2007
2008 replace {
2009         mov     r%1,a
2010         mov     dpl,r%1
2011 %2:
2012         ret
2013 } by {
2014         ;       Peephole 234    loading dpl directly from a(ccumulator), r%1 not set
2015         mov     dpl,a
2016 %2:
2017         ret
2018 }
2019
2020 replace {
2021         mov     r%1,a
2022         mov     dpl,r%2
2023         mov     dph,r%1
2024 %3:
2025         ret
2026 } by {
2027         ;       Peephole 235    loading dph directly from a(ccumulator), r%1 not set
2028         mov     dpl,r%2
2029         mov     dph,a
2030 %3:
2031         ret
2032 }
2033
2034 // 14 rules by Fiorenzo D. Ramaglia <fd.ramaglia@tin.it>
2035
2036 replace {
2037         add     a,ar%1
2038 } by {
2039         ;       Peephole 236.a  used r%1 instead of ar%1
2040         add     a,r%1
2041 }
2042
2043 replace {
2044         addc    a,ar%1
2045 } by {
2046         ;       Peephole 236.b  used r%1 instead of ar%1
2047         addc    a,r%1
2048 }
2049
2050 replace {
2051         anl     a,ar%1
2052 } by {
2053         ;       Peephole 236.c  used r%1 instead of ar%1
2054         anl     a,r%1
2055 }
2056
2057 replace {
2058         dec     ar%1
2059 } by {
2060         ;       Peephole 236.d  used r%1 instead of ar%1
2061         dec     r%1
2062 }
2063
2064 replace {
2065         djnz    ar%1,%2
2066 } by {
2067         ;       Peephole 236.e  used r%1 instead of ar%1
2068         djnz    r%1,%2
2069 }
2070
2071 replace {
2072         inc     ar%1
2073 } by {
2074         ;       Peephole 236.f  used r%1 instead of ar%1
2075         inc     r%1
2076 }
2077
2078 replace {
2079         mov     a,ar%1
2080 } by {
2081         ;       Peephole 236.g  used r%1 instead of ar%1
2082         mov     a,r%1
2083 }
2084
2085 replace {
2086         mov     ar%1,#%2
2087 } by {
2088         ;       Peephole 236.h  used r%1 instead of ar%1
2089         mov     r%1,#%2
2090 }
2091
2092 replace {
2093         mov     ar%1,a
2094 } by {
2095         ;       Peephole 236.i  used r%1 instead of ar%1
2096         mov     r%1,a
2097 }
2098
2099 replace {
2100         mov     ar%1,ar%2
2101 } by {
2102         ;       Peephole 236.j  used r%1 instead of ar%1
2103         mov     r%1,ar%2
2104 }
2105
2106 replace {
2107         orl     a,ar%1
2108 } by {
2109         ;       Peephole 236.k  used r%1 instead of ar%1
2110         orl     a,r%1
2111 }
2112
2113 replace {
2114         subb    a,ar%1
2115 } by {
2116         ;       Peephole 236.l  used r%1 instead of ar%1
2117         subb    a,r%1
2118 }
2119
2120 replace {
2121         xch     a,ar%1
2122 } by {
2123         ;       Peephole 236.m  used r%1 instead of ar%1
2124         xch     a,r%1
2125 }
2126
2127 replace {
2128         xrl     a,ar%1
2129 } by {
2130         ;       Peephole 236.n  used r%1 instead of ar%1
2131         xrl     a,r%1
2132 }
2133
2134 replace {
2135         sjmp    %1
2136 %2:
2137         mov     %3,%4
2138 %1:
2139         ret
2140 } by {
2141         ;       Peephole 237.a  removed sjmp to ret
2142         ret
2143 %2:
2144         mov     %3,%4
2145 %1:
2146         ret
2147 }
2148
2149 replace {
2150         sjmp    %1
2151 %2:
2152         mov     %3,%4
2153         mov     dpl,%5
2154         mov     dph,%6
2155 %1:
2156         ret
2157 } by {
2158         ;       Peephole 237.b  removed sjmp to ret
2159         ret
2160 %2:
2161         mov     %3,%4
2162         mov     dpl,%5
2163         mov     dph,%6
2164 %1:
2165         ret
2166 }
2167
2168 // applies to f.e. device/lib/log10f.c
2169 replace {
2170         mov     %1,%9
2171         mov     %2,%10
2172         mov     %3,%11
2173         mov     %4,%12
2174         
2175         mov     %5,%13
2176         mov     %6,%14
2177         mov     %7,%15
2178         mov     %8,%16
2179
2180         mov     %9,%1
2181         mov     %10,%2
2182         mov     %11,%3
2183         mov     %12,%4
2184 } by {
2185         mov     %1,%9
2186         mov     %2,%10
2187         mov     %3,%11
2188         mov     %4,%12
2189         
2190         mov     %5,%13
2191         mov     %6,%14
2192         mov     %7,%15
2193         mov     %8,%16
2194         ;       Peephole 238.a  removed 4 redundant moves
2195 } if operandsNotSame8 %1 %2 %3 %4 %5 %6 %7 %8
2196
2197 // applies to device/lib/log10f.c
2198 replace {
2199         mov     %1,%5
2200         mov     %2,%6
2201         mov     %3,%7
2202         mov     %4,%8
2203         
2204         mov     %5,%1
2205         mov     %6,%2
2206         mov     %7,%3
2207 } by {
2208         mov     %1,%5
2209         mov     %2,%6
2210         mov     %3,%7
2211         mov     %4,%8
2212         ;       Peephole 238.b  removed 3 redundant moves
2213 } if operandsNotSame7 %1 %2 %3 %4 %5 %6 %7
2214
2215 // applies to f.e. device/lib/time.c
2216 replace {
2217         mov     %1,%5
2218         mov     %2,%6
2219         
2220         mov     %3,%7
2221         mov     %4,%8
2222
2223         mov     %5,%1
2224         mov     %6,%2
2225 } by {
2226         mov     %1,%5
2227         mov     %2,%6
2228         
2229         mov     %3,%7
2230         mov     %4,%8
2231         ;       Peephole 238.c  removed 2 redundant moves
2232 } if operandsNotSame4 %1 %2 %3 %4
2233
2234 // applies to f.e. support/regression/tests/bug-524209.c
2235 replace {
2236         mov     %1,%4
2237         mov     %2,%5
2238         mov     %3,%6
2239
2240         mov     %4,%1
2241         mov     %5,%2
2242         mov     %6,%3
2243 } by {
2244         mov     %1,%4
2245         mov     %2,%5
2246         mov     %3,%6
2247         ;       Peephole 238.d  removed 3 redundant moves
2248 } if operandsNotSame6 %1 %2 %3 %4 %5 %6 
2249
2250 // applies to f.e. ser_ir.asm
2251 replace {
2252         mov     r%1,acc
2253 } by {
2254         ;       Peephole 239    used a instead of acc
2255         mov     r%1,a
2256 }
2257
2258 replace restart {
2259         mov     a,%1
2260         addc    a,#0x00
2261 } by {
2262         ;       Peephole 240    use clr instead of addc a,#0
2263         clr     a
2264         addc    a,%1
2265 }
2266
2267 // peepholes 241.a to 241.c and 241.d to 241.f need to be in order
2268 replace {
2269         cjne    r%1,#%2,%3
2270         cjne    r%4,#%5,%3
2271         cjne    r%6,#%7,%3
2272         cjne    r%8,#%9,%3
2273         mov     a,#0x01
2274         sjmp    %10      
2275 %3:     
2276         clr     a
2277 %10:     
2278 } by {
2279         ;       Peephole 241.a  optimized compare
2280         clr     a
2281         cjne    r%1,#%2,%3
2282         cjne    r%4,#%5,%3
2283         cjne    r%6,#%7,%3
2284         cjne    r%8,#%9,%3
2285         inc     a
2286 %3:
2287 %10:
2288
2289
2290 // applies to f.e. time.c
2291 replace {
2292         cjne    r%1,#%2,%3
2293         cjne    r%4,#%5,%3
2294         mov     a,#0x01
2295         sjmp    %6      
2296 %3:     
2297         clr     a
2298 %6:     
2299 } by {
2300         ;       Peephole 241.b  optimized compare
2301         clr     a
2302         cjne    r%1,#%2,%3
2303         cjne    r%4,#%5,%3
2304         inc     a
2305 %3:
2306 %6:
2307
2308
2309 // applies to f.e. malloc.c
2310 replace {
2311         cjne    r%1,#%2,%3
2312         mov     a,#0x01
2313         sjmp    %4
2314 %3:     
2315         clr     a
2316 %4:     
2317 } by {
2318         ;       Peephole 241.c  optimized compare
2319         clr     a
2320         cjne    r%1,#%2,%3
2321         inc     a
2322 %3:
2323 %4:
2324
2325
2326 // applies to f.e. j = (k!=0x1000); 
2327 // with volatile idata long k;
2328 replace {
2329         cjne    @r%1,#%2,%3
2330         inc     r%1     
2331         cjne    @r%1,#%4,%3
2332         inc     r%1     
2333         cjne    @r%1,#%5,%3
2334         inc     r%1     
2335         cjne    @r%1,#%6,%3
2336         mov     a,#0x01
2337         sjmp    %7      
2338 %3:     
2339         clr     a
2340 %7:     
2341 } by {
2342         ;       Peephole 241.d  optimized compare
2343         clr     a
2344         cjne    @r%1,#%2,%3
2345         inc     r%1
2346         cjne    @r%1,#%4,%3
2347         inc     r%1
2348         cjne    @r%1,#%5,%3
2349         inc     r%1
2350         cjne    @r%1,#%6,%3
2351         inc     a
2352 %3:
2353 %7:
2354
2355
2356 // applies to f.e. j = (k!=0x1000); 
2357 // with volatile idata int k;
2358 replace {
2359         cjne    @r%1,#%2,%3
2360         inc     r%1     
2361         cjne    @r%1,#%4,%3
2362         mov     a,#0x01
2363         sjmp    %7      
2364 %3:     
2365         clr     a
2366 %7:     
2367 } by {
2368         ;       Peephole 241.e  optimized compare
2369         clr     a
2370         cjne    @r%1,#%2,%3
2371         inc     r%1
2372         cjne    @r%1,#%4,%3
2373         inc     a
2374 %3:
2375 %7:
2376
2377
2378 // applies to f.e. vprintf.asm (--stack-auto)
2379 replace {
2380         cjne    @r%1,#%2,%3
2381         mov     a,#0x01
2382         sjmp    %7
2383 %3:     
2384         clr     a
2385 %7:     
2386 } by {
2387         ;       Peephole 241.f  optimized compare
2388         clr     a
2389         cjne    @r%1,#%2,%3
2390         inc     a
2391 %3:
2392 %7:
2393
2394
2395 // applies to f.e. scott-bool1.c
2396 replace {
2397         jnz     %1
2398         mov     %2,%3
2399 %1:
2400         jz      %4
2401 } by {
2402         ;       Peephole 242.a  avoided branch jnz to jz
2403         jnz     %1
2404         mov     %2,%3
2405         jz      %4
2406 %1:
2407 } if labelRefCount %1 1
2408
2409 // applies to f.e. scott-bool1.c
2410 replace {
2411         jnz     %1
2412         mov     %2,%3
2413         orl     a,%5
2414 %1:
2415         jz      %4
2416 } by {
2417         ;       Peephole 242.b  avoided branch jnz to jz
2418         jnz     %1
2419         mov     %2,%3
2420         orl     a,%5
2421         jz      %4
2422 %1:
2423 } if labelRefCount %1 1
2424
2425 // applies to f.e. logic.c
2426 replace {
2427         jnz     %1
2428         mov     %2,%3
2429         orl     a,%5
2430         orl     a,%6
2431         orl     a,%7
2432 %1:
2433         jz      %4
2434 } by {
2435         ;       Peephole 242.c  avoided branch jnz to jz
2436         jnz     %1
2437         mov     %2,%3
2438         orl     a,%5
2439         orl     a,%6
2440         orl     a,%7
2441         jz      %4
2442 %1:
2443 } if labelRefCount %1 1
2444
2445 // applies to f.e. vprintf.c
2446 // this is a rare case, usually the "tail increment" is noticed earlier
2447 replace {
2448         cjne    %1,%2,%3
2449         inc     %4
2450 %3:
2451         sjmp    %5      
2452 } by {
2453         ;       Peephole 243    avoided branch to sjmp
2454         cjne    %1,%2,%5
2455         inc     %4
2456 %3:
2457         sjmp    %5      
2458 } if labelInRange
2459
2460 // applies to f.e. simplefloat.c (saving 1 cycle)
2461 replace {
2462         mov     r%1,dpl
2463         mov     a,r%1
2464 } by {
2465         ;       Peephole 244.a  moving first to a instead of r%1
2466         mov     a,dpl
2467         mov     r%1,a
2468 }
2469
2470 // applies to f.e. _itoa.c (saving 1 cycle)
2471 replace {
2472         mov     r%1,dph
2473         mov     a,r%1
2474 } by {
2475         ;       Peephole 244.b  moving first to a instead of r%1
2476         mov     a,dph
2477         mov     r%1,a
2478 }
2479
2480
2481 // applies to f.e. bug-460010.c (saving 1 cycle)
2482 replace {
2483         mov     r%1,a
2484         mov     dpl,r%1
2485 } by {
2486         ;       Peephole 244.c  loading dpl from a instead of r%1
2487         mov     r%1,a
2488         mov     dpl,a
2489 }
2490
2491 replace {
2492         mov     r%1,a
2493         mov     dph,r%1
2494 } by {
2495         ;       Peephole 244.d  loading dph from a instead of r%1
2496         mov     r%1,a
2497         mov     dph,a
2498 }
2499
2500 // this one is safe but disables 245.a 245.b
2501 // please remove 245 if 245.a 245.b are found to be safe
2502 // applies to f.e. scott-compare.c
2503 replace {
2504         clr     a
2505         rlc     a
2506         mov     r%1,a
2507         cjne    a,#0x01,%2
2508 %2:     
2509         clr     a
2510         rlc     a
2511         mov     r%1,a
2512 } by {
2513         ;       Peephole 245    optimized complement (r%1 and acc set needed?)
2514         cpl     c
2515         clr     a
2516         rlc     a
2517         mov     r%1,a   
2518 } if labelRefCount %2 1
2519
2520 // this one will not be triggered if 245 is present
2521 // please remove 245 if 245.a 245.b are found to be safe
2522 // applies to f.e. vprintf.c
2523 replace {
2524         clr     a
2525         rlc     a
2526         mov     r%1,a
2527         cjne    a,#0x01,%2
2528 %2:     
2529         clr     a
2530         rlc     a
2531         mov     r%1,a
2532         jz      %3
2533 } by {
2534         ;       Peephole 245.a  optimized conditional jump (r%1 and acc not set!)
2535         jc      %3
2536 } if labelRefCount %2 1
2537
2538 // this one will not be triggered if 245 is present
2539 // please remove 245 if 245.a 245.b are found to be safe
2540 // applies to f.e. scott-compare.c
2541 replace {
2542         clr     a
2543         rlc     a
2544         mov     r%1,a
2545         cjne    a,#0x01,%2
2546 %2:     
2547         clr     a
2548         rlc     a
2549         mov     r%1,a
2550         jnz     %3
2551 } by {
2552         ;       Peephole 245.b  optimized conditional jump (r%1 and acc not set!)
2553         jnc     %3
2554 } if labelRefCount %2 1
2555
2556
2557 // rules 246.x apply to f.e. bitfields.c
2558 replace {
2559         mov     dptr,#%1
2560         movx    a,@dptr
2561         anl     a,#%2
2562         movx    @dptr,a
2563         mov     dptr,#%1
2564         movx    a,@dptr
2565         anl     a,#%3
2566         movx    @dptr,a
2567 } by {
2568         ;       Peephole 246.a  combined clr/clr 
2569         mov     dptr,#%1
2570         movx    a,@dptr
2571         anl     a,#%2&%3
2572         movx    @dptr,a
2573 } if notVolatile %1
2574
2575 replace {
2576         mov     dptr,#%1
2577         movx    a,@dptr
2578         orl     a,#%2
2579         movx    @dptr,a
2580         mov     dptr,#%1
2581         movx    a,@dptr
2582         orl     a,#%3
2583         movx    @dptr,a
2584 } by {
2585         ;       Peephole 246.b  combined set/set 
2586         mov     dptr,#%1
2587         movx    a,@dptr
2588         orl     a,#%2|%3
2589         movx    @dptr,a
2590 } if notVolatile %1
2591
2592 replace {
2593         mov     dptr,#%1
2594         movx    a,@dptr
2595         orl     a,#%2
2596         movx    @dptr,a
2597         mov     dptr,#%1
2598         movx    a,@dptr
2599         anl     a,#%3
2600         movx    @dptr,a
2601 } by {
2602         ;       Peephole 246.c  combined set/clr 
2603         mov     dptr,#%1
2604         movx    a,@dptr
2605         orl     a,#%2
2606         anl     a,#%3
2607         movx    @dptr,a
2608 } if notVolatile %1
2609
2610 replace {
2611         mov     dptr,#%1
2612         movx    a,@dptr
2613         anl     a,#%2
2614         movx    @dptr,a
2615         mov     dptr,#%1
2616         movx    a,@dptr
2617         orl     a,#%3
2618         movx    @dptr,a
2619 } by {
2620         ;       Peephole 246.d  combined clr/set 
2621         mov     dptr,#%1
2622         movx    a,@dptr
2623         anl     a,#%2
2624         orl     a,#%3
2625         movx    @dptr,a
2626 } if notVolatile %1
2627
2628 replace {
2629         mov     dptr,#%1
2630         movx    a,@dptr
2631         orl     a,#%2
2632         anl     a,#%3
2633         movx    @dptr,a
2634         mov     dptr,#%1
2635         movx    a,@dptr
2636         anl     a,#%4
2637         movx    @dptr,a
2638 } by {
2639         ;       Peephole 246.e  combined set/clr/clr 
2640         mov     dptr,#%1
2641         movx    a,@dptr
2642         orl     a,#%2
2643         anl     a,#%3&%4
2644         movx    @dptr,a
2645 } if notVolatile %1
2646
2647 replace {
2648         mov     dptr,#%1
2649         movx    a,@dptr
2650         orl     a,#%2
2651         anl     a,#%3
2652         movx    @dptr,a
2653         mov     dptr,#%1
2654         movx    a,@dptr
2655         orl     a,#%4
2656         movx    @dptr,a
2657 } by {
2658         ;       Peephole 246.f  combined set/clr/set 
2659         mov     dptr,#%1
2660         movx    a,@dptr
2661         orl     a,#%2
2662         anl     a,#%3
2663         orl     a,#%4
2664         movx    @dptr,a
2665 } if notVolatile %1
2666
2667 replace {
2668         mov     dptr,#%1
2669         movx    a,@dptr
2670         anl     a,#%2
2671         orl     a,#%3
2672         movx    @dptr,a
2673         mov     dptr,#%1
2674         movx    a,@dptr
2675         anl     a,#%4
2676         movx    @dptr,a
2677 } by {
2678         ;       Peephole 246.g  combined clr/set/clr 
2679         mov     dptr,#%1
2680         movx    a,@dptr
2681         anl     a,#%2
2682         orl     a,#%3
2683         anl     a,#%4
2684         movx    @dptr,a
2685 } if notVolatile %1
2686
2687 replace {
2688         mov     dptr,#%1
2689         movx    a,@dptr
2690         anl     a,#%2
2691         orl     a,#%3
2692         movx    @dptr,a
2693         mov     dptr,#%1
2694         movx    a,@dptr
2695         orl     a,#%4
2696         movx    @dptr,a
2697 } by {
2698         ;       Peephole 246.h  combined clr/set/set 
2699         mov     dptr,#%1
2700         movx    a,@dptr
2701         anl     a,#%2
2702         orl     a,#%3|%4
2703         movx    @dptr,a
2704 } if notVolatile %1
2705
2706
2707
2708
2709 // rules 247.x apply to f.e. bitfields.c
2710 replace {
2711         mov     r%5,#%1
2712         mov     a,@r%5
2713         anl     a,#%2
2714         mov     @r%5,a
2715         mov     r%5,#%1
2716         mov     a,@r%5
2717         anl     a,#%3
2718         mov     @r%5,a
2719 } by {
2720         ;       Peephole 247.a  combined clr/clr 
2721         mov     r%5,#%1
2722         mov     a,@r%5
2723         anl     a,#%2&%3
2724         mov     @r%5,a
2725 } if notVolatile %1
2726
2727 replace {
2728         mov     r%5,#%1
2729         mov     a,@r%5
2730         orl     a,#%2
2731         mov     @r%5,a
2732         mov     r%5,#%1
2733         mov     a,@r%5
2734         orl     a,#%3
2735         mov     @r%5,a
2736 } by {
2737         ;       Peephole 247.b  combined set/set 
2738         mov     r%5,#%1
2739         mov     a,@r%5
2740         orl     a,#%2|%3
2741         mov     @r%5,a
2742 } if notVolatile %1
2743
2744 replace {
2745         mov     r%5,#%1
2746         mov     a,@r%5
2747         orl     a,#%2
2748         mov     @r%5,a
2749         mov     r%5,#%1
2750         mov     a,@r%5
2751         anl     a,#%3
2752         mov     @r%5,a
2753 } by {
2754         ;       Peephole 247.c  combined set/clr 
2755         mov     r%5,#%1
2756         mov     a,@r%5
2757         orl     a,#%2
2758         anl     a,#%3
2759         mov     @r%5,a
2760 } if notVolatile %1
2761
2762 replace {
2763         mov     r%5,#%1
2764         mov     a,@r%5
2765         anl     a,#%2
2766         mov     @r%5,a
2767         mov     r%5,#%1
2768         mov     a,@r%5
2769         orl     a,#%3
2770         mov     @r%5,a
2771 } by {
2772         ;       Peephole 247.d  combined clr/set 
2773         mov     r%5,#%1
2774         mov     a,@r%5
2775         anl     a,#%2
2776         orl     a,#%3
2777         mov     @r%5,a
2778 } if notVolatile %1
2779
2780 replace {
2781         mov     r%5,#%1
2782         mov     a,@r%5
2783         orl     a,#%2
2784         anl     a,#%3
2785         mov     @r%5,a
2786         mov     r%5,#%1
2787         mov     a,@r%5
2788         anl     a,#%4
2789         mov     @r%5,a
2790 } by {
2791         ;       Peephole 247.e  combined set/clr/clr 
2792         mov     r%5,#%1
2793         mov     a,@r%5
2794         orl     a,#%2
2795         anl     a,#%3&%4
2796         mov     @r%5,a
2797 } if notVolatile %1
2798
2799 replace {
2800         mov     r%5,#%1
2801         mov     a,@r%5
2802         orl     a,#%2
2803         anl     a,#%3
2804         mov     @r%5,a
2805         mov     r%5,#%1
2806         mov     a,@r%5
2807         orl     a,#%4
2808         mov     @r%5,a
2809 } by {
2810         ;       Peephole 247.f  combined set/clr/set 
2811         mov     r%5,#%1
2812         mov     a,@r%5
2813         orl     a,#%2
2814         anl     a,#%3
2815         orl     a,#%4
2816         mov     @r%5,a
2817 } if notVolatile %1
2818
2819 replace {
2820         mov     r%5,#%1
2821         mov     a,@r%5
2822         anl     a,#%2
2823         orl     a,#%3
2824         mov     @r%5,a
2825         mov     r%5,#%1
2826         mov     a,@r%5
2827         anl     a,#%4
2828         mov     @r%5,a
2829 } by {
2830         ;       Peephole 247.g  combined clr/set/clr 
2831         mov     r%5,#%1
2832         mov     a,@r%5
2833         anl     a,#%2
2834         orl     a,#%3
2835         anl     a,#%4
2836         mov     @r%5,a
2837 } if notVolatile %1
2838
2839 replace {
2840         mov     r%5,#%1
2841         mov     a,@r%5
2842         anl     a,#%2
2843         orl     a,#%3
2844         mov     @r%5,a
2845         mov     r%5,#%1
2846         mov     a,@r%4
2847         orl     a,#%4
2848         mov     @r%5,a
2849 } by {
2850         ;       Peephole 247.h  combined clr/set/set 
2851         mov     r%5,#%1
2852         mov     a,@r%5
2853         anl     a,#%2
2854         orl     a,#%3|%4
2855         mov     @r%5,a
2856 } if notVolatile %1
2857
2858
2859 // Peepholes 248.x have to be compatible with the keyword volatile.
2860 // They optimize typical accesses to memory mapped I/O devices:
2861 // volatile xdata char t; t|=0x01; 
2862 replace {
2863         mov     dptr,%1
2864         movx    a,@dptr
2865         mov     r%2,a
2866         mov     dptr,%1
2867         mov     a,%3
2868         orl     a,r%2
2869         movx    @dptr,a
2870 } by {
2871         ;       Peephole 248.a  optimized or to xdata
2872         mov     dptr,%1
2873         movx    a,@dptr
2874         mov     r%2,a
2875         orl     a,%3
2876         movx    @dptr,a
2877 }
2878
2879 // volatile xdata char t; t&=0x01; 
2880 replace {
2881         mov     dptr,%1
2882         movx    a,@dptr
2883         mov     r%2,a
2884         mov     dptr,%1
2885         mov     a,%3
2886         anl     a,r%2
2887         movx    @dptr,a
2888 } by {
2889         ;       Peephole 248.b  optimized and to xdata
2890         mov     dptr,%1
2891         movx    a,@dptr
2892         mov     r%2,a
2893         anl     a,%3
2894         movx    @dptr,a
2895 }
2896
2897 // volatile xdata char t; t^=0x01; 
2898 replace {
2899         mov     dptr,%1
2900         movx    a,@dptr
2901         mov     r%2,a
2902         mov     dptr,%1
2903         mov     a,%3
2904         xrl     a,r%2
2905         movx    @dptr,a
2906 } by {
2907         ;       Peephole 248.c  optimized xor to xdata
2908         mov     dptr,%1
2909         movx    a,@dptr
2910         mov     r%2,a
2911         xrl     a,%3
2912         movx    @dptr,a
2913 }
2914
2915 // volatile xdata char t; t|=0x01; t&=~0x01; t|=0x01;
2916 replace {
2917         mov     dptr,%1
2918         movx    a,@dptr
2919         mov     r%2,a
2920         orl     a,%3
2921         movx    @dptr,a
2922
2923         mov     dptr,%1
2924         movx    a,@dptr
2925         mov     r%2,a
2926         anl     a,%4
2927         movx    @dptr,a
2928
2929         mov     dptr,%1
2930         movx    a,@dptr
2931         mov     r%2,a
2932         orl     a,%5
2933         movx    @dptr,a
2934 } by {
2935         ;       Peephole 248.d  optimized or/and/or to volatile xdata
2936         mov     dptr,%1
2937         movx    a,@dptr
2938         orl     a,%3
2939         movx    @dptr,a
2940         movx    a,@dptr
2941         anl     a,%4
2942         movx    @dptr,a
2943         movx    a,@dptr
2944         mov     r%2,a
2945         orl     a,%5
2946         movx    @dptr,a
2947 }
2948
2949 // volatile xdata char t; t&=~0x01; t|=0x01; t&=~0x01;
2950 replace {
2951         mov     dptr,%1
2952         movx    a,@dptr
2953         mov     r%2,a
2954         anl     a,%3
2955         movx    @dptr,a
2956
2957         mov     dptr,%1
2958         movx    a,@dptr
2959         mov     r%2,a
2960         orl     a,%4
2961         movx    @dptr,a
2962
2963         mov     dptr,%1
2964         movx    a,@dptr
2965         mov     r%2,a
2966         anl     a,%5
2967         movx    @dptr,a
2968 } by {
2969         ;       Peephole 248.e  optimized and/or/and to volatile xdata
2970         mov     dptr,%1
2971         movx    a,@dptr
2972         anl     a,%3
2973         movx    @dptr,a
2974         movx    a,@dptr
2975         orl     a,%4
2976         movx    @dptr,a
2977         movx    a,@dptr
2978         mov     r%2,a
2979         anl     a,%5
2980         movx    @dptr,a
2981 }
2982
2983 // volatile xdata char t; t|=0x01; t&=~0x01;
2984 replace {
2985         mov     dptr,%1
2986         movx    a,@dptr
2987         mov     r%2,a
2988         orl     a,%3
2989         movx    @dptr,a
2990
2991         mov     dptr,%1
2992         movx    a,@dptr
2993         mov     r%2,a
2994         anl     a,%4
2995         movx    @dptr,a
2996 } by {
2997         ;       Peephole 248.f  optimized or/and to volatile xdata
2998         mov     dptr,%1
2999         movx    a,@dptr
3000         orl     a,%3
3001         movx    @dptr,a
3002         movx    a,@dptr
3003         mov     r%2,a
3004         anl     a,%4
3005         movx    @dptr,a
3006 }
3007
3008 // volatile xdata char t; t&=~0x01; t|=0x01;
3009 replace {
3010         mov     dptr,%1
3011         movx    a,@dptr
3012         mov     r%2,a
3013         anl     a,%3
3014         movx    @dptr,a
3015
3016         mov     dptr,%1
3017         movx    a,@dptr
3018         mov     r%2,a
3019         orl     a,%4
3020         movx    @dptr,a
3021 } by {
3022         ;       Peephole 248.g  optimized and/or to volatile xdata
3023         mov     dptr,%1
3024         movx    a,@dptr
3025         anl     a,%3
3026         movx    @dptr,a
3027         movx    a,@dptr
3028         mov     r%2,a
3029         orl     a,%4
3030         movx    @dptr,a
3031 }
3032
3033 // volatile xdata char t; t^=0x01; t^=0x01;
3034 replace {
3035         mov     dptr,%1
3036         movx    a,@dptr
3037         mov     r%2,a
3038         xrl     a,%3
3039         movx    @dptr,a
3040
3041         mov     dptr,%1
3042         movx    a,@dptr
3043         mov     r%2,a
3044         xrl     a,%4
3045         movx    @dptr,a
3046 } by {
3047         ;       Peephole 248.h  optimized xor/xor to volatile xdata
3048         mov     dptr,%1
3049         movx    a,@dptr
3050         xrl     a,%3
3051         movx    @dptr,a
3052         movx    a,@dptr
3053         mov     r%2,a
3054         xrl     a,%4
3055         movx    @dptr,a
3056 }
3057