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