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