64742b9d5f7d49b6616d712ef33070f99737d5df
[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         clr     a
62         mov     %1,a
63         mov     %2,a
64         clr     a
65 } by {
66         clr     a
67         mov     %1,a
68         mov     %2,a
69         ;       Peephole 3.d    removed redundant clr
70 }
71
72 replace {
73         clr     a
74         mov     %1,a
75         mov     %2,a
76         mov     %3,a
77         clr     a
78 } by {
79         clr     a
80         mov     %1,a
81         mov     %2,a
82         mov     %3,a
83         ;       Peephole 3.e    removed redundant clr
84 }
85
86 replace {
87         clr     a
88         mov     %1,a
89         mov     %2,a
90         mov     %3,a
91         mov     %4,a
92         clr     a
93 } by {
94         clr     a
95         mov     %1,a
96         mov     %2,a
97         mov     %3,a
98         mov     %4,a
99         ;       Peephole 3.f    removed redundant clr
100 }
101
102 replace {
103         clr     a
104         mov     %1,a
105         mov     %2,a
106         mov     %3,a
107         mov     %4,a
108         mov     %5,a
109         clr     a
110 } by {
111         clr     a
112         mov     %1,a
113         mov     %2,a
114         mov     %3,a
115         mov     %4,a
116         mov     %5,a
117         ;       Peephole 3.g    removed redundant clr
118 }
119
120 replace {
121         clr     a
122         mov     %1,a
123         mov     %2,a
124         mov     %3,#0x00
125 } by {
126         clr     a
127         mov     %1,a
128         mov     %2,a
129         ;       Peephole 3.h    changed mov %3,#0x00 to %3,a
130         mov     %3,a
131 }
132
133 replace {
134         clr     a
135         mov     %1,a
136         mov     %2,a
137         mov     %3,a
138         mov     %4,#0x00
139 } by {
140         clr     a
141         mov     %1,a
142         mov     %2,a
143         mov     %3,a
144         ;       Peephole 3.i    changed mov %4,#0x00 to %4,a
145         mov     %4,a
146 }
147
148 replace {
149         clr     a
150         mov     %1,a
151         mov     %2,a
152         mov     %3,a
153         mov     %4,a
154         mov     %5,#0x00
155 } by {
156         clr     a
157         mov     %1,a
158         mov     %2,a
159         mov     %3,a
160         mov     %4,a
161         ;       Peephole 3.j    changed mov %5,#0x00 to %5,a
162         mov     %5,a
163 }
164
165 replace {
166         clr     a
167         mov     %1,a
168         mov     %2,a
169         mov     %3,a
170         mov     %4,a
171         mov     %5,a
172         mov     %6,#0x00
173 } by {
174         clr a
175         mov %1,a
176         mov %2,a
177         mov %3,a
178         mov %4,a
179         mov %5,a
180         ;       Peephole 3.k    changed mov %6,#0x00 to %6,a
181         mov %6,a
182 }
183
184 replace {
185         mov     %1,a
186         mov     dptr,#%2
187         mov     a,%1
188         movx    @dptr,a
189 } by {
190         ;       Peephole 100    removed redundant mov
191         mov     %1,a
192         mov     dptr,#%2
193         movx    @dptr,a
194 } if notVolatile %1
195
196 replace {
197         mov     a,%1
198         movx    @dptr,a
199         inc     dptr
200         mov     a,%1
201         movx    @dptr,a
202 } by {
203         ;       Peephole 101    removed redundant mov
204         mov     a,%1
205         movx    @dptr,a
206         inc     dptr
207         movx    @dptr,a
208 } if notVolatile %1
209
210 replace {
211         mov     %1,%2
212         ljmp    %3
213 %4:
214         mov     %1,%5
215 %3:
216         mov     dpl,%1
217 %7:
218         mov     sp,bp
219         pop     bp
220 } by {
221         ;       Peephole 102    removed redundant mov
222         mov     dpl,%2
223         ljmp    %3
224 %4:
225         mov     dpl,%5
226 %3:
227 %7:
228         mov     sp,bp
229         pop     bp
230 } if notVolatile %1
231
232 replace {
233         mov     %1,%2
234         ljmp    %3
235 %4:
236         mov     a%1,%5
237 %3:
238         mov     dpl,%1
239 %7:
240         mov     sp,bp
241         pop     bp
242 } by {
243         ;       Peephole 103    removed redundant mov
244         mov     dpl,%2
245         ljmp    %3
246 %4:
247         mov     dpl,%5
248 %3:
249 %7:
250         mov     sp,bp
251         pop     bp
252 }
253
254 replace {
255         mov     a,bp
256         clr     c
257         add     a,#0x01
258         mov     r%1,a
259 } by {
260         ;       Peephole 104    optimized increment (acc not set to r%1, flags undefined)
261         mov     r%1,bp
262         inc     r%1
263 }
264
265 replace {
266         mov     %1,a
267         mov     a,%1
268 } by {
269         ;       Peephole 105    removed redundant mov
270         mov     %1,a
271 } if notVolatile %1
272
273 replace {
274         mov     %1,a
275         clr     c
276         mov     a,%1
277 } by {
278         ;       Peephole 106    removed redundant mov
279         mov     %1,a
280         clr     c
281 } if notVolatile %1
282
283 replace {
284         ljmp    %1
285 %1:
286 } by {
287         ;       Peephole 107    removed redundant ljmp
288 %1:
289 }
290
291 replace {
292         jc      %1
293         ljmp    %5
294 %1:
295 } by {
296         ;       Peephole 108    removed ljmp by inverse jump logic
297         jnc     %5
298 %1:
299 } if labelInRange
300
301 replace {
302         jz      %1
303         ljmp    %5
304 %1:
305 } by {
306         ;       Peephole 109    removed ljmp by inverse jump logic
307         jnz     %5
308 %1:
309 } if labelInRange
310
311 replace {
312         jnz     %1
313         ljmp    %5
314 %1:
315 } by {
316         ;       Peephole 110    removed ljmp by inverse jump logic
317         jz      %5
318 %1:
319 } if labelInRange
320
321 replace {
322         jb      %1,%2
323         ljmp    %5
324 %2:
325 } by {
326         ;       Peephole 111    removed ljmp by inverse jump logic
327         jnb     %1,%5
328 %2:
329 } if labelInRange
330
331 replace {
332         jnb     %1,%2
333         ljmp    %5
334 %2:
335 } by {
336         ;       Peephole 112.a  removed ljmp by inverse jump logic
337         jb      %1,%5
338 %2:
339 } if labelInRange
340
341 replace {
342         ljmp    %5
343 %1:
344 } by {
345         ;       Peephole 112.b  changed ljmp to sjmp
346         sjmp    %5
347 %1:
348 } if labelInRange
349
350 replace {
351         clr     a
352         cjne    %1,%2,%3
353         cpl     a
354 %3:
355         rrc     a
356         mov     %4,c
357 } by {
358         ;       Peephole 113    optimized misc sequence
359         clr     %4
360         cjne    %1,%2,%3
361         setb    %4
362 %3:
363 } if labelRefCount %3 1
364
365 replace {
366         clr     a
367         cjne    %1,%2,%3
368         cjne    %10,%11,%3
369         cpl     a
370 %3:
371         rrc     a
372         mov     %4,c
373 } by {
374         ;       Peephole 114    optimized misc sequence
375         clr     %4
376         cjne    %1,%2,%3
377         cjne    %10,%11,%3
378         setb    %4
379 %3:
380 } if labelRefCount %3 2
381
382 replace {
383         clr     a
384         cjne    %1,%2,%3
385         cpl     a
386 %3:
387         jnz     %4
388 } by {
389         ;       Peephole 115.a  jump optimization
390         cjne    %1,%2,%3
391         sjmp    %4
392 %3:
393 } if labelRefCount %3 1
394
395 replace {
396         mov     %1,a
397         cjne    %1,#0x00,%2
398         sjmp    %3
399 %2:
400 } by {
401         ;       Peephole 115.b  jump optimization
402         mov     %1,a
403         jz      %3
404 %2:
405 }
406
407 replace {
408         clr     a
409         cjne    %1,%2,%3
410         cjne    %9,%10,%3
411         cpl     a
412 %3:
413         jnz     %4
414 } by {
415         ;       Peephole 116    jump optimization
416         cjne    %1,%2,%3
417         cjne    %9,%10,%3
418         sjmp    %4
419 %3:
420 } if labelRefCount %3 2
421
422 replace {
423         clr     a
424         cjne    %1,%2,%3
425         cjne    %9,%10,%3
426         cjne    %11,%12,%3
427         cpl     a
428 %3:
429         jnz %4
430 } by {
431         ;       Peephole 117    jump optimization
432         cjne    %1,%2,%3
433         cjne    %9,%10,%3
434         cjne    %11,%12,%3
435         sjmp    %4
436 %3:
437 } if labelRefCount %3 3
438
439 replace {
440         clr     a
441         cjne    %1,%2,%3
442         cjne    %9,%10,%3
443         cjne    %11,%12,%3
444         cjne    %13,%14,%3
445         cpl     a
446 %3:
447         jnz     %4
448 } by {
449         ;       Peephole 118    jump optimization
450         cjne    %1,%2,%3
451         cjne    %9,%10,%3
452         cjne    %11,%12,%3
453         cjne    %13,%14,%3
454         sjmp    %4
455 %3:
456 } if labelRefCount %3 4
457
458 replace {
459         mov     a,#0x01
460         cjne    %1,%2,%3
461         clr     a
462 %3:
463         jnz     %4
464 } by {
465         ;       Peephole 119    jump optimization
466         cjne    %1,%2,%4
467 %3:
468 } if labelRefCount %3 1
469
470 replace {
471         mov     a,#0x01
472         cjne    %1,%2,%3
473         cjne    %10,%11,%3
474         clr     a
475 %3:
476         jnz     %4
477 } by {
478         ;       Peephole 120    jump optimization
479         cjne    %1,%2,%4
480         cjne    %10,%11,%4
481 %3:
482 } if labelRefCount %3 2
483
484 replace {
485         mov     a,#0x01
486         cjne    %1,%2,%3
487         cjne    %10,%11,%3
488         cjne    %12,%13,%3
489         clr     a
490 %3:
491         jnz  %4
492 } by {
493         ;       Peephole 121    jump optimization
494         cjne    %1,%2,%4
495         cjne    %10,%11,%4
496         cjne    %12,%13,%4
497 %3:
498 } if labelRefCount %3 3
499
500 replace {
501         mov     a,#0x01
502         cjne    %1,%2,%3
503         cjne    %10,%11,%3
504         cjne    %12,%13,%3
505         cjne    %14,%15,%3
506         clr     a
507 %3:
508         jnz     %4
509 } by {
510         ;       Peephole 122    jump optimization
511         cjne    %1,%2,%4
512         cjne    %10,%11,%4
513         cjne    %12,%13,%4
514         cjne    %14,%15,%4
515 %3:
516 } if labelRefCount %3 4
517
518 replace {
519         mov     a,#0x01
520         cjne    %1,%2,%3
521         clr     a
522 %3:
523         jz      %4
524 } by {
525         ;       Peephole 123    jump optimization
526         cjne    %1,%2,%3
527         sjmp    %4
528 %3:
529 } if labelRefCount %3 1
530
531 replace {
532         mov     a,#0x01
533         cjne    %1,%2,%3
534         cjne    %10,%11,%3
535         clr     a
536 %3:
537         jz      %4
538 } by {
539         ;       Peephole 124    jump optimization
540         cjne    %1,%2,%3
541         cjne    %10,%11,%3
542         sjmp    %4
543 %3:
544 } if labelRefCount %3 2
545
546 replace {
547         mov     a,#0x01
548         cjne    %1,%2,%3
549         cjne    %10,%11,%3
550         cjne    %12,%13,%3
551         clr     a
552 %3:
553         jz      %4
554 } by {
555         ;       Peephole 125    jump optimization
556         cjne    %1,%2,%3
557         cjne    %10,%11,%3
558         cjne    %12,%13,%3
559         sjmp    %4
560 %3:
561 } if labelRefCount %3 3
562
563 replace {
564         mov     a,#0x01
565         cjne    %1,%2,%3
566         cjne    %10,%11,%3
567         cjne    %12,%13,%3
568         cjne    %14,%15,%3
569         clr     a
570 %3:
571         jz      %4
572 } by {
573         ;       Peephole 126    jump optimization
574         cjne    %1,%2,%3
575         cjne    %10,%11,%3
576         cjne    %12,%13,%3
577         cjne    %14,%15,%3
578         sjmp    %4
579 %3:
580 } if labelRefCount %3 4
581
582 replace {
583         push    psw
584         mov     psw,%1
585         push    bp
586         mov     bp,%2
587 %3:
588         mov     %2,bp
589         pop     bp
590         pop     psw
591         ret
592 } by {
593         ;       Peephole 127    removed misc sequence
594         ret
595 } if labelRefCount %3 0
596
597 replace {
598         clr     a
599         rlc     a
600         jz      %1
601 } by {
602         ;       Peephole 128    jump optimization
603         jnc     %1
604 }
605
606 replace {
607         clr     a
608         rlc     a
609         jnz     %1
610 } by {
611         ;       Peephole 129    jump optimization
612         jc      %1
613 }
614
615 replace {
616         mov     r%1,@r%2
617 } by {
618         ;       Peephole 130    changed target address mode r%1 to ar%1
619         mov     ar%1,@r%2
620 }
621
622 replace {
623         mov     a,%1
624         subb    a,#0x01
625         mov     %2,a
626         mov     %1,%2
627 } by {
628         ;       Peephole 131    optimized decrement (not caring for c)
629         dec     %1
630         mov     %2,%1
631 }
632
633 // ideally the optimizations of rules 132.x should be done in genCmpXX
634 replace {
635         clr     c
636         mov     a,#%1
637         subb    a,%2
638         mov     %3,c
639 } by {
640         ;       Peephole 132.a  optimized genCmpGt by inverse logic (acc differs)
641         mov     a,%2
642         add     a,#0xff - %1
643         mov     %3,c
644 }
645
646 replace {
647         clr     c
648         mov     a,#%1
649         subb    a,%2
650         jnc     %5
651 } by {
652         ;       Peephole 132.b  optimized genCmpGt by inverse logic (acc differs)
653         mov     a,%2
654         add     a,#0xff - %1
655         jnc     %5
656 }
657
658 replace {
659         clr     c
660         mov     a,#%1
661         subb    a,%2
662         jc      %5
663 } by {
664         ;       Peephole 132.c  optimized genCmpGt by inverse logic (acc differs)
665         mov     a,%2
666         add     a,#0xff - %1
667         jc      %5
668 }
669
670 replace {
671         clr     c
672         mov     a,%1
673         subb    a,#%2
674         mov     %3,c
675 } by {
676         ;       Peephole 132.d  optimized genCmpGt by inverse logic
677         mov     a,#0x100 - %2
678         add     a,%1
679         mov     %3,c
680 } if operandsNotRelated('0x00' %2)
681
682 replace {
683         clr     c
684         mov     a,%1
685         subb    a,#%2
686         jnc     %5
687 } by {
688         ;       Peephole 132.e  optimized genCmpLt by inverse logic (carry differs)
689         mov     a,#0x100 - %2
690         add     a,%1
691         jc      %5
692 } if operandsNotRelated('0x00' %2)
693
694 replace {
695         clr     c
696         mov     a,%1
697         subb    a,#%2
698         jc      %5
699 } by {
700         ;       Peephole 132.f  optimized genCmpLt by inverse logic (carry differs)
701         mov     a,#0x100 - %2
702         add     a,%1
703         jnc     %5
704 } if operandsNotRelated('0x00' %2)
705
706
707 replace {
708         mov     r%1,%2
709         mov     ar%3,@r%1
710         inc     r%3
711         mov     r%4,%2
712         mov     @r%4,ar%3
713 } by {
714         ;       Peephole 133    removed redundant moves
715         mov     r%1,%2
716         inc     @r%1
717         mov     ar%3,@r%1
718 } if notVolatile
719
720 replace {
721         mov     r%1,%2
722         mov     ar%3,@r%1
723         dec     r%3
724         mov     r%4,%2
725         mov     @r%4,ar%3
726 } by {
727         ;       Peephole 134    removed redundant moves
728         mov     r%1,%2
729         dec     @r%1
730         mov     ar%3,@r%1
731 } if notVolatile
732
733 replace {
734         mov     r%1,a
735         mov     a,r%2
736         orl     a,r%1
737 } by {
738         ;       Peephole 135    removed redundant mov
739         mov     r%1,a
740         orl     a,r%2
741 }
742
743 replace {
744         mov     %1,a
745         mov     dpl,%2
746         mov     dph,%3
747         mov     a,%1
748 } by {
749         ;       Peephole 136    removed redundant moves
750         mov     %1,a
751         mov     dpl,%2
752         mov     dph,%3
753 } if notVolatile %1
754
755 // WTF? Doesn't look sensible to me...
756 //replace {
757 //        mov  b,#0x00
758 //        mov  a,%1
759 //        cjne %2,%3,%4
760 //        mov  b,#0x01
761 //%4:
762 //        mov  a,b
763 //        jz   %5
764 //} by {
765 //        ;       Peephole 137   optimized misc jump sequence
766 //        mov  a,%1
767 //        cjne %2,%3,%5
768 //%4:
769 //} if labelRefCount %4 1
770 //
771 //replace {
772 //        mov  b,#0x00
773 //        mov  a,%1
774 //        cjne %2,%3,%4
775 //        mov  b,#0x01
776 //%4:
777 //        mov  a,b
778 //        jnz  %5
779 //} by {
780 //        ;       Peephole 138   optimized misc jump sequence
781 //        mov  a,%1
782 //        cjne %2,%3,%4
783 //        sjmp %5
784 //%4:
785 //} if labelRefCount %4 1
786
787 replace {
788         mov     r%1,a
789         anl     ar%1,%2
790         mov     a,r%1
791 } by {
792         ;       Peephole 139    removed redundant mov
793         anl     a,%2
794         mov     r%1,a
795 }
796
797 replace {
798         mov     r%1,a
799         orl     ar%1,%2
800         mov     a,r%1
801 } by {
802         ;       Peephole 140    removed redundant mov
803         orl     a,%2
804         mov     r%1,a }
805
806 replace {
807         mov     r%1,a
808         xrl     ar%1,%2
809         mov     a,r%1
810 } by {
811         ;       Peephole 141    removed redundant mov
812         xrl     a,%2
813         mov     r%1,a
814 }
815
816 replace {
817         mov     r%1,a
818         mov     r%2,ar%1
819         mov     ar%1,@r%2
820 } by {
821         ;       Peephole 142    removed redundant moves
822         mov     r%2,a
823         mov     ar%1,@r%2
824 }
825
826 replace {
827         rlc     a
828         mov     acc.0,c
829 } by {
830         ;       Peephole 143    converted rlc to rl
831         rl      a
832 }
833
834 replace {
835         rrc     a
836         mov     acc.7,c
837 } by {
838         ;       Peephole 144    converted rrc to rc
839         rr      a
840 }
841
842 replace {
843         clr     c
844         addc    a,%1
845 } by {
846         ;       Peephole 145    changed to add without carry
847         add     a,%1
848 }
849
850 replace {
851         clr     c
852         mov     a,%1
853         addc    a,%2
854 } by {
855         ;       Peephole 146    changed to add without carry
856         mov     a,%1
857         add     a,%2
858 }
859
860 replace {
861         orl     r%1,a
862 } by {
863         ;       Peephole 147    changed target address mode r%1 to ar%1
864         orl     ar%1,a
865 }
866
867 replace {
868         anl     r%1,a
869 } by {
870         ;       Peephole 148    changed target address mode r%1 to ar%1
871         anl     ar%1,a
872 }
873
874 replace {
875         xrl     r%1,a
876 } by {
877         ;       Peephole 149    changed target address mode r%1 to ar%1
878         xrl     ar%1,a
879 }
880
881 replace {
882         mov     r%1,dpl
883         mov     dpl,r%1
884 %9:
885         ret
886 } by {
887         ;       Peephole 150    removed misc moves via dpl before return
888 %9:
889         ret
890 }
891
892 replace {
893         mov     r%1,dpl
894         mov     r%2,dph
895         mov     dpl,r%1
896         mov     dph,r%2
897 %9:
898         ret
899 } by {
900         ;       Peephole 151    removed misc moves via dph, dpl before return
901 %9:
902         ret
903 }
904
905 replace {
906         mov     r%1,dpl
907         mov     r%2,dph
908         mov     dpl,r%1
909 %9:
910         ret
911 } by {
912         ;       Peephole 152    removed misc moves via dph, dpl before return
913 %9:
914         ret
915 }
916
917 replace {
918         mov     r%1,dpl
919         mov     r%2,dph
920         mov     r%3,b
921         mov     dpl,r%1
922         mov     dph,r%2
923         mov     b,r%3
924 %9:
925         ret
926 } by {
927         ;       Peephole 153    removed misc moves via dph, dpl, b before return
928 %9:
929         ret
930 }
931
932 replace {
933         mov     r%1,dpl
934         mov     r%2,dph
935         mov     r%3,b
936         mov     dpl,r%1
937 %9:
938         ret
939 } by {
940         ;       Peephole 154    removed misc moves via dph, dpl, b before return
941 %9:
942         ret
943 }
944
945 replace {
946         mov     r%1,dpl
947         mov     r%2,dph
948         mov     r%3,b
949         mov     dpl,r%1
950         mov     dph,r%2
951 %9:
952         ret
953 } by {
954         ;       Peephole 155    removed misc moves via dph, dpl, b before return
955 %9:
956         ret
957 }
958
959 replace {
960         mov     r%1,dpl
961         mov     r%2,dph
962         mov     r%3,b
963         mov     r%4,a
964         mov     dpl,r%1
965         mov     dph,r%2
966         mov     b,r%3
967         mov     a,r%4
968 %9:
969         ret
970 } by {
971         ;       Peephole 156    removed misc moves via dph, dpl, b, a before return
972 %9:
973         ret
974 }
975
976 replace {
977         mov     r%1,dpl
978         mov     r%2,dph
979         mov     r%3,b
980         mov     r%4,a
981         mov     dpl,r%1
982         mov     dph,r%2
983 %9:
984         ret
985 } by {
986         ;       Peephole 157    removed misc moves via dph, dpl, b, a before return
987 %9:
988         ret
989 }
990
991 replace {
992         mov     r%1,dpl
993         mov     r%2,dph
994         mov     r%3,b
995         mov     r%4,a
996         mov     dpl,r%1
997 %9:
998         ret
999 } by {
1000         ;       Peephole 158    removed misc moves via dph, dpl, b, a before return
1001 %9:
1002         ret
1003 }
1004
1005 replace {
1006         mov     %1,#%2
1007         xrl     %1,#0x80
1008 } by {
1009         ;       Peephole 159    avoided xrl during execution
1010         mov     %1,#(%2 ^ 0x80)
1011 }
1012
1013 replace {
1014         jnc     %1
1015         sjmp    %2
1016 %1:
1017 } by {
1018         ;       Peephole 160    removed sjmp by inverse jump logic
1019         jc      %2
1020 %1:
1021 }
1022
1023 replace {
1024         jc      %1
1025         sjmp    %2
1026 %1:
1027 } by {
1028         ;       Peephole 161    removed sjmp by inverse jump logic
1029         jnc     %2
1030 %1:
1031 }
1032
1033 replace {
1034         jnz     %1
1035         sjmp    %2
1036 %1:
1037 } by {
1038         ;       Peephole 162    removed sjmp by inverse jump logic
1039         jz      %2
1040 %1:
1041 }
1042
1043 replace {
1044         jz      %1
1045         sjmp    %2
1046 %1:
1047 } by {
1048         ;       Peephole 163    removed sjmp by inverse jump logic
1049         jnz     %2
1050 %1:
1051 }
1052
1053 replace {
1054         jnb     %3,%1
1055         sjmp    %2
1056 %1:
1057 } by {
1058         ;       Peephole 164    removed sjmp by inverse jump logic
1059         jb      %3,%2
1060 %1:
1061 }
1062
1063 replace {
1064         jb      %3,%1
1065         sjmp    %2
1066 %1:
1067 } by {
1068         ;       Peephole 165    removed sjmp by inverse jump logic
1069         jnb     %3,%2
1070 %1:
1071 }
1072
1073 replace {
1074         mov     %1,%2
1075         mov     %3,%1
1076         mov     %2,%1
1077 } by {
1078         ;       Peephole 166    removed redundant mov
1079         mov     %1,%2
1080         mov     %3,%1
1081 } if notVolatile %1 %2
1082
1083 replace {
1084         mov     c,%1
1085         cpl     c
1086         mov     %1,c
1087 } by {
1088         ;       Peephole 167    removed redundant bit moves (c not set to %1)
1089         cpl     %1
1090 }
1091
1092 replace {
1093         jnb     %1,%2
1094         sjmp    %3
1095 %2:
1096 } by {
1097         ;       Peephole 168    jump optimization
1098         jb      %1,%3
1099 %2:
1100 }
1101
1102 replace {
1103         jb      %1,%2
1104         sjmp    %3
1105 %2:
1106 } by {
1107         ;       Peephole 169    jump optimization
1108         jnb     %1,%3
1109 %2:
1110 }
1111
1112 replace {
1113         clr     a
1114         cjne    %1,%2,%3
1115         cpl     a
1116 %3:
1117         jz      %4
1118 } by {
1119         ;       Peephole 170    jump optimization
1120         cjne    %1,%2,%4
1121 %3:
1122 } if labelRefCount %3 1
1123
1124 replace {
1125         clr     a
1126         cjne    %1,%2,%3
1127         cjne    %9,%10,%3
1128         cpl     a
1129 %3:
1130         jz      %4
1131 } by {
1132         ;       Peephole 171    jump optimization
1133         cjne    %1,%2,%4
1134         cjne    %9,%10,%4
1135 %3:
1136 } if labelRefCount %3 2
1137
1138 replace {
1139         clr     a
1140         cjne    %1,%2,%3
1141         cjne    %9,%10,%3
1142         cjne    %11,%12,%3
1143         cpl     a
1144 %3:
1145         jz      %4
1146 } by {
1147         ;       Peephole 172    jump optimization
1148         cjne    %1,%2,%4
1149         cjne    %9,%10,%4
1150         cjne    %11,%12,%4
1151 %3:
1152 } if labelRefCount %3 3
1153
1154 replace {
1155         clr     a
1156         cjne    %1,%2,%3
1157         cjne    %9,%10,%3
1158         cjne    %11,%12,%3
1159         cjne    %13,%14,%3
1160         cpl     a
1161 %3:
1162         jz      %4
1163 } by {
1164         ;       Peephole 173    jump optimization
1165         cjne    %1,%2,%4
1166         cjne    %9,%10,%4
1167         cjne    %11,%12,%4
1168         cjne    %13,%14,%4
1169 %3:
1170 } if labelRefCount %3 4
1171
1172 replace {
1173         mov     r%1,%2
1174         clr     c
1175         mov     a,r%1
1176         subb    a,#0x01
1177         mov     %2,a
1178 } by {
1179         ;       Peephole 174    optimized decrement (acc not set to %2, flags undefined)
1180         mov     r%1,%2
1181         dec     %2
1182 }
1183
1184 replace {
1185         mov     r%1,%2
1186         mov     a,r%1
1187         add     a,#0x01
1188         mov     %2,a
1189 } by {
1190         ;       Peephole 175    optimized increment (acc not set to %2, flags undefined)
1191         mov     r%1,%2
1192         inc     %2
1193 }
1194
1195 replace {
1196         mov     %1,@r%2
1197         inc     %1
1198         mov     @r%2,%1
1199 } by {
1200         ;       Peephole 176    optimized increment, removed redundant mov
1201         inc     @r%2
1202         mov     %1,@r%2
1203 } if notVolatile
1204
1205 // this one will screw assignes to volatile/sfr's
1206 replace {
1207         mov  %1,%2
1208         mov  %2,%1
1209 } by {
1210         ;       Peephole 177.a  removed redundant mov
1211         mov  %1,%2
1212 } if notVolatile %1 %2
1213
1214 // applies to f.e. scott-add.asm (--model-large)
1215 replace {
1216         mov     r%1,a
1217         mov     a,ar%1
1218 } by {
1219         ;       Peephole 177.b  removed redundant mov
1220         mov     r%1,a
1221 }
1222
1223 // applies to f.e. bug-408972.c
1224 replace {
1225         mov     %1,%2
1226         mov     %1,%3
1227 } by {
1228         ;       Peephole 177.c  removed redundant move
1229         mov     %1,%3
1230 } if notVolatile %1 %2
1231
1232 // applies to f.e. bug-408972.c
1233 // not before peephole 177.c
1234 replace restart {
1235         mov     %1,%2
1236         mov     %3,%4
1237         mov     %2,%1
1238 } by {
1239         ;       Peephole 177.d  removed redundant move
1240         mov     %1,%2
1241         mov     %3,%4
1242 } if notVolatile(%1 %2),operandsNotRelated(%1 %3)
1243
1244 // applies to f.e. bug-607243.c
1245 // also check notVolatile %3, as it will return FALSE if it's @r%1
1246 replace {
1247         mov     r%1,%2
1248         mov     ar%1,%3
1249 } by {
1250         ;       peephole 177.e  removed redundant move
1251         mov     ar%1,%3
1252 } if notVolatile %2 %3
1253
1254 replace {
1255         mov     ar%1,%2
1256         mov     r%1,%3
1257 } by {
1258         ;       peephole 177.f  removed redundant move
1259         mov     r%1,%3
1260 } if notVolatile %2
1261
1262 replace {
1263         mov     %1,%2
1264         mov     a,%1
1265 } by {
1266         ;       peephole 177.g  optimized mov sequence
1267         mov     a,%2
1268         mov     %1,a
1269 } if notVolatile %1
1270
1271 replace {
1272         mov     %1,%2
1273         mov     a,%2
1274 } by {
1275         ;       peephole 177.h  optimized mov sequence
1276         mov     a,%2
1277         mov     %1,a
1278 } if notVolatile %2
1279
1280 replace {
1281         mov     a,%1
1282         mov     b,a
1283         mov     a,%2
1284 } by {
1285         ;       Peephole 178    removed redundant mov
1286         mov     b,%1
1287         mov     a,%2
1288 }
1289
1290 // rules 179-182 provided by : Frieder <fe@lake.iup.uni-heidelberg.de>
1291 // saving 2 byte, 1 cycle
1292 replace {
1293         mov     b,#0x00
1294         mov     a,#0x00
1295 } by {
1296         ;       Peephole 179    changed mov to clr
1297         clr     a
1298         mov     b,a
1299 }
1300
1301 // applies to:
1302 // volatile xdata char t; t=0x01; t=0x03;
1303 replace {
1304         mov     dptr,%1
1305         mov     a,%2
1306         movx    @dptr,a
1307         mov     dptr,%1
1308 } by {
1309         ;       Peephole 180.a  removed redundant mov to dptr
1310         mov     dptr,%1
1311         mov     a,%2
1312         movx    @dptr,a
1313 }
1314
1315 // volatile xdata char t; t=0x01; t=0x03; t=0x01;
1316 replace {
1317         mov     dptr,%1
1318         mov     a,%2
1319         movx    @dptr,a
1320         mov     a,%3
1321         movx    @dptr,a
1322         mov     dptr,%1
1323 } by {
1324         ;       Peephole 180.b  removed redundant mov to dptr
1325         mov     dptr,%1
1326         mov     a,%2
1327         movx    @dptr,a
1328         mov     a,%3
1329         movx    @dptr,a
1330 }
1331
1332 // saving 1 byte, 0 cycles
1333 replace {
1334         mov     a,#0x00
1335 } by {
1336         ;       Peephole 181    changed mov to clr
1337         clr     a
1338 }
1339
1340 // saving 3 bytes, 2 cycles
1341 // provided by Bernhard Held <bernhard.held@de.westinghouse.com>
1342 replace {
1343         mov     dpl,#%1
1344         mov     dph,#(%1 >> 8)
1345 } by {
1346         ;       Peephole 182.a  used 16 bit load of DPTR
1347         mov     dptr,#%1
1348 }
1349
1350 // saving 3 byte, 2 cycles, return(NULL) profits here
1351 replace {
1352         mov     dpl,#0x%1
1353         mov     dph,#0x%2
1354 } by {
1355         ;       Peephole 182.b  used 16 bit load of dptr
1356         mov     dptr,#0x%2%1
1357 }
1358
1359 // saving 3 byte, 2 cycles. Probably obsoleted by 182.b
1360 replace {
1361         mov     dpl,#%1
1362         mov     dph,#%2
1363 } by {
1364         ;       Peephole 182.c  used 16 bit load of dptr
1365         mov     dptr,#(((%2)<<8) + %1)
1366 }
1367
1368 // applies to return 0.0; in f.e. sincosf.c
1369 replace {
1370         mov     dpl,#%1
1371         clr     a
1372         mov     dph,a
1373 } by {
1374         ;       Peephole 182.d  used 16 bit load of dptr
1375         mov     dptr,#(%1&0x00ff)
1376         clr     a
1377 }
1378
1379 replace {
1380         anl     %1,#%2
1381         anl     %1,#%3
1382 } by {
1383         ;       Peephole 183    avoided anl during execution
1384         anl     %1,#(%2 & %3)
1385 }
1386
1387 replace {
1388         mov     %1,a
1389         cpl     a
1390         mov     %1,a
1391 } by {
1392         ;       Peephole 184    removed redundant mov
1393         cpl     a
1394         mov     %1,a
1395 } if notVolatile %1
1396
1397 replace {
1398 // acc being incremented might cause problems
1399         mov     %1,a
1400         inc     %1
1401 } by {
1402         ;       Peephole 185    changed order of increment (acc incremented also!)
1403         inc     a
1404         mov     %1,a
1405 } if notVolatile %1
1406
1407 replace {
1408         add     a,#%1
1409         mov     dpl,a
1410         clr     a
1411         addc    a,#(%1 >> 8)
1412         mov     dph,a
1413         clr     a
1414         movc    a,@a+dptr
1415         mov     %2,a
1416         inc     dptr
1417         clr     a
1418         movc    a,@a+dptr
1419         mov     %3,a
1420         inc     dptr
1421         clr     a
1422         movc    a,@a+dptr
1423         mov     %4,a
1424         inc     dptr
1425         clr     a
1426 } by {
1427         ;       Peephole 186.a  optimized movc sequence
1428         mov     dptr,#%1
1429         mov     b,acc
1430         movc    a,@a+dptr
1431         mov     %2,a
1432         mov     acc,b
1433         inc     dptr
1434         movc    a,@a+dptr
1435         mov     %3,a
1436         mov     acc,b
1437         inc     dptr
1438         movc    a,@a+dptr
1439         mov     %4,a
1440         mov     acc,b
1441         inc     dptr
1442 }
1443
1444 replace {
1445         add     a,#%1
1446         mov     dpl,a
1447         clr     a
1448         addc    a,#(%1 >> 8)
1449         mov     dph,a
1450         clr     a
1451         movc    a,@a+dptr
1452         mov     %2,a
1453         inc     dptr
1454         clr     a
1455         movc    a,@a+dptr
1456         mov     %3,a
1457         inc     dptr
1458         clr     a
1459 } by {
1460         ;       Peephole 186.b  optimized movc sequence
1461         mov     dptr,#%1
1462         mov     b,acc
1463         movc    a,@a+dptr
1464         mov     %2,a
1465         mov     acc,b
1466         inc     dptr
1467         movc    a,@a+dptr
1468         mov     %3,a
1469         mov     acc,b
1470         inc     dptr
1471 }
1472
1473 replace {
1474         add     a,#%1
1475         mov     dpl,a
1476         clr     a
1477         addc    a,#(%1 >> 8)
1478         mov     dph,a
1479         clr     a
1480         movc    a,@a+dptr
1481         mov     %2,a
1482         inc     dptr
1483         clr     a
1484 } by {
1485         ;       Peephole 186.c  optimized movc sequence
1486         mov     dptr,#%1
1487         mov     b,acc
1488         movc    a,@a+dptr
1489         mov     %2,a
1490         mov     acc,b
1491         inc     dptr
1492 }
1493
1494 // char indexed access to: char code table[] = {4,3,2,1};
1495 replace {
1496         add     a,#%1
1497         mov     dpl,a
1498         clr     a
1499         addc    a,#(%1 >> 8)
1500         mov     dph,a
1501         clr     a
1502         movc    a,@a+dptr
1503 } by {
1504         ;       Peephole 186.d  optimized movc sequence
1505         mov     dptr,#%1
1506         movc    a,@a+dptr
1507 }
1508
1509 // char indexed access to: int code table[] = {4,3,2,1};
1510 replace {
1511         mov     b,#0x02
1512         mul     ab
1513         add     a,#%2
1514         mov     dpl,a
1515         mov     a,b
1516         addc    a,#(%2 >> 8)
1517         mov     dph,a
1518         clr     a
1519         movc    a,@a+dptr
1520         mov     %3,a
1521         mov     a,#0x01
1522         movc    a,@a+dptr
1523 } by {
1524         ;       Peephole 186.e  optimized movc sequence (b, dptr differ)
1525         add     a,acc
1526         mov     b,a
1527         mov     dptr,#%2
1528         jnc     .+3
1529         inc     dph
1530         movc    a,@a+dptr
1531         mov     %3,a
1532         mov     a,b
1533         inc     a
1534         movc    a,@a+dptr
1535 }
1536
1537 replace {
1538         mov     r%1,%2
1539         anl     ar%1,#%3
1540         mov     a,r%1
1541 } by {
1542         ;       Peephole 187    used a instead of ar%1 for anl
1543         mov     a,%2
1544         anl     a,#%3
1545         mov     r%1,a
1546 }
1547
1548 replace {
1549         mov     %1,a
1550         mov     dptr,%2
1551         movc    a,@a+dptr
1552         mov     %1,a
1553 } by {
1554         ;       Peephole 188    removed redundant mov
1555         mov     dptr,%2
1556         movc    a,@a+dptr
1557         mov     %1,a
1558 } if notVolatile %1
1559
1560 replace {
1561         anl     a,#0x0f
1562         mov     %1,a
1563         mov     a,#0x0f
1564         anl     a,%1
1565 } by {
1566         ;       Peephole 189    removed redundant mov and anl
1567         anl     a,#0x0f
1568         mov     %1,a
1569 } if notVolatile %1
1570
1571 // rules 190 & 191 need to be in order
1572 replace {
1573         mov     a,%1
1574         lcall   __gptrput
1575         mov     a,%1
1576 } by {
1577         ;       Peephole 190    removed redundant mov
1578         mov     a,%1
1579         lcall   __gptrput
1580 } if notVolatile %1
1581
1582 replace {
1583         mov     %1,a
1584         mov     dpl,%2
1585         mov     dph,%3
1586         mov     b,%4
1587         mov     a,%1
1588 } by {
1589         ;       Peephole 191    removed redundant mov
1590         mov     %1,a
1591         mov     dpl,%2
1592         mov     dph,%3
1593         mov     b,%4
1594 } if notVolatile %1
1595
1596 replace {
1597         mov     r%1,a
1598         mov     @r%2,ar%1
1599 } by {
1600         ;       Peephole 192    used a instead of ar%1 as source
1601         mov     r%1,a
1602         mov     @r%2,a
1603 }
1604
1605 replace {
1606         jnz     %3
1607         mov     a,%4
1608         jnz     %3
1609         mov     a,%9
1610         jnz     %3
1611         mov     a,%12
1612         cjne    %13,%14,%3
1613         sjmp    %7
1614 %3:
1615         sjmp    %8
1616 } by {
1617         ;       Peephole 193.a  optimized misc jump sequence
1618         jnz     %8
1619         mov     a,%4
1620         jnz     %8
1621         mov     a,%9
1622         jnz     %8
1623         mov     a,%12
1624         cjne    %13,%14,%8
1625         sjmp    %7
1626 ;%3:
1627 } if labelRefCount %3 4
1628
1629 replace {
1630         cjne    %1,%2,%3
1631         mov     a,%4
1632         cjne    %5,%6,%3
1633         mov     a,%9
1634         cjne    %10,%11,%3
1635         mov     a,%12
1636         cjne    %13,%14,%3
1637         sjmp    %7
1638 %3:
1639         sjmp    %8
1640 } by {
1641         ;       Peephole 193.b  optimized misc jump sequence
1642         cjne    %1,%2,%8
1643         mov     a,%4
1644         cjne    %5,%6,%8
1645         mov     a,%9
1646         cjne    %10,%11,%8
1647         mov     a,%12
1648         cjne    %13,%14,%8
1649         sjmp    %7
1650 ;%3:
1651 } if labelRefCount %3 4
1652
1653 replace {
1654         cjne    @%1,%2,%3
1655         inc     %1
1656         cjne    @%1,%6,%3
1657         inc     %1
1658         cjne    @%1,%11,%3
1659         inc     %1
1660         cjne    @%1,%14,%3
1661         sjmp    %7
1662 %3:
1663         sjmp    %8
1664 } by {
1665         ;       Peephole 193.c  optimized misc jump sequence
1666         cjne    @%1,%2,%8
1667         inc     %1
1668         cjne    @%1,%6,%8
1669         inc     %1
1670         cjne    @%1,%11,%8
1671         inc     %1
1672         cjne    @%1,%14,%8
1673         sjmp    %7
1674 ;%3:
1675 } if labelRefCount %3 4
1676
1677 replace {
1678         cjne    %1,%2,%3
1679         cjne    %5,%6,%3
1680         cjne    %10,%11,%3
1681         cjne    %13,%14,%3
1682         sjmp    %7
1683 %3:
1684         sjmp    %8
1685 } by {
1686         ;       Peephole 194    optimized misc jump sequence
1687         cjne    %1,%2,%8
1688         cjne    %5,%6,%8
1689         cjne    %10,%11,%8
1690         cjne    %13,%14,%8
1691         sjmp    %7
1692 ;%3:
1693 } if labelRefCount %3 4
1694
1695 replace {
1696         jnz     %3
1697         mov     a,%4
1698         jnz     %3
1699         mov     a,%9
1700         cjne    %10,%11,%3
1701         sjmp    %7
1702 %3:
1703         sjmp    %8
1704 } by {
1705         ;       Peephole 195.a  optimized misc jump sequence
1706         jnz     %8
1707         mov     a,%4
1708         jnz     %8
1709         mov     a,%9
1710         cjne    %10,%11,%8
1711         sjmp    %7
1712 ;%3:
1713 } if labelRefCount %3 3
1714
1715 replace {
1716         cjne    %1,%2,%3
1717         mov     a,%4
1718         cjne    %5,%6,%3
1719         mov     a,%9
1720         cjne    %10,%11,%3
1721         sjmp    %7
1722 %3:
1723         sjmp    %8
1724 } by {
1725         ;       Peephole 195.b  optimized misc jump sequence
1726         cjne    %1,%2,%8
1727         mov     a,%4
1728         cjne    %5,%6,%8
1729         mov     a,%9
1730         cjne    %10,%11,%8
1731         sjmp    %7
1732 ;%3:
1733 } if labelRefCount %3 3
1734
1735 replace {
1736         cjne    @%1,%2,%3
1737         inc     %1
1738         cjne    @%1,%6,%3
1739         inc     %1
1740         cjne    @%1,%11,%3
1741         sjmp    %7
1742 %3:
1743         sjmp    %8
1744 } by {
1745         ;       Peephole 195.c  optimized misc jump sequence
1746         cjne    @%1,%2,%8
1747         inc     %1
1748         cjne    @%1,%6,%8
1749         inc     %1
1750         cjne    @%1,%11,%8
1751         sjmp    %7
1752 ;%3:
1753 } if labelRefCount %3 3
1754
1755 replace {
1756         cjne    %1,%2,%3
1757         cjne    %5,%6,%3
1758         cjne    %10,%11,%3
1759         sjmp    %7
1760 %3:
1761         sjmp    %8
1762 } by {
1763         ;       Peephole 196    optimized misc jump sequence
1764         cjne    %1,%2,%8
1765         cjne    %5,%6,%8
1766         cjne    %10,%11,%8
1767         sjmp    %7
1768 ;%3:
1769 } if labelRefCount %3 3
1770
1771 replace {
1772         jnz     %3
1773         mov     a,%4
1774         cjne    %5,%6,%3
1775         sjmp    %7
1776 %3:
1777         sjmp    %8
1778 } by {
1779         ;       Peephole 197.a  optimized misc jump sequence
1780         jnz     %8
1781         mov     a,%4
1782         cjne    %5,%6,%8
1783         sjmp    %7
1784 ;%3:
1785 } if labelRefCount %3 2
1786
1787 replace {
1788         cjne    %1,%2,%3
1789         mov     a,%4
1790         cjne    %5,%6,%3
1791         sjmp    %7
1792 %3:
1793         sjmp    %8
1794 } by {
1795         ;       Peephole 197.b  optimized misc jump sequence
1796         cjne    %1,%2,%8
1797         mov     a,%4
1798         cjne    %5,%6,%8
1799         sjmp    %7
1800 ;%3:
1801 } if labelRefCount %3 2
1802
1803 replace {
1804         cjne     @%1,%2,%3
1805         inc     %1
1806         cjne    @%1,%6,%3
1807         sjmp    %7
1808 %3:
1809         sjmp    %8
1810 } by {
1811         ;       Peephole 197.c  optimized misc jump sequence
1812         cjne    @%1,%2,%8
1813         inc     %1
1814         cjne    @%1,%6,%8
1815         sjmp    %7
1816 ;%3:
1817 } if labelRefCount %3 2
1818
1819 replace {
1820         cjne    %1,%2,%3
1821         cjne    %5,%6,%3
1822         sjmp    %7
1823 %3:
1824         sjmp    %8
1825 } by {
1826         ;       Peephole 198    optimized misc jump sequence
1827         cjne    %1,%2,%8
1828         cjne    %5,%6,%8
1829         sjmp    %7
1830 ;%3:
1831 } if labelRefCount %3 2
1832
1833 replace {
1834         cjne    %1,%2,%3
1835         sjmp    %4
1836 %3:
1837         sjmp    %5
1838 } by {
1839         ;       Peephole 199    optimized misc jump sequence
1840         cjne    %1,%2,%5
1841         sjmp    %4
1842 ;%3:
1843 } if labelRefCount %3 1
1844
1845 replace {
1846         sjmp    %1
1847 %1:
1848 } by {
1849         ;       Peephole 200    removed redundant sjmp
1850 %1:
1851 }
1852
1853 replace {
1854         sjmp    %1
1855 %2:
1856 %1:
1857 } by {
1858         ;       Peephole 201    removed redundant sjmp
1859 %2:
1860 %1:
1861 }
1862
1863 replace {
1864         push    acc
1865         mov     dptr,%1
1866         pop     acc
1867 } by {
1868         ;       Peephole 202    removed redundant push pop
1869         mov     dptr,%1
1870 }
1871
1872 replace {
1873         mov     r%1,_spx
1874         lcall   %2
1875         mov     r%1,_spx
1876 } by {
1877         ;       Peephole 203    removed mov  r%1,_spx
1878         lcall   %2
1879 }
1880
1881 replace {
1882         mov     %1,a
1883         add     a,acc
1884         mov     %1,a
1885 } by {
1886         ;       Peephole 204    removed redundant mov
1887         add     a,acc
1888         mov     %1,a
1889 } if notVolatile %1
1890
1891 replace {
1892         djnz    %1,%2
1893         sjmp    %3
1894 %2:
1895         sjmp    %4
1896 %3:
1897 } by {
1898         ;       Peephole 205    optimized misc jump sequence
1899         djnz    %1,%4
1900 %2:
1901 %3:
1902 } if labelRefCount %2 1
1903
1904 replace {
1905         mov     %1,%1
1906 } by {
1907         ;       Peephole 206    removed redundant mov %1,%1
1908 } if notVolatile
1909
1910 replace {
1911         mov     a,_bp
1912         add     a,#0x00
1913         mov     %1,a
1914 } by {
1915         ;       Peephole 207    removed zero add (acc not set to %1, flags undefined)
1916         mov     %1,_bp
1917 }
1918
1919 replace {
1920         push    acc
1921         mov     r%1,_bp
1922         pop     acc
1923 } by {
1924         ;       Peephole 208    removed redundant push pop
1925         mov     r%1,_bp
1926 }
1927
1928 replace {
1929         mov     a,_bp
1930         add     a,#0x00
1931         inc     a
1932         mov     %1,a
1933 } by {
1934         ;       Peephole 209    optimized increment (acc not set to %1, flags undefined)
1935         mov     %1,_bp
1936         inc     %1
1937 }
1938
1939 replace {
1940         mov     dptr,#((((%1 >> 8)) <<8) + %1)
1941 } by {
1942         ;       Peephole 210    simplified expression
1943         mov     dptr,#%1
1944 }
1945
1946 replace {
1947         push    %1
1948         pop     %1
1949 } by {
1950         ;       Peephole 211    removed redundant push %1 pop %1
1951 }
1952
1953 replace {
1954         mov     a,_bp
1955         add     a,#0x01
1956         mov     r%1,a
1957 } by {
1958         ;       Peephole 212    reduced add sequence to inc
1959         mov     r%1,_bp
1960         inc     r%1
1961 }
1962
1963 replace {
1964         mov     %1,#(( %2 >> 8 ) ^ 0x80)
1965 } by {
1966         ;       Peephole 213.a  inserted fix
1967         mov     %1,#(%2 >> 8)
1968         xrl     %1,#0x80
1969 }
1970
1971 replace {
1972         mov     %1,#(( %2 + %3 >> 8 ) ^ 0x80)
1973 } by {
1974         ;       Peephole 213.b  inserted fix
1975         mov     %1,#((%2 + %3) >> 8)
1976         xrl     %1,#0x80
1977 }
1978
1979
1980 replace  {
1981         mov     %1,a
1982         mov     a,%2
1983         add     a,%1
1984 } by {
1985         ;       Peephole 214    reduced some extra moves
1986         mov     %1,a
1987         add     a,%2
1988 } if operandsNotSame
1989
1990 replace {
1991         mov     %1,a
1992         add     a,%2
1993         mov     %1,a
1994 } by {
1995         ;       Peephole 215    removed some moves
1996         add     a,%2
1997         mov     %1,a
1998 } if operandsNotSame
1999
2000 replace {
2001         mov     r%1,%2
2002         clr     a
2003         inc     r%1
2004         mov     @r%1,a
2005         dec     r%1
2006         mov     @r%1,a
2007 } by {
2008         ;       Peephole 216    simplified clear (2bytes)
2009         mov     r%1,%2
2010         clr     a
2011         mov     @r%1,a
2012         inc     r%1
2013         mov     @r%1,a
2014 }
2015
2016 replace {
2017         mov     r%1,%2
2018         clr     a
2019         inc     r%1
2020         inc     r%1
2021         mov     @r%1,a
2022         dec     r%1
2023         mov     @r%1,a
2024         dec     r%1
2025         mov     @r%1,a
2026 } by {
2027         ;       Peephole 217    simplified clear (3bytes)
2028         mov     r%1,%2
2029         clr     a
2030         mov     @r%1,a
2031         inc     r%1
2032         mov     @r%1,a
2033         inc     r%1
2034         mov     @r%1,a
2035 }
2036
2037 replace {
2038         mov     r%1,%2
2039         clr     a
2040         inc     r%1
2041         inc     r%1
2042         inc     r%1
2043         mov     @r%1,a
2044         dec     r%1
2045         mov     @r%1,a
2046         dec     r%1
2047         mov     @r%1,a
2048         dec     r%1
2049         mov     @r%1,a
2050 } by {
2051         ;       Peephole 218    simplified clear (4bytes)
2052         mov     r%1,%2
2053         clr     a
2054         mov     @r%1,a
2055         inc     r%1
2056         mov     @r%1,a
2057         inc     r%1
2058         mov     @r%1,a
2059         inc     r%1
2060         mov     @r%1,a
2061 }
2062
2063 replace {
2064         clr     a
2065         movx    @dptr,a
2066         mov     dptr,%1
2067         clr     a
2068         movx    @dptr,a
2069 } by {
2070         ;       Peephole 219    removed redundant clear
2071         clr     a
2072         movx    @dptr,a
2073         mov     dptr,%1
2074         movx    @dptr,a
2075 }
2076
2077 replace {
2078         clr     a
2079         movx    @dptr,a
2080         mov     dptr,%1
2081         movx    @dptr,a
2082         mov     dptr,%2
2083         clr     a
2084         movx    @dptr,a
2085 } by {
2086         ;       Peephole 219.a  removed redundant clear
2087         clr     a
2088         movx    @dptr,a
2089         mov     dptr,%1
2090         movx    @dptr,a
2091         mov     dptr,%2
2092         movx    @dptr,a
2093 }
2094
2095 replace {
2096         mov     dps,#0x00
2097         mov     dps,#0x01
2098 } by {
2099         ;       Peephole 220.a  removed bogus DPS set
2100         mov     dps,#0x01
2101 }
2102
2103 replace {
2104         mov     dps,#0x01
2105         mov     dps,#0x00
2106 } by {
2107         ;       Peephole 220.b  removed bogus DPS set
2108         mov     dps,#0x00
2109 }
2110
2111 replace {
2112         mov     %1 + %2,(%2 + %1)
2113 } by {
2114         ;       Peephole 221.a  remove redundant move
2115 } if notVolatile
2116
2117 replace {
2118         mov     (%1 + %2 + %3),((%2 + %1) + %3)
2119 } by {
2120         ;       Peephole 221.b  remove redundant move
2121 } if notVolatile
2122
2123 replace {
2124         dec     r%1
2125         inc     r%1
2126 } by {
2127         ;       Peephole 222    removed dec/inc pair
2128 }
2129
2130 replace {
2131         mov     %1,dpl
2132         mov     %2,dph
2133         mov     dpl,%1
2134         mov     dph,%2
2135 } by {
2136         ;       Peephole 223    removed redundant dph/dpl moves
2137         mov     %1,dpl
2138         mov     %2,dph
2139 } if notVolatile %1 %2
2140
2141 replace {
2142         mov     %1,dpl
2143         mov     (%1 + 1),dph
2144         mov     dpl,%1
2145         mov     dph,(%1 + 1)
2146 } by {
2147         ;       Peephole 224    removed redundant dph/dpl moves
2148         mov     %1,dpl
2149         mov     (%1 + 1),dph
2150 } if notVolatile %1
2151
2152 replace {
2153         mov     a,%1
2154         movx    @dptr,a
2155         mov     dpl,%2
2156         mov     dph,%3
2157         mov     b,%4
2158         mov     a,%1
2159 } by {
2160         ;       Peephole 225    removed redundant move to acc
2161         mov     a,%1
2162         movx    @dptr,a
2163         mov     dpl,%2
2164         mov     dph,%3
2165         mov     b,%4
2166 } if notVolatile %1
2167
2168 replace {
2169         clr     a
2170         movx    @dptr,a
2171         inc     dptr
2172         movx    @dptr,a
2173         inc     dptr
2174         clr     a
2175 } by {
2176         ;       Peephole 226    removed unnecessary clr
2177         clr     a
2178         movx    @dptr,a
2179         inc     dptr
2180         movx    @dptr,a
2181         inc     dptr
2182 }
2183
2184 replace {
2185         mov     dptr,#%1
2186         clr     a
2187         inc     dptr
2188         inc     dptr
2189         inc     dptr
2190         movx    @dptr,a
2191         lcall   __decdptr
2192         movx    @dptr,a
2193         lcall   __decdptr
2194         movx    @dptr,a
2195         lcall   __decdptr
2196         movx    @dptr,a
2197 } by {
2198         ;       Peephole 227    replaced inefficient 32 bit clear
2199         mov     dptr,#%1
2200         clr     a
2201         movx    @dptr,a
2202         inc     dptr
2203         movx    @dptr,a
2204         inc     dptr
2205         movx    @dptr,a
2206         inc     dptr
2207         movx    @dptr,a
2208         mov     dptr,#%1
2209 }
2210
2211 replace {
2212         mov     dptr,#%1
2213         clr     a
2214         inc     dptr
2215         inc     dptr
2216         inc     dptr
2217         movx    @dptr,a
2218         lcall   __decdptr
2219         movx    @dptr,a
2220         lcall   __decdptr
2221         movx    @dptr,a
2222         lcall   __decdptr
2223         mov     a,#%2
2224         movx    @dptr,a
2225 } by {
2226         ;       Peephole 228    replaced inefficient 32 constant
2227         mov     dptr,#%1
2228         mov     a,#%2
2229         movx    @dptr,a
2230         inc     dptr
2231         clr     a
2232         movx    @dptr,a
2233         inc     dptr
2234         movx    @dptr,a
2235         inc     dptr
2236         movx    @dptr,a
2237         mov     dptr,#%1
2238 }
2239
2240 replace {
2241         mov     dptr,#%1
2242         clr     a
2243         inc     dptr
2244         movx    @dptr,a
2245         lcall   __decdptr
2246         movx    @dptr,a
2247 } by {
2248         ;       Peephole 229    replaced inefficient 16 bit clear
2249         mov     dptr,#%1
2250         clr     a
2251         movx    @dptr,a
2252         inc     dptr
2253         movx    @dptr,a
2254         mov     dptr,#%1
2255 }
2256
2257 replace {
2258         mov     dptr,#%1
2259         clr     a
2260         inc     dptr
2261         movx    @dptr,a
2262         lcall   __decdptr
2263         mov     a,#%2
2264         movx    @dptr,a
2265 } by {
2266         ;       Peephole 230    replaced inefficient 16 bit constant
2267         mov     dptr,#%1
2268         mov     a,#%2
2269         movx    @dptr,a
2270         inc     dptr
2271         clr     a
2272         movx    @dptr,a
2273         mov     dptr,#%1
2274 }
2275
2276 // this last peephole often removes the last mov from 227-230
2277 replace {
2278         mov     dptr,#%1
2279         mov     dptr,#%2
2280 } by {
2281         ;       Peephole 231    removed redundant mov to dptr
2282         mov     dptr,#%2
2283 }
2284
2285 replace {
2286         movx    a,@dptr
2287 } by {
2288         ;       Peephole 232    using movc to read xdata (--xram-movc)
2289         clr     a
2290         movc    a,@a+dptr
2291 } if xramMovcOption
2292
2293 replace {
2294         lcall   _gptrget
2295 } by {
2296         ;       Peephole 233    using _gptrgetc instead of _gptrget (--xram-movc)
2297         lcall   _gptrgetc
2298 } if xramMovcOption
2299
2300 replace {
2301         mov     r%1,a
2302         mov     dpl,r%1
2303 %2:
2304         ret
2305 } by {
2306         ;       Peephole 234    loading dpl directly from a(ccumulator), r%1 not set
2307         mov     dpl,a
2308 %2:
2309         ret
2310 }
2311
2312 replace {
2313         mov     r%1,a
2314         mov     dpl,r%2
2315         mov     dph,r%1
2316 %3:
2317         ret
2318 } by {
2319         ;       Peephole 235    loading dph directly from a(ccumulator), r%1 not set
2320         mov     dpl,r%2
2321         mov     dph,a
2322 %3:
2323         ret
2324 }
2325
2326 // 14 rules by Fiorenzo D. Ramaglia <fd.ramaglia@tin.it>
2327
2328 replace {
2329         add     a,ar%1
2330 } by {
2331         ;       Peephole 236.a  used r%1 instead of ar%1
2332         add     a,r%1
2333 }
2334
2335 replace {
2336         addc    a,ar%1
2337 } by {
2338         ;       Peephole 236.b  used r%1 instead of ar%1
2339         addc    a,r%1
2340 }
2341
2342 replace {
2343         anl     a,ar%1
2344 } by {
2345         ;       Peephole 236.c  used r%1 instead of ar%1
2346         anl     a,r%1
2347 }
2348
2349 replace {
2350         dec     ar%1
2351 } by {
2352         ;       Peephole 236.d  used r%1 instead of ar%1
2353         dec     r%1
2354 }
2355
2356 replace {
2357         djnz    ar%1,%2
2358 } by {
2359         ;       Peephole 236.e  used r%1 instead of ar%1
2360         djnz    r%1,%2
2361 }
2362
2363 replace {
2364         inc     ar%1
2365 } by {
2366         ;       Peephole 236.f  used r%1 instead of ar%1
2367         inc     r%1
2368 }
2369
2370 replace {
2371         mov     a,ar%1
2372 } by {
2373         ;       Peephole 236.g  used r%1 instead of ar%1
2374         mov     a,r%1
2375 }
2376
2377 replace {
2378         mov     ar%1,#%2
2379 } by {
2380         ;       Peephole 236.h  used r%1 instead of ar%1
2381         mov     r%1,#%2
2382 }
2383
2384 replace {
2385         mov     ar%1,a
2386 } by {
2387         ;       Peephole 236.i  used r%1 instead of ar%1
2388         mov     r%1,a
2389 }
2390
2391 replace {
2392         mov     ar%1,ar%2
2393 } by {
2394         ;       Peephole 236.j  used r%1 instead of ar%1
2395         mov     r%1,ar%2
2396 }
2397
2398 replace {
2399         orl     a,ar%1
2400 } by {
2401         ;       Peephole 236.k  used r%1 instead of ar%1
2402         orl     a,r%1
2403 }
2404
2405 replace {
2406         subb    a,ar%1
2407 } by {
2408         ;       Peephole 236.l  used r%1 instead of ar%1
2409         subb    a,r%1
2410 }
2411
2412 replace {
2413         xch     a,ar%1
2414 } by {
2415         ;       Peephole 236.m  used r%1 instead of ar%1
2416         xch     a,r%1
2417 }
2418
2419 replace {
2420         xrl     a,ar%1
2421 } by {
2422         ;       Peephole 236.n  used r%1 instead of ar%1
2423         xrl     a,r%1
2424 }
2425
2426 replace {
2427         sjmp    %1
2428 %2:
2429         mov     %3,%4
2430 %1:
2431         ret
2432 } by {
2433         ;       Peephole 237.a  removed sjmp to ret
2434         ret
2435 %2:
2436         mov     %3,%4
2437 %1:
2438         ret
2439 }
2440
2441 replace {
2442         sjmp    %1
2443 %2:
2444         mov     %3,%4
2445         mov     dpl,%5
2446         mov     dph,%6
2447 %1:
2448         ret
2449 } by {
2450         ;       Peephole 237.b  removed sjmp to ret
2451         ret
2452 %2:
2453         mov     %3,%4
2454         mov     dpl,%5
2455         mov     dph,%6
2456 %1:
2457         ret
2458 }
2459
2460 // applies to f.e. device/lib/log10f.c
2461 replace {
2462         mov     %1,%9
2463         mov     %2,%10
2464         mov     %3,%11
2465         mov     %4,%12
2466
2467         mov     %5,%13
2468         mov     %6,%14
2469         mov     %7,%15
2470         mov     %8,%16
2471
2472         mov     %9,%1
2473         mov     %10,%2
2474         mov     %11,%3
2475         mov     %12,%4
2476 } by {
2477         mov     %1,%9
2478         mov     %2,%10
2479         mov     %3,%11
2480         mov     %4,%12
2481
2482         mov     %5,%13
2483         mov     %6,%14
2484         mov     %7,%15
2485         mov     %8,%16
2486         ;       Peephole 238.a  removed 4 redundant moves
2487 } if operandsNotSame8 %1 %2 %3 %4 %5 %6 %7 %8
2488
2489 // applies to device/lib/log10f.c
2490 replace {
2491         mov     %1,%5
2492         mov     %2,%6
2493         mov     %3,%7
2494         mov     %4,%8
2495
2496         mov     %5,%1
2497         mov     %6,%2
2498         mov     %7,%3
2499 } by {
2500         mov     %1,%5
2501         mov     %2,%6
2502         mov     %3,%7
2503         mov     %4,%8
2504         ;       Peephole 238.b  removed 3 redundant moves
2505 } if operandsNotSame7 %1 %2 %3 %4 %5 %6 %7
2506
2507 // applies to f.e. device/lib/time.c
2508 replace {
2509         mov     %1,%5
2510         mov     %2,%6
2511
2512         mov     %3,%7
2513         mov     %4,%8
2514
2515         mov     %5,%1
2516         mov     %6,%2
2517 } by {
2518         mov     %1,%5
2519         mov     %2,%6
2520
2521         mov     %3,%7
2522         mov     %4,%8
2523         ;       Peephole 238.c  removed 2 redundant moves
2524 } if operandsNotSame4 %1 %2 %3 %4
2525
2526 // applies to f.e. support/regression/tests/bug-524209.c
2527 replace {
2528         mov     %1,%4
2529         mov     %2,%5
2530         mov     %3,%6
2531
2532         mov     %4,%1
2533         mov     %5,%2
2534         mov     %6,%3
2535 } by {
2536         mov     %1,%4
2537         mov     %2,%5
2538         mov     %3,%6
2539         ;       Peephole 238.d  removed 3 redundant moves
2540 } if operandsNotSame6 %1 %2 %3 %4 %5 %6
2541
2542 // applies to f.e. ser_ir.asm
2543 replace {
2544         mov     r%1,acc
2545 } by {
2546         ;       Peephole 239    used a instead of acc
2547         mov     r%1,a
2548 }
2549
2550 replace restart {
2551         mov     a,%1
2552         addc    a,#0x00
2553 } by {
2554         ;       Peephole 240    use clr instead of addc a,#0
2555         clr     a
2556         addc    a,%1
2557 }
2558
2559 // peepholes 241.a to 241.c and 241.d to 241.f need to be in order
2560 replace {
2561         cjne    r%1,#%2,%3
2562         cjne    r%4,#%5,%3
2563         cjne    r%6,#%7,%3
2564         cjne    r%8,#%9,%3
2565         mov     a,#0x01
2566         sjmp    %10
2567 %3:
2568         clr     a
2569 %10:
2570 } by {
2571         ;       Peephole 241.a  optimized compare
2572         clr     a
2573         cjne    r%1,#%2,%3
2574         cjne    r%4,#%5,%3
2575         cjne    r%6,#%7,%3
2576         cjne    r%8,#%9,%3
2577         inc     a
2578 %3:
2579 %10:
2580 }
2581
2582 // applies to f.e. time.c
2583 replace {
2584         cjne    r%1,#%2,%3
2585         cjne    r%4,#%5,%3
2586         mov     a,#0x01
2587         sjmp    %6
2588 %3:
2589         clr     a
2590 %6:
2591 } by {
2592         ;       Peephole 241.b  optimized compare
2593         clr     a
2594         cjne    r%1,#%2,%3
2595         cjne    r%4,#%5,%3
2596         inc     a
2597 %3:
2598 %6:
2599 }
2600
2601 // applies to f.e. malloc.c
2602 replace {
2603         cjne    r%1,#%2,%3
2604         mov     a,#0x01
2605         sjmp    %4
2606 %3:
2607         clr     a
2608 %4:
2609 } by {
2610         ;       Peephole 241.c  optimized compare
2611         clr     a
2612         cjne    r%1,#%2,%3
2613         inc     a
2614 %3:
2615 %4:
2616 }
2617
2618 // applies to f.e. j = (k!=0x1000);
2619 // with volatile idata long k;
2620 replace {
2621         cjne    @r%1,#%2,%3
2622         inc     r%1
2623         cjne    @r%1,#%4,%3
2624         inc     r%1
2625         cjne    @r%1,#%5,%3
2626         inc     r%1
2627         cjne    @r%1,#%6,%3
2628         mov     a,#0x01
2629         sjmp    %7
2630 %3:
2631         clr     a
2632 %7:
2633 } by {
2634         ;       Peephole 241.d  optimized compare
2635         clr     a
2636         cjne    @r%1,#%2,%3
2637         inc     r%1
2638         cjne    @r%1,#%4,%3
2639         inc     r%1
2640         cjne    @r%1,#%5,%3
2641         inc     r%1
2642         cjne    @r%1,#%6,%3
2643         inc     a
2644 %3:
2645 %7:
2646 }
2647
2648 // applies to f.e. j = (k!=0x1000);
2649 // with volatile idata int k;
2650 replace {
2651         cjne    @r%1,#%2,%3
2652         inc     r%1
2653         cjne    @r%1,#%4,%3
2654         mov     a,#0x01
2655         sjmp    %7
2656 %3:
2657         clr     a
2658 %7:
2659 } by {
2660         ;       Peephole 241.e  optimized compare
2661         clr     a
2662         cjne    @r%1,#%2,%3
2663         inc     r%1
2664         cjne    @r%1,#%4,%3
2665         inc     a
2666 %3:
2667 %7:
2668 }
2669
2670 // applies to f.e. vprintf.asm (--stack-auto)
2671 replace {
2672         cjne    @r%1,#%2,%3
2673         mov     a,#0x01
2674         sjmp    %7
2675 %3:
2676         clr     a
2677 %7:
2678 } by {
2679         ;       Peephole 241.f  optimized compare
2680         clr     a
2681         cjne    @r%1,#%2,%3
2682         inc     a
2683 %3:
2684 %7:
2685 }
2686
2687 // applies to f.e. scott-bool1.c
2688 replace {
2689         jnz     %1
2690         mov     %2,%3
2691 %1:
2692         jz      %4
2693 } by {
2694         ;       Peephole 242.a  avoided branch jnz to jz
2695         jnz     %1
2696         mov     %2,%3
2697         jz      %4
2698 %1:
2699 } if labelRefCount %1 1
2700
2701 // applies to f.e. scott-bool1.c
2702 replace {
2703         jnz     %1
2704         mov     %2,%3
2705         orl     a,%5
2706 %1:
2707         jz      %4
2708 } by {
2709         ;       Peephole 242.b  avoided branch jnz to jz
2710         jnz     %1
2711         mov     %2,%3
2712         orl     a,%5
2713         jz      %4
2714 %1:
2715 } if labelRefCount %1 1
2716
2717 // applies to f.e. logic.c
2718 replace {
2719         jnz     %1
2720         mov     %2,%3
2721         orl     a,%5
2722         orl     a,%6
2723         orl     a,%7
2724 %1:
2725         jz      %4
2726 } by {
2727         ;       Peephole 242.c  avoided branch jnz to jz
2728         jnz     %1
2729         mov     %2,%3
2730         orl     a,%5
2731         orl     a,%6
2732         orl     a,%7
2733         jz      %4
2734 %1:
2735 } if labelRefCount %1 1
2736
2737 // applies to f.e. vprintf.c
2738 // this is a rare case, usually the "tail increment" is noticed earlier
2739 replace {
2740         cjne    %1,%2,%3
2741         inc     %4
2742 %3:
2743         sjmp    %5
2744 } by {
2745         ;       Peephole 243    avoided branch to sjmp
2746         cjne    %1,%2,%5
2747         inc     %4
2748 %3:
2749         sjmp    %5
2750 } if labelInRange
2751
2752 // applies to f.e. simplefloat.c (saving 1 cycle)
2753 replace {
2754         mov     r%1,dpl
2755         mov     a,r%1
2756 } by {
2757         ;       Peephole 244.a  moving first to a instead of r%1
2758         mov     a,dpl
2759         mov     r%1,a
2760 }
2761
2762 // applies to f.e. _itoa.c (saving 1 cycle)
2763 replace {
2764         mov     r%1,dph
2765         mov     a,r%1
2766 } by {
2767         ;       Peephole 244.b  moving first to a instead of r%1
2768         mov     a,dph
2769         mov     r%1,a
2770 }
2771
2772
2773 // applies to f.e. bug-460010.c (saving 1 cycle)
2774 replace {
2775         mov     r%1,a
2776         mov     dpl,r%1
2777 } by {
2778         ;       Peephole 244.c  loading dpl from a instead of r%1
2779         mov     r%1,a
2780         mov     dpl,a
2781 }
2782
2783 replace {
2784         mov     r%1,a
2785         mov     dph,r%1
2786 } by {
2787         ;       Peephole 244.d  loading dph from a instead of r%1
2788         mov     r%1,a
2789         mov     dph,a
2790 }
2791
2792 // this one is safe but disables 245.a 245.b
2793 // please remove 245 if 245.a 245.b are found to be safe
2794 // applies to f.e. scott-compare.c
2795 replace {
2796         clr     a
2797         rlc     a
2798         mov     r%1,a
2799         cjne    a,#0x01,%2
2800 %2:
2801         clr     a
2802         rlc     a
2803         mov     r%1,a
2804 } by {
2805         ;       Peephole 245    optimized complement (r%1 and acc set needed?)
2806         cpl     c
2807         clr     a
2808         rlc     a
2809         mov     r%1,a
2810 } if labelRefCount %2 1
2811
2812 // this one will not be triggered if 245 is present
2813 // please remove 245 if 245.a 245.b are found to be safe
2814 // applies to f.e. vprintf.c
2815 replace {
2816         clr     a
2817         rlc     a
2818         mov     r%1,a
2819         cjne    a,#0x01,%2
2820 %2:
2821         clr     a
2822         rlc     a
2823         mov     r%1,a
2824         jz      %3
2825 } by {
2826         ;       Peephole 245.a  optimized conditional jump (r%1 and acc not set!)
2827         jc      %3
2828 } if labelRefCount %2 1
2829
2830 // this one will not be triggered if 245 is present
2831 // please remove 245 if 245.a 245.b are found to be safe
2832 // applies to f.e. scott-compare.c
2833 replace {
2834         clr     a
2835         rlc     a
2836         mov     r%1,a
2837         cjne    a,#0x01,%2
2838 %2:
2839         clr     a
2840         rlc     a
2841         mov     r%1,a
2842         jnz     %3
2843 } by {
2844         ;       Peephole 245.b  optimized conditional jump (r%1 and acc not set!)
2845         jnc     %3
2846 } if labelRefCount %2 1
2847
2848
2849 // rules 246.x apply to f.e. bitfields.c
2850 replace {
2851         mov     dptr,#%1
2852         movx    a,@dptr
2853         anl     a,#%2
2854         movx    @dptr,a
2855         mov     dptr,#%1
2856         movx    a,@dptr
2857         anl     a,#%3
2858         movx    @dptr,a
2859 } by {
2860         ;       Peephole 246.a  combined clr/clr
2861         mov     dptr,#%1
2862         movx    a,@dptr
2863         anl     a,#%2&%3
2864         movx    @dptr,a
2865 } if notVolatile %1
2866
2867 replace {
2868         mov     dptr,#%1
2869         movx    a,@dptr
2870         orl     a,#%2
2871         movx    @dptr,a
2872         mov     dptr,#%1
2873         movx    a,@dptr
2874         orl     a,#%3
2875         movx    @dptr,a
2876 } by {
2877         ;       Peephole 246.b  combined set/set
2878         mov     dptr,#%1
2879         movx    a,@dptr
2880         orl     a,#%2|%3
2881         movx    @dptr,a
2882 } if notVolatile %1
2883
2884 replace {
2885         mov     dptr,#%1
2886         movx    a,@dptr
2887         orl     a,#%2
2888         movx    @dptr,a
2889         mov     dptr,#%1
2890         movx    a,@dptr
2891         anl     a,#%3
2892         movx    @dptr,a
2893 } by {
2894         ;       Peephole 246.c  combined set/clr
2895         mov     dptr,#%1
2896         movx    a,@dptr
2897         orl     a,#%2
2898         anl     a,#%3
2899         movx    @dptr,a
2900 } if notVolatile %1
2901
2902 replace {
2903         mov     dptr,#%1
2904         movx    a,@dptr
2905         anl     a,#%2
2906         movx    @dptr,a
2907         mov     dptr,#%1
2908         movx    a,@dptr
2909         orl     a,#%3
2910         movx    @dptr,a
2911 } by {
2912         ;       Peephole 246.d  combined clr/set
2913         mov     dptr,#%1
2914         movx    a,@dptr
2915         anl     a,#%2
2916         orl     a,#%3
2917         movx    @dptr,a
2918 } if notVolatile %1
2919
2920 replace {
2921         mov     dptr,#%1
2922         movx    a,@dptr
2923         orl     a,#%2
2924         anl     a,#%3
2925         movx    @dptr,a
2926         mov     dptr,#%1
2927         movx    a,@dptr
2928         anl     a,#%4
2929         movx    @dptr,a
2930 } by {
2931         ;       Peephole 246.e  combined set/clr/clr
2932         mov     dptr,#%1
2933         movx    a,@dptr
2934         orl     a,#%2
2935         anl     a,#%3&%4
2936         movx    @dptr,a
2937 } if notVolatile %1
2938
2939 replace {
2940         mov     dptr,#%1
2941         movx    a,@dptr
2942         orl     a,#%2
2943         anl     a,#%3
2944         movx    @dptr,a
2945         mov     dptr,#%1
2946         movx    a,@dptr
2947         orl     a,#%4
2948         movx    @dptr,a
2949 } by {
2950         ;       Peephole 246.f  combined set/clr/set
2951         mov     dptr,#%1
2952         movx    a,@dptr
2953         orl     a,#%2
2954         anl     a,#%3
2955         orl     a,#%4
2956         movx    @dptr,a
2957 } if notVolatile %1
2958
2959 replace {
2960         mov     dptr,#%1
2961         movx    a,@dptr
2962         anl     a,#%2
2963         orl     a,#%3
2964         movx    @dptr,a
2965         mov     dptr,#%1
2966         movx    a,@dptr
2967         anl     a,#%4
2968         movx    @dptr,a
2969 } by {
2970         ;       Peephole 246.g  combined clr/set/clr
2971         mov     dptr,#%1
2972         movx    a,@dptr
2973         anl     a,#%2
2974         orl     a,#%3
2975         anl     a,#%4
2976         movx    @dptr,a
2977 } if notVolatile %1
2978
2979 replace {
2980         mov     dptr,#%1
2981         movx    a,@dptr
2982         anl     a,#%2
2983         orl     a,#%3
2984         movx    @dptr,a
2985         mov     dptr,#%1
2986         movx    a,@dptr
2987         orl     a,#%4
2988         movx    @dptr,a
2989 } by {
2990         ;       Peephole 246.h  combined clr/set/set
2991         mov     dptr,#%1
2992         movx    a,@dptr
2993         anl     a,#%2
2994         orl     a,#%3|%4
2995         movx    @dptr,a
2996 } if notVolatile %1
2997
2998
2999
3000
3001 // rules 247.x apply to f.e. bitfields.c
3002 replace {
3003         mov     r%5,#%1
3004         mov     a,@r%5
3005         anl     a,#%2
3006         mov     @r%5,a
3007         mov     r%5,#%1
3008         mov     a,@r%5
3009         anl     a,#%3
3010         mov     @r%5,a
3011 } by {
3012         ;       Peephole 247.a  combined clr/clr
3013         mov     r%5,#%1
3014         mov     a,@r%5
3015         anl     a,#%2&%3
3016         mov     @r%5,a
3017 } if notVolatile %1
3018
3019 replace {
3020         mov     r%5,#%1
3021         mov     a,@r%5
3022         orl     a,#%2
3023         mov     @r%5,a
3024         mov     r%5,#%1
3025         mov     a,@r%5
3026         orl     a,#%3
3027         mov     @r%5,a
3028 } by {
3029         ;       Peephole 247.b  combined set/set
3030         mov     r%5,#%1
3031         mov     a,@r%5
3032         orl     a,#%2|%3
3033         mov     @r%5,a
3034 } if notVolatile %1
3035
3036 replace {
3037         mov     r%5,#%1
3038         mov     a,@r%5
3039         orl     a,#%2
3040         mov     @r%5,a
3041         mov     r%5,#%1
3042         mov     a,@r%5
3043         anl     a,#%3
3044         mov     @r%5,a
3045 } by {
3046         ;       Peephole 247.c  combined set/clr
3047         mov     r%5,#%1
3048         mov     a,@r%5
3049         orl     a,#%2
3050         anl     a,#%3
3051         mov     @r%5,a
3052 } if notVolatile %1
3053
3054 replace {
3055         mov     r%5,#%1
3056         mov     a,@r%5
3057         anl     a,#%2
3058         mov     @r%5,a
3059         mov     r%5,#%1
3060         mov     a,@r%5
3061         orl     a,#%3
3062         mov     @r%5,a
3063 } by {
3064         ;       Peephole 247.d  combined clr/set
3065         mov     r%5,#%1
3066         mov     a,@r%5
3067         anl     a,#%2
3068         orl     a,#%3
3069         mov     @r%5,a
3070 } if notVolatile %1
3071
3072 replace {
3073         mov     r%5,#%1
3074         mov     a,@r%5
3075         orl     a,#%2
3076         anl     a,#%3
3077         mov     @r%5,a
3078         mov     r%5,#%1
3079         mov     a,@r%5
3080         anl     a,#%4
3081         mov     @r%5,a
3082 } by {
3083         ;       Peephole 247.e  combined set/clr/clr
3084         mov     r%5,#%1
3085         mov     a,@r%5
3086         orl     a,#%2
3087         anl     a,#%3&%4
3088         mov     @r%5,a
3089 } if notVolatile %1
3090
3091 replace {
3092         mov     r%5,#%1
3093         mov     a,@r%5
3094         orl     a,#%2
3095         anl     a,#%3
3096         mov     @r%5,a
3097         mov     r%5,#%1
3098         mov     a,@r%5
3099         orl     a,#%4
3100         mov     @r%5,a
3101 } by {
3102         ;       Peephole 247.f  combined set/clr/set
3103         mov     r%5,#%1
3104         mov     a,@r%5
3105         orl     a,#%2
3106         anl     a,#%3
3107         orl     a,#%4
3108         mov     @r%5,a
3109 } if notVolatile %1
3110
3111 replace {
3112         mov     r%5,#%1
3113         mov     a,@r%5
3114         anl     a,#%2
3115         orl     a,#%3
3116         mov     @r%5,a
3117         mov     r%5,#%1
3118         mov     a,@r%5
3119         anl     a,#%4
3120         mov     @r%5,a
3121 } by {
3122         ;       Peephole 247.g  combined clr/set/clr
3123         mov     r%5,#%1
3124         mov     a,@r%5
3125         anl     a,#%2
3126         orl     a,#%3
3127         anl     a,#%4
3128         mov     @r%5,a
3129 } if notVolatile %1
3130
3131 replace {
3132         mov     r%5,#%1
3133         mov     a,@r%5
3134         anl     a,#%2
3135         orl     a,#%3
3136         mov     @r%5,a
3137         mov     r%5,#%1
3138         mov     a,@r%4
3139         orl     a,#%4
3140         mov     @r%5,a
3141 } by {
3142         ;       Peephole 247.h  combined clr/set/set
3143         mov     r%5,#%1
3144         mov     a,@r%5
3145         anl     a,#%2
3146         orl     a,#%3|%4
3147         mov     @r%5,a
3148 } if notVolatile %1
3149
3150
3151 // Peepholes 248.x have to be compatible with the keyword volatile.
3152 // They optimize typical accesses to memory mapped I/O devices:
3153 // volatile xdata char t; t|=0x01;
3154 replace {
3155         mov     dptr,%1
3156         movx    a,@dptr
3157         mov     r%2,a
3158         mov     dptr,%1
3159         mov     a,%3
3160         orl     a,r%2
3161         movx    @dptr,a
3162 } by {
3163         ;       Peephole 248.a  optimized or to xdata
3164         mov     dptr,%1
3165         movx    a,@dptr
3166         mov     r%2,a
3167         orl     a,%3
3168         movx    @dptr,a
3169 }
3170
3171 // volatile xdata char t; t&=0x01;
3172 replace {
3173         mov     dptr,%1
3174         movx    a,@dptr
3175         mov     r%2,a
3176         mov     dptr,%1
3177         mov     a,%3
3178         anl     a,r%2
3179         movx    @dptr,a
3180 } by {
3181         ;       Peephole 248.b  optimized and to xdata
3182         mov     dptr,%1
3183         movx    a,@dptr
3184         mov     r%2,a
3185         anl     a,%3
3186         movx    @dptr,a
3187 }
3188
3189 // volatile xdata char t; t^=0x01;
3190 replace {
3191         mov     dptr,%1
3192         movx    a,@dptr
3193         mov     r%2,a
3194         mov     dptr,%1
3195         mov     a,%3
3196         xrl     a,r%2
3197         movx    @dptr,a
3198 } by {
3199         ;       Peephole 248.c  optimized xor to xdata
3200         mov     dptr,%1
3201         movx    a,@dptr
3202         mov     r%2,a
3203         xrl     a,%3
3204         movx    @dptr,a
3205 }
3206
3207 // volatile xdata char t; t|=0x01; t&=~0x01; t|=0x01;
3208 replace {
3209         mov     dptr,%1
3210         movx    a,@dptr
3211         mov     r%2,a
3212         orl     a,%3
3213         movx    @dptr,a
3214
3215         mov     dptr,%1
3216         movx    a,@dptr
3217         mov     r%2,a
3218         anl     a,%4
3219         movx    @dptr,a
3220
3221         mov     dptr,%1
3222         movx    a,@dptr
3223         mov     r%2,a
3224         orl     a,%5
3225         movx    @dptr,a
3226 } by {
3227         ;       Peephole 248.d  optimized or/and/or to volatile xdata
3228         mov     dptr,%1
3229         movx    a,@dptr
3230         orl     a,%3
3231         movx    @dptr,a
3232         movx    a,@dptr
3233         anl     a,%4
3234         movx    @dptr,a
3235         movx    a,@dptr
3236         mov     r%2,a
3237         orl     a,%5
3238         movx    @dptr,a
3239 }
3240
3241 // volatile xdata char t; t&=~0x01; t|=0x01; t&=~0x01;
3242 replace {
3243         mov     dptr,%1
3244         movx    a,@dptr
3245         mov     r%2,a
3246         anl     a,%3
3247         movx    @dptr,a
3248
3249         mov     dptr,%1
3250         movx    a,@dptr
3251         mov     r%2,a
3252         orl     a,%4
3253         movx    @dptr,a
3254
3255         mov     dptr,%1
3256         movx    a,@dptr
3257         mov     r%2,a
3258         anl     a,%5
3259         movx    @dptr,a
3260 } by {
3261         ;       Peephole 248.e  optimized and/or/and to volatile xdata
3262         mov     dptr,%1
3263         movx    a,@dptr
3264         anl     a,%3
3265         movx    @dptr,a
3266         movx    a,@dptr
3267         orl     a,%4
3268         movx    @dptr,a
3269         movx    a,@dptr
3270         mov     r%2,a
3271         anl     a,%5
3272         movx    @dptr,a
3273 }
3274
3275 // volatile xdata char t; t|=0x01; t&=~0x01;
3276 replace {
3277         mov     dptr,%1
3278         movx    a,@dptr
3279         mov     r%2,a
3280         orl     a,%3
3281         movx    @dptr,a
3282
3283         mov     dptr,%1
3284         movx    a,@dptr
3285         mov     r%2,a
3286         anl     a,%4
3287         movx    @dptr,a
3288 } by {
3289         ;       Peephole 248.f  optimized or/and to volatile xdata
3290         mov     dptr,%1
3291         movx    a,@dptr
3292         orl     a,%3
3293         movx    @dptr,a
3294         movx    a,@dptr
3295         mov     r%2,a
3296         anl     a,%4
3297         movx    @dptr,a
3298 }
3299
3300 // volatile xdata char t; t&=~0x01; t|=0x01;
3301 replace {
3302         mov     dptr,%1
3303         movx    a,@dptr
3304         mov     r%2,a
3305         anl     a,%3
3306         movx    @dptr,a
3307
3308         mov     dptr,%1
3309         movx    a,@dptr
3310         mov     r%2,a
3311         orl     a,%4
3312         movx    @dptr,a
3313 } by {
3314         ;       Peephole 248.g  optimized and/or to volatile xdata
3315         mov     dptr,%1
3316         movx    a,@dptr
3317         anl     a,%3
3318         movx    @dptr,a
3319         movx    a,@dptr
3320         mov     r%2,a
3321         orl     a,%4
3322         movx    @dptr,a
3323 }
3324
3325 // volatile xdata char t; t^=0x01; t^=0x01;
3326 replace {
3327         mov     dptr,%1
3328         movx    a,@dptr
3329         mov     r%2,a
3330         xrl     a,%3
3331         movx    @dptr,a
3332
3333         mov     dptr,%1
3334         movx    a,@dptr
3335         mov     r%2,a
3336         xrl     a,%4
3337         movx    @dptr,a
3338 } by {
3339         ;       Peephole 248.h  optimized xor/xor to volatile xdata
3340         mov     dptr,%1
3341         movx    a,@dptr
3342         xrl     a,%3
3343         movx    @dptr,a
3344         movx    a,@dptr
3345         mov     r%2,a
3346         xrl     a,%4
3347         movx    @dptr,a
3348 }
3349
3350 // Peeepholes 248.i to 248.m are like 248.d to 248.h except they apply to bitfields:
3351 // xdata struct { unsigned b0:1; unsigned b1:1; unsigned b2:1; } xport;
3352 // xport.b0=1; xport.b0=0; xport.b0=1;
3353 replace {
3354         mov     dptr,%1
3355         movx    a,@dptr
3356         orl     a,%3
3357         movx    @dptr,a
3358
3359         mov     dptr,%1
3360         movx    a,@dptr
3361         anl     a,%4
3362         movx    @dptr,a
3363
3364         mov     dptr,%1
3365         movx    a,@dptr
3366         orl     a,%5
3367         movx    @dptr,a
3368 } by {
3369         ;       Peephole 248.i  optimized or/and/or to xdata bitfield
3370         mov     dptr,%1
3371         movx    a,@dptr
3372         orl     a,%3
3373         movx    @dptr,a
3374         movx    a,@dptr
3375         anl     a,%4
3376         movx    @dptr,a
3377         movx    a,@dptr
3378         orl     a,%5
3379         movx    @dptr,a
3380 }
3381
3382 replace {
3383         mov     dptr,%1
3384         movx    a,@dptr
3385         anl     a,%3
3386         movx    @dptr,a
3387
3388         mov     dptr,%1
3389         movx    a,@dptr
3390         orl     a,%4
3391         movx    @dptr,a
3392
3393         mov     dptr,%1
3394         movx    a,@dptr
3395         anl     a,%5
3396         movx    @dptr,a
3397 } by {
3398         ;       Peephole 248.j  optimized and/or/and to xdata bitfield
3399         mov     dptr,%1
3400         movx    a,@dptr
3401         anl     a,%3
3402         movx    @dptr,a
3403         movx    a,@dptr
3404         orl     a,%4
3405         movx    @dptr,a
3406         movx    a,@dptr
3407         anl     a,%5
3408         movx    @dptr,a
3409 }
3410
3411 replace {
3412         mov     dptr,%1
3413         movx    a,@dptr
3414         orl     a,%3
3415         movx    @dptr,a
3416
3417         mov     dptr,%1
3418         movx    a,@dptr
3419         anl     a,%4
3420         movx    @dptr,a
3421 } by {
3422         ;       Peephole 248.k  optimized or/and to xdata bitfield
3423         mov     dptr,%1
3424         movx    a,@dptr
3425         orl     a,%3
3426         movx    @dptr,a
3427         movx    a,@dptr
3428         anl     a,%4
3429         movx    @dptr,a
3430 }
3431
3432 replace {
3433         mov     dptr,%1
3434         movx    a,@dptr
3435         anl     a,%3
3436         movx    @dptr,a
3437
3438         mov     dptr,%1
3439         movx    a,@dptr
3440         orl     a,%4
3441         movx    @dptr,a
3442 } by {
3443         ;       Peephole 248.l  optimized and/or to xdata bitfield
3444         mov     dptr,%1
3445         movx    a,@dptr
3446         anl     a,%3
3447         movx    @dptr,a
3448         movx    a,@dptr
3449         orl     a,%4
3450         movx    @dptr,a
3451 }
3452
3453 replace {
3454         mov     dptr,%1
3455         movx    a,@dptr
3456         xrl     a,%3
3457         movx    @dptr,a
3458
3459         mov     dptr,%1
3460         movx    a,@dptr
3461         xrl     a,%4
3462         movx    @dptr,a
3463 } by {
3464         ;       Peephole 248.m  optimized xor/xor to xdata bitfield
3465         mov     dptr,%1
3466         movx    a,@dptr
3467         xrl     a,%3
3468         movx    @dptr,a
3469         movx    a,@dptr
3470         xrl     a,%4
3471         movx    @dptr,a
3472 }
3473
3474
3475 replace {
3476         jnz     %1
3477 %1:
3478 } by {
3479         ;       Peephole 249.a   jump optimization
3480 } if labelRefCount %1 1
3481
3482 replace {
3483         jz      %1
3484 %1:
3485 } by {
3486         ;       Peephole 249.b   jump optimization
3487 } if labelRefCount %1 1
3488
3489
3490 // This allows non-interrupt and interrupt code to safely compete
3491 // for a resource without the non-interrupt code having to disable
3492 // interrupts:
3493 // volatile bit resource_is_free;
3494 // if( resource_is_free ) {
3495 //     resource_is_free=0; do_something; resource_is_free=1;
3496 // }
3497 replace {
3498         jnb     %1,%2
3499 %3:
3500         clr     %1
3501 } by {
3502         ;       Peephole 250.a  using atomic test and clear
3503         jbc     %1,%3
3504         sjmp    %2
3505 %3:
3506 } if labelRefCount %3 0
3507
3508 replace {
3509         jb      %1,%2
3510         ljmp    %3
3511 %2:
3512         clr     %1
3513 } by {
3514         ;       Peephole 250.b  using atomic test and clear
3515         jbc     %1,%2
3516         ljmp    %3
3517 %2:
3518 } if labelRefCount %2 1
3519
3520
3521 // not before peephole 250.b
3522 replace {
3523         ljmp    %5
3524 } by {
3525         ;       Peephole 251.a  replaced ljmp to ret with ret
3526         ret
3527 } if labelIsReturnOnly
3528
3529 // not before peephole 250.b
3530 replace {
3531         sjmp    %5
3532 } by {
3533         ;       Peephole 251.b  replaced sjmp to ret with ret
3534         ret
3535 } if labelIsReturnOnly
3536
3537 // applies to shifts.c and when accessing arrays with an unsigned integer index
3538 // saving 1 byte, 2 cycles
3539 replace {
3540         mov     r%1,%2
3541         mov     a,(%2 + 1)
3542         xch     a,r%1
3543         add     a,acc
3544         xch     a,r%1
3545         rlc     a
3546         mov     r%3,a
3547 } by {
3548         ;       Peephole 252    optimized left shift
3549         mov     a,%2
3550         add     a,acc
3551         mov     r%1,a
3552         mov     a,(%2 + 1)
3553         rlc     a
3554         mov     r%3,a
3555 }
3556
3557 // applies to: void test( char c ) { if( c ) func1(); else func2(); }
3558 replace {
3559         lcall   %1
3560         ret
3561 } by {
3562         ;       Peephole 253.a  replaced lcall/ret with ljmp
3563         ljmp    %1
3564 }
3565
3566 // applies to: void test( char c ) { if( c ) func1(); else func2(); }
3567 replace {
3568         lcall   %1
3569 %2:
3570         ret
3571 } by {
3572         ;       Peephole 253.b  replaced lcall/ret with ljmp
3573         ljmp    %1
3574 } if labelRefCount %2 0
3575
3576 // applies to f.e. scott-bool1.c
3577 replace {
3578         lcall   %1
3579 %2:
3580         ret
3581 } by {
3582         ;       Peephole 253.c  replaced lcall with ljmp
3583         ljmp    %1
3584 %2:
3585         ret
3586 }
3587
3588
3589 // applies to f.e. funptrs.c
3590 // saves one byte if %1 is a register or @register
3591 replace {
3592         mov     a,%1
3593         add     a,acc
3594 } by {
3595         ;       Peephole 254    optimized left shift
3596         mov     a,%1
3597         add     a,%1
3598 } if notVolatile %1
3599
3600 // applies to f.e. switch.c
3601 replace {
3602         clr     c
3603         mov     a,#%1
3604         subb    a,%2
3605         jc      %3
3606 %4:
3607         mov     a,%2
3608         add     a,%2
3609         add     a,%2
3610         mov     dptr,%5
3611         jmp     @a+dptr
3612 } by {
3613         ;       Peephole 255    optimized jump table index calculation
3614         mov     a,%2
3615         cjne    a,#(%1+0x01),.+1
3616         jnc     %3
3617 %4:
3618         add     a,%2
3619         add     a,%2
3620         mov     dptr,%5
3621         jmp     @a+dptr
3622 }
3623
3624 // applies to f.e. jump tables and scott-bool1.c.
3625 // similar peepholes can be constructed for other instructions
3626 // after which a flag or a register is known (like: djnz, cjne, jnc)
3627 replace {
3628         jc      %1
3629 %2:
3630         clr     c
3631 } by {
3632         ;       Peephole 256.a  removed redundant clr c
3633         jc      %1
3634 %2:
3635 } if labelRefCount %2 0
3636
3637 // applies to f.e. logf.c
3638 replace {
3639         jnz     %1
3640 %2:
3641         clr     a
3642 } by {
3643         ;       Peephole 256.b  removed redundant clr a
3644         jnz     %1
3645 %2:
3646 } if labelRefCount %2 0
3647
3648 // applies to f.e. bug-905492.c
3649 replace {
3650         jnz     %1
3651 %2:
3652         mov     %3,#0x00
3653 } by {
3654         ;       Peephole 256.c  loading %3 with zero from a
3655         jnz     %1
3656 %2:
3657         mov     %3,a
3658 } if labelRefCount %2 0
3659
3660 // applies to f.e. malloc.c
3661 replace {
3662         jnz     %1
3663 %2:
3664         mov     %4,%5
3665         mov     %3,#0x00
3666 } by {
3667         ;       Peephole 256.d  loading %3 with zero from a
3668         jnz     %1
3669 %2:
3670         mov     %4,%5
3671         mov     %3,a
3672 } if labelRefCount(%2 0),operandsNotRelated('a' %4)
3673
3674 replace {
3675         jnz     %1
3676 %2:
3677         mov     %4,%5
3678         mov     %6,%7
3679         mov     %3,#0x00
3680 } by {
3681         ;       Peephole 256.e  loading %3 with zero from a
3682         jnz     %1
3683 %2:
3684         mov     %4,%5
3685         mov     %6,%7
3686         mov     %3,a
3687 } if labelRefCount(%2 0),operandsNotRelated('a' %4 %6)
3688
3689 replace {
3690         jnz     %1
3691 %2:
3692         mov     %4,%5
3693         mov     %6,%7
3694         mov     %8,%9
3695         mov     %3,#0x00
3696 } by {
3697         ;       Peephole 256.f  loading %2 with zero from a
3698         jnz     %1
3699 %2:
3700         mov     %4,%5
3701         mov     %6,%7
3702         mov     %8,%9
3703         mov     %3,a
3704 } if labelRefCount(%2 0),operandsNotRelated('a' %4 %6 %8)
3705
3706
3707 // unsigned char i=8; do{ } while(--i != 0);
3708 // this currently only applies if i is kept in a register
3709 replace {
3710         dec     %1
3711         cjne    %1,#0x00,%2
3712 } by {
3713         ;       Peephole 257    optimized decrement with compare
3714         djnz    %1,%2
3715 } if notVolatile %1
3716
3717
3718 // in_byte<<=1; if(in_bit) in_byte|=1;
3719 // helps f.e. reading data on a 3-wire (SPI) bus
3720 replace {
3721         mov     a,%1
3722         add     a,%1
3723         mov     %1,a
3724         jnb     %2,%3
3725 %4:
3726         orl     %1,#0x01
3727 %3:
3728 } by {
3729         ;       Peephole 258.a  optimized bitbanging
3730         mov     a,%1
3731         mov     c,%2
3732         addc    a,%1
3733         mov     %1,a
3734 %4:
3735 %3:
3736 } if notVolatile %1
3737
3738 // in_byte<<=1; if(in_bit) in_byte|=1;
3739 replace {
3740         mov     a,r%1
3741         add     a,r%1
3742         mov     r%1,a
3743         jnb     %2,%3
3744 %4:
3745         orl     ar%1,#0x01
3746 %3:
3747 } by {
3748         ;       Peephole 258.b  optimized bitbanging
3749         mov     a,r%1
3750         mov     c,%2
3751         addc    a,r%1
3752         mov     r%1,a
3753 %4:
3754 %3:
3755 }
3756
3757 // in_byte>>=1; if(in_bit) in_byte|=0x80;
3758 replace {
3759         mov     a,%1
3760         clr     c
3761         rrc     a
3762         mov     %1,a
3763         jnb     %2,%3
3764 %4:
3765         orl     %1,#0x80
3766 %3:
3767 } by {
3768         ;       Peephole 258.c  optimized bitbanging
3769         mov     a,%1
3770         mov     c,%2
3771         rrc     a
3772         mov     %1,a
3773 %4:
3774 %3:
3775 } if notVolatile %1
3776
3777 // in_byte>>=1; if(in_bit) in_byte|=0x80;
3778 replace {
3779         mov     a,r%1
3780         clr     c
3781         rrc     a
3782         mov     r%1,a
3783         jnb     %2,%3
3784 %4:
3785         orl     ar%1,#0x80
3786 %3:
3787 } by {
3788         ;       Peephole 258.d  optimized bitbanging
3789         mov     a,r%1
3790         mov     c,%2
3791         rrc     a
3792         mov     r%1,a
3793 %4:
3794 %3:
3795 }
3796
3797 // out_bit=out_byte&0x80; out_byte<<=1;
3798 // helps f.e. writing data on a 3-wire (SPI) bus
3799 replace {
3800         mov     a,%1
3801         rlc     a
3802         mov     %2,c
3803         mov     a,%1
3804         add     a,%1
3805         mov     %1,a
3806 } by {
3807         ;       Peephole 258.e  optimized bitbanging
3808         mov     a,%1
3809         add     a,%1
3810         mov     %2,c
3811         mov     %1,a
3812 } if notVolatile %1
3813
3814 // out_bit=out_byte&0x01; out_byte>>=1;
3815 replace {
3816         mov     a,%1
3817         rrc     a
3818         mov     %2,c
3819         mov     a,%1
3820         clr     c
3821         rrc     a
3822         mov     %1,a
3823 } by {
3824         ;       Peephole 258.f  optimized bitbanging
3825         mov     a,%1
3826         clr     c
3827         rrc     a
3828         mov     %2,c
3829         mov     %1,a
3830 } if notVolatile %1
3831
3832 // Peepholes 259.x are not compatible with peepholex 250.x
3833 // Peepholes 250.x add jumps to a previously unused label. As the
3834 // labelRefCount is not increased, peepholes 259.x are (mistakenly) applied.
3835 // (Mail on sdcc-devel 2004-10-25)
3836 // Note: Peepholes 193..199, 251 remove jumps to previously used labels without
3837 // decreasing labelRefCount (less dangerous - this f.e. leads to 253.c being
3838 // applied instead of 253.b))
3839 //
3840 // applies to f.e. vprintf.c
3841 //replace {
3842 //      sjmp    %1
3843 //%2:
3844 //      ret
3845 //} by {
3846 //      sjmp    %1
3847 //      ;       Peephole 259.a  removed redundant label %2 and ret
3848 //      ;
3849 //} if labelRefCount %2 0
3850
3851 // applies to f.e. gets.c
3852 //replace {
3853 //      ljmp    %1
3854 //%2:
3855 //      ret
3856 //} by {
3857 //      ljmp    %1
3858 //      ;       Peephole 259.b  removed redundant label %2 and ret
3859 //      ;
3860 //} if labelRefCount %2 0
3861
3862 // optimizing jumptables
3863 // Please note: to enable peephole 260.x you currently have to set
3864 // the environment variable SDCC_SJMP_JUMPTABLE
3865 replace {
3866         add     a,%1
3867         mov     dptr,#%2
3868         jmp     @a+dptr
3869 %2:
3870         ljmp    %5
3871         ljmp    %6
3872         ljmp    %7
3873         ljmp    %8
3874 %3:
3875 } by {
3876         ;       Peephole 260.a  used sjmp in jumptable
3877         mov     dptr,#%2
3878         jmp     @a+dptr
3879 %2:
3880         sjmp    %5
3881         sjmp    %6
3882         sjmp    %7
3883         sjmp    %8
3884 %3:
3885 } if labelJTInRange
3886
3887 // optimizing jumptables
3888 replace {
3889         add     a,%1
3890         mov     dptr,#%2
3891         jmp     @a+dptr
3892 %2:
3893         ljmp    %5
3894         ljmp    %6
3895         ljmp    %7
3896         ljmp    %8
3897         ljmp    %9
3898 %3:
3899 } by {
3900         ;       Peephole 260.b  used sjmp in jumptable
3901         mov     dptr,#%2
3902         jmp     @a+dptr
3903 %2:
3904         sjmp    %5
3905         sjmp    %6
3906         sjmp    %7
3907         sjmp    %8
3908         sjmp    %9
3909 %3:
3910 } if labelJTInRange
3911
3912 // optimizing jumptables
3913 replace {
3914         add     a,%1
3915         mov     dptr,#%2
3916         jmp     @a+dptr
3917 %2:
3918         ljmp    %5
3919         ljmp    %6
3920         ljmp    %7
3921         ljmp    %8
3922         ljmp    %9
3923         ljmp    %10
3924 %3:
3925 } by {
3926         ;       Peephole 260.c  used sjmp in jumptable
3927         mov     dptr,#%2
3928         jmp     @a+dptr
3929 %2:
3930         sjmp    %5
3931         sjmp    %6
3932         sjmp    %7
3933         sjmp    %8
3934         sjmp    %9
3935         sjmp    %10
3936 %3:
3937 } if labelJTInRange
3938
3939 // optimizing jumptables
3940 replace {
3941         add     a,%1
3942         mov     dptr,#%2
3943         jmp     @a+dptr
3944 %2:
3945         ljmp    %5
3946         ljmp    %6
3947         ljmp    %7
3948         ljmp    %8
3949         ljmp    %9
3950         ljmp    %10
3951         ljmp    %11
3952 %3:
3953 } by {
3954         ;       Peephole 260.d  used sjmp in jumptable
3955         mov     dptr,#%2
3956         jmp     @a+dptr
3957 %2:
3958         sjmp    %5
3959         sjmp    %6
3960         sjmp    %7
3961         sjmp    %8
3962         sjmp    %9
3963         sjmp    %10
3964         sjmp    %11
3965 %3:
3966 } if labelJTInRange
3967
3968 // optimizing jumptables
3969 replace {
3970         add     a,%1
3971         mov     dptr,#%2
3972         jmp     @a+dptr
3973 %2:
3974         ljmp    %5
3975         ljmp    %6
3976         ljmp    %7
3977         ljmp    %8
3978         ljmp    %9
3979         ljmp    %10
3980         ljmp    %11
3981         ljmp    %12
3982 %3:
3983 } by {
3984         ;       Peephole 260.e  used sjmp in jumptable
3985         mov     dptr,#%2
3986         jmp     @a+dptr
3987 %2:
3988         sjmp    %5
3989         sjmp    %6
3990         sjmp    %7
3991         sjmp    %8
3992         sjmp    %9
3993         sjmp    %10
3994         sjmp    %11
3995         sjmp    %12
3996 %3:
3997 } if labelJTInRange
3998
3999 // optimizing jumptables
4000 replace {
4001         add     a,%1
4002         mov     dptr,#%2
4003         jmp     @a+dptr
4004 %2:
4005         ljmp    %5
4006         ljmp    %6
4007         ljmp    %7
4008         ljmp    %8
4009         ljmp    %9
4010         ljmp    %10
4011         ljmp    %11
4012         ljmp    %12
4013
4014         ljmp    %13
4015 %3:
4016 } by {
4017         ;       Peephole 260.f  used sjmp in jumptable
4018         mov     dptr,#%2
4019         jmp     @a+dptr
4020 %2:
4021         sjmp    %5
4022         sjmp    %6
4023         sjmp    %7
4024         sjmp    %8
4025         sjmp    %9
4026         sjmp    %10
4027         sjmp    %11
4028         sjmp    %12
4029
4030         sjmp    %13
4031 %3:
4032 } if labelJTInRange
4033
4034 // optimizing jumptables
4035 replace {
4036         add     a,%1
4037         mov     dptr,#%2
4038         jmp     @a+dptr
4039 %2:
4040         ljmp    %5
4041         ljmp    %6
4042         ljmp    %7
4043         ljmp    %8
4044         ljmp    %9
4045         ljmp    %10
4046         ljmp    %11
4047         ljmp    %12
4048
4049         ljmp    %13
4050         ljmp    %14
4051 %3:
4052 } by {
4053         ;       Peephole 260.g  used sjmp in jumptable
4054         mov     dptr,#%2
4055         jmp     @a+dptr
4056 %2:
4057         sjmp    %5
4058         sjmp    %6
4059         sjmp    %7
4060         sjmp    %8
4061         sjmp    %9
4062         sjmp    %10
4063         sjmp    %11
4064         sjmp    %12
4065
4066         sjmp    %13
4067         sjmp    %14
4068 %3:
4069 } if labelJTInRange
4070
4071 // optimizing jumptables
4072 replace {
4073         add     a,%1
4074         mov     dptr,#%2
4075         jmp     @a+dptr
4076 %2:
4077         ljmp    %5
4078         ljmp    %6
4079         ljmp    %7
4080         ljmp    %8
4081         ljmp    %9
4082         ljmp    %10
4083         ljmp    %11
4084         ljmp    %12
4085
4086         ljmp    %13
4087         ljmp    %14
4088         ljmp    %15
4089 %3:
4090 } by {
4091         ;       Peephole 260.h  used sjmp in jumptable
4092         mov     dptr,#%2
4093         jmp     @a+dptr
4094 %2:
4095         sjmp    %5
4096         sjmp    %6
4097         sjmp    %7
4098         sjmp    %8
4099         sjmp    %9
4100         sjmp    %10
4101         sjmp    %11
4102         sjmp    %12
4103
4104         sjmp    %13
4105         sjmp    %14
4106         sjmp    %15
4107 %3:
4108 } if labelJTInRange
4109
4110 // optimizing jumptables
4111 replace {
4112         add     a,%1
4113         mov     dptr,#%2
4114         jmp     @a+dptr
4115 %2:
4116         ljmp    %5
4117         ljmp    %6
4118         ljmp    %7
4119         ljmp    %8
4120         ljmp    %9
4121         ljmp    %10
4122         ljmp    %11
4123         ljmp    %12
4124
4125         ljmp    %13
4126         ljmp    %14
4127         ljmp    %15
4128         ljmp    %16
4129 %3:
4130 } by {
4131         ;       Peephole 260.i  used sjmp in jumptable
4132         mov     dptr,#%2
4133         jmp     @a+dptr
4134 %2:
4135         sjmp    %5
4136         sjmp    %6
4137         sjmp    %7
4138         sjmp    %8
4139         sjmp    %9
4140         sjmp    %10
4141         sjmp    %11
4142         sjmp    %12
4143
4144         sjmp    %13
4145         sjmp    %14
4146         sjmp    %15
4147         sjmp    %16
4148 %3:
4149 } if labelJTInRange
4150
4151 // optimizing jumptables
4152 replace {
4153         add     a,%1
4154         mov     dptr,#%2
4155         jmp     @a+dptr
4156 %2:
4157         ljmp    %5
4158         ljmp    %6
4159         ljmp    %7
4160         ljmp    %8
4161         ljmp    %9
4162         ljmp    %10
4163         ljmp    %11
4164         ljmp    %12
4165
4166         ljmp    %13
4167         ljmp    %14
4168         ljmp    %15
4169         ljmp    %16
4170         ljmp    %17
4171 %3:
4172 } by {
4173         ;       Peephole 260.j  used sjmp in jumptable
4174         mov     dptr,#%2
4175         jmp     @a+dptr
4176 %2:
4177         sjmp    %5
4178         sjmp    %6
4179         sjmp    %7
4180         sjmp    %8
4181         sjmp    %9
4182         sjmp    %10
4183         sjmp    %11
4184         sjmp    %12
4185
4186         sjmp    %13
4187         sjmp    %14
4188         sjmp    %15
4189         sjmp    %16
4190         sjmp    %17
4191 %3:
4192 } if labelJTInRange
4193
4194 // optimizing jumptables
4195 replace {
4196         add     a,%1
4197         mov     dptr,#%2
4198         jmp     @a+dptr
4199 %2:
4200         ljmp    %5
4201         ljmp    %6
4202         ljmp    %7
4203         ljmp    %8
4204         ljmp    %9
4205         ljmp    %10
4206         ljmp    %11
4207         ljmp    %12
4208
4209         ljmp    %13
4210         ljmp    %14
4211         ljmp    %15
4212         ljmp    %16
4213         ljmp    %17
4214         ljmp    %18
4215 %3:
4216 } by {
4217         ;       Peephole 260.k  used sjmp in jumptable
4218         mov     dptr,#%2
4219         jmp     @a+dptr
4220 %2:
4221         sjmp    %5
4222         sjmp    %6
4223         sjmp    %7
4224         sjmp    %8
4225         sjmp    %9
4226         sjmp    %10
4227         sjmp    %11
4228         sjmp    %12
4229
4230         sjmp    %13
4231         sjmp    %14
4232         sjmp    %15
4233         sjmp    %16
4234         sjmp    %17
4235         sjmp    %18
4236 %3:
4237 } if labelJTInRange
4238
4239 // optimizing jumptables
4240 replace {
4241         add     a,%1
4242         mov     dptr,#%2
4243         jmp     @a+dptr
4244 %2:
4245         ljmp    %5
4246         ljmp    %6
4247         ljmp    %7
4248         ljmp    %8
4249         ljmp    %9
4250         ljmp    %10
4251         ljmp    %11
4252         ljmp    %12
4253
4254         ljmp    %13
4255         ljmp    %14
4256         ljmp    %15
4257         ljmp    %16
4258         ljmp    %17
4259         ljmp    %18
4260         ljmp    %19
4261 %3:
4262 } by {
4263         ;       Peephole 260.l  used sjmp in jumptable
4264         mov     dptr,#%2
4265         jmp     @a+dptr
4266 %2:
4267         sjmp    %5
4268         sjmp    %6
4269         sjmp    %7
4270         sjmp    %8
4271         sjmp    %9
4272         sjmp    %10
4273         sjmp    %11
4274         sjmp    %12
4275
4276         sjmp    %13
4277         sjmp    %14
4278         sjmp    %15
4279         sjmp    %16
4280         sjmp    %17
4281         sjmp    %18
4282         sjmp    %19
4283 %3:
4284 } if labelJTInRange
4285
4286 // optimizing jumptables
4287 replace {
4288         add     a,%1
4289         mov     dptr,#%2
4290         jmp     @a+dptr
4291 %2:
4292         ljmp    %5
4293         ljmp    %6
4294         ljmp    %7
4295         ljmp    %8
4296         ljmp    %9
4297         ljmp    %10
4298         ljmp    %11
4299         ljmp    %12
4300
4301         ljmp    %13
4302         ljmp    %14
4303         ljmp    %15
4304         ljmp    %16
4305         ljmp    %17
4306         ljmp    %18
4307         ljmp    %19
4308         ljmp    %20
4309 %3:
4310 } by {
4311         ;       Peephole 260.m  used sjmp in jumptable
4312         mov     dptr,#%2
4313         jmp     @a+dptr
4314 %2:
4315         sjmp    %5
4316         sjmp    %6
4317         sjmp    %7
4318         sjmp    %8
4319         sjmp    %9
4320         sjmp    %10
4321         sjmp    %11
4322         sjmp    %12
4323
4324         sjmp    %13
4325         sjmp    %14
4326         sjmp    %15
4327         sjmp    %16
4328         sjmp    %17
4329         sjmp    %18
4330         sjmp    %19
4331         sjmp    %20
4332 %3:
4333 } if labelJTInRange
4334
4335 // applies to: a = (a << 1) | (a >> 15);
4336 replace {
4337         mov     a,%1
4338         rlc     a
4339         mov     %1,a
4340         mov     a,%2
4341         rlc     a
4342         mov     %2,a
4343         mov     a,%1
4344         mov     acc.0,c
4345         mov     %1,a
4346 } by {
4347         ;       Peephole 261.a  optimized left rol
4348         mov     a,%1
4349         rlc     a
4350         xch     a,%2
4351         rlc     a
4352         xch     a,%2
4353         mov     acc.0,c
4354         mov     %1,a
4355 }
4356
4357 // applies to: a = (a << 15) | (a >> 1);
4358 replace {
4359         mov     a,%1
4360         rrc     a
4361         mov     %1,a
4362         mov     a,%2
4363         rrc     a
4364         mov     %2,a
4365         mov     a,%1
4366         mov     acc.7,c
4367         mov     %1,a
4368 } by {
4369         ;       Peephole 261.b  optimized right rol
4370         mov     a,%1
4371         rrc     a
4372         xch     a,%2
4373         rrc     a
4374         xch     a,%2
4375         mov     acc.7,c
4376         mov     %1,a
4377 }