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