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