an occasionally useful rule
[fw/sdcc] / src / ds390 / 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 restart {
21         xch  a,%1
22         xch  a,%1
23 } by {
24         ; Peephole 2.a   removed redundant xch xch
25 }
26
27 replace restart {
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 restart {
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
61
62 replace {
63         mov  %1,a
64         mov  dptr,#%2
65         mov  a,%1
66         movx @dptr,a
67 } by {
68         ; Peephole 100   removed redundant mov
69         mov  %1,a
70         mov  dptr,#%2
71         movx @dptr,a
72 }
73
74 replace {
75         mov  a,acc
76 } by {
77         ;  Peephole 100.a   removed redundant mov
78 }
79
80 replace {
81         mov  a,%1
82         movx @dptr,a
83         inc  dptr
84         mov  a,%1
85         movx @dptr,a
86 } by {
87         ; Peephole 101   removed redundant mov
88         mov  a,%1
89         movx @dptr,a
90         inc  dptr
91         movx @dptr,a
92 }
93
94 replace {
95         mov  %1,%2
96         ljmp %3
97 %4:
98         mov  %1,%5
99 %3:
100         mov  dpl,%1
101 %7:
102         mov  sp,bp
103         pop  bp
104 } by {
105         ; Peephole 102   removed redundant mov
106         mov  dpl,%2
107         ljmp %3
108 %4:
109         mov  dpl,%5
110 %3:
111 %7:
112         mov  sp,bp
113         pop  bp
114 }
115
116 replace {
117         mov  %1,%2
118         ljmp %3
119 %4:
120         mov  a%1,%5
121 %3:
122         mov  dpl,%1
123 %7:
124         mov  sp,bp
125         pop  bp
126 } by {
127         ; Peephole 103   removed redundant mov
128         mov  dpl,%2
129         ljmp %3
130 %4:
131         mov  dpl,%5
132 %3:
133 %7:
134         mov  sp,bp
135         pop  bp
136 }
137
138 replace {
139         mov  a,bp
140         clr  c
141         add  a,#0x01
142         mov  r%1,a
143 } by {
144         ; Peephole 104   optimized increment (acc not set to r%1, flags undefined)
145         mov  r%1,bp
146         inc  r%1
147 }
148
149 replace {
150         mov  %1,a
151         mov  a,%1
152 } by {
153         ; Peephole 105   removed redundant mov
154         mov  %1,a
155 }
156
157 replace {
158         mov  %1,a
159         clr  c
160         mov  a,%1
161 } by {
162         ; Peephole 106   removed redundant mov 
163         mov  %1,a
164         clr  c
165 }
166
167 replace {
168         ljmp %1
169 %1:
170 } by {
171         ; Peephole 107   removed redundant ljmp
172 %1:
173 }
174
175 replace {
176         jc   %1
177         ljmp %5
178 %1:
179 } by {
180         ; Peephole 108   removed ljmp by inverse jump logic
181         jnc  %5
182 %1:
183 } if labelInRange
184
185 replace {
186         jz   %1
187         ljmp %5
188 %1:
189 } by {
190         ; Peephole 109   removed ljmp by inverse jump logic
191         jnz  %5
192 %1:
193 } if labelInRange
194
195 replace {
196         jnz  %1
197         ljmp %5
198 %1:
199 } by {
200         ; Peephole 110   removed ljmp by inverse jump logic
201         jz  %5
202 %1:
203 } if labelInRange
204
205 replace {
206         jb   %1,%2
207         ljmp %5
208 %2:
209 } by {
210         ; Peephole 111   removed ljmp by inverse jump logic
211         jnb  %1,%5
212 %2:
213 } if labelInRange
214
215 replace {
216         jnb  %1,%2
217         ljmp %5
218 %2:
219 } by {
220        ; Peephole 112   removed ljmp by inverse jump logic
221         jb   %1,%5
222 %2:
223 } if labelInRange
224
225 replace {
226         ljmp %5
227 %1:
228 } by {
229         ; Peephole 132   changed ljmp to sjmp
230         sjmp %5
231 %1:
232 } if labelInRange
233
234
235 replace {
236         clr  a
237         cjne %1,%2,%3
238         cpl  a
239 %3:
240         rrc  a
241         mov  %4,c
242 } by {
243         ; Peephole 113   optimized misc sequence
244         clr  %4
245         cjne %1,%2,%3
246         setb %4
247 %3:
248 } if labelRefCount %3 1
249
250 replace {
251         clr  a
252         cjne %1,%2,%3
253         cjne %10,%11,%3
254         cpl  a
255 %3:
256         rrc  a
257         mov  %4,c
258 } by {
259         ; Peephole 114   optimized misc sequence
260         clr  %4
261         cjne %1,%2,%3
262         cjne %10,%11,%3
263         setb %4
264 %3:
265 } if labelRefCount %3 2
266
267 replace {
268         clr  a
269         cjne %1,%2,%3
270         cpl  a
271 %3:
272         jnz  %4
273 } by {
274         ; Peephole 115   jump optimization 
275         cjne %1,%2,%3
276         sjmp %4
277 %3:
278 } if labelRefCount %3 1
279
280 replace {
281         clr  a
282         cjne %1,%2,%3
283         cjne %9,%10,%3
284         cpl  a
285 %3:
286         jnz  %4
287 } by {
288         ; Peephole 116   jump optimization
289         cjne %1,%2,%3
290         cjne %9,%10,%3
291         sjmp %4
292 %3:
293 } if labelRefCount %3 2
294
295 replace {
296         clr  a
297         cjne %1,%2,%3
298         cjne %9,%10,%3
299         cjne %11,%12,%3
300         cpl  a
301 %3:
302         jnz %4
303 } by {
304         ; Peephole 117   jump optimization
305         cjne %1,%2,%3
306         cjne %9,%10,%3
307         cjne %11,%12,%3
308         sjmp %4
309 %3:
310 } if labelRefCount %3 3
311
312 replace {
313         clr  a
314         cjne %1,%2,%3
315         cjne %9,%10,%3
316         cjne %11,%12,%3
317         cjne %13,%14,%3
318         cpl  a
319 %3:
320         jnz %4
321 } by {
322         ; Peephole 118   jump optimization
323         cjne %1,%2,%3
324         cjne %9,%10,%3
325         cjne %11,%12,%3
326         cjne %13,%14,%3
327         sjmp %4
328 %3:
329 } if labelRefCount %3 4
330
331 replace {
332         mov  a,#0x01
333         cjne %1,%2,%3
334         clr  a
335 %3:
336         jnz  %4
337 } by {
338         ; Peephole 119   jump optimization
339         cjne %1,%2,%4
340 %3:
341 } if labelRefCount %3 1
342
343 replace {
344         mov  a,#0x01
345         cjne %1,%2,%3
346         cjne %10,%11,%3
347         clr  a
348 %3:
349         jnz  %4
350 } by {
351         ; Peephole 120   jump optimization
352         cjne %1,%2,%4
353         cjne %10,%11,%4
354 %3:
355 } if labelRefCount %3 2
356
357 replace {
358         mov  a,#0x01
359         cjne %1,%2,%3
360         cjne %10,%11,%3
361         cjne %12,%13,%3
362         clr  a
363 %3:
364         jnz  %4
365 } by {
366         ; Peephole 121   jump optimization
367         cjne %1,%2,%4
368         cjne %10,%11,%4
369         cjne %12,%13,%4
370 %3:
371 } if labelRefCount %3 3
372
373 replace {
374         mov  a,#0x01
375         cjne %1,%2,%3
376         cjne %10,%11,%3
377         cjne %12,%13,%3
378         cjne %14,%15,%3
379         clr  a
380 %3:
381         jnz  %4
382 } by {
383         ; Peephole 122   jump optimization
384         cjne %1,%2,%4
385         cjne %10,%11,%4
386         cjne %12,%13,%4
387         cjne %14,%15,%4
388 %3:
389 } if labelRefCount %3 4
390
391 replace {
392         mov  a,#0x01
393         cjne %1,%2,%3
394         clr  a
395 %3:
396         jz   %4
397 } by {
398         ; Peephole 123   jump optimization
399         cjne %1,%2,%3
400         smp  %4
401 %3:
402 } if labelRefCount %3 1
403
404 replace {
405         mov  a,#0x01
406         cjne %1,%2,%3
407         cjne %10,%11,%3
408         clr  a
409 %3:
410         jz   %4
411 } by {
412         ; Peephole 124   jump optimization
413         cjne %1,%2,%3
414         cjne %10,%11,%3
415         sjmp  %4
416 %3:
417 } if labelRefCount %3 2
418
419 replace {
420         mov  a,#0x01
421         cjne %1,%2,%3
422         cjne %10,%11,%3
423         cjne %12,%13,%3
424         clr  a
425 %3:
426         jz   %4
427 } by {
428         ; Peephole 125   jump optimization
429         cjne %1,%2,%3
430         cjne %10,%11,%3
431         cjne %12,%13,%3
432         sjmp %4
433 %3:
434 } if labelRefCount %3 3
435
436 replace {
437         mov  a,#0x01
438         cjne %1,%2,%3
439         cjne %10,%11,%3
440         cjne %12,%13,%3
441         cjne %14,%15,%3
442         clr  a
443 %3:
444         jz   %4
445 } by {
446         ; Peephole 126   jump optimization
447         cjne %1,%2,%3
448         cjne %10,%11,%3
449         cjne %12,%13,%3
450         cjne %14,%15,%3
451         sjmp %4
452 %3:
453 } if labelRefCount %3 4
454
455 replace {
456         push psw
457         mov  psw,%1
458         push bp
459         mov  bp,%2
460 %3:
461         mov  %2,bp
462         pop  bp
463         pop  psw
464         ret
465 } by {
466         ; Peephole 127   removed misc sequence
467         ret
468 } if labelRefCount %3 0
469
470 replace {
471         clr  a
472         rlc  a
473         jz   %1
474 } by {
475         ; Peephole 128   jump optimization
476         jnc  %1
477 }
478
479 replace {
480         clr  a
481         rlc  a
482         jnz  %1
483 } by {
484         ; Peephole 129   jump optimization
485         jc   %1
486 }
487
488 replace { 
489         mov  r%1,@r%2
490 } by {
491         ; Peephole 130   changed target address mode r%1 to ar%1
492         mov  ar%1,@r%2
493 }
494
495 replace { 
496         mov  a,%1
497         subb a,#0x01
498         mov  %2,a
499         mov  %1,%2
500 } by {
501         ; Peephole 131   optimized decrement (not caring for c)
502         dec  %1         
503         mov  %2,%1      
504 }
505
506 replace {
507         mov  r%1,%2
508         mov  ar%3,@r%1
509         inc  r%3
510         mov  r%4,%2
511         mov  @r%4,ar%3
512 } by {
513         ; Peephole 133   removed redundant moves
514         mov  r%1,%2
515         inc  @r%1
516         mov  ar%3,@r%1
517 }
518
519 replace {
520         mov  r%1,%2
521         mov  ar%3,@r%1
522         dec  r%3
523         mov  r%4,%2
524         mov  @r%4,ar%3
525 } by {
526         ; Peephole 134   removed redundant moves
527         mov  r%1,%2
528         dec  @r%1
529         mov  ar%3,@r%1
530 }
531
532 replace {
533         mov  r%1,a
534         mov  a,r%2
535         orl  a,r%1
536 } by {
537         ; Peephole 135   removed redundant mov
538         mov  r%1,a
539         orl  a,r%2
540 }
541
542 replace {
543         mov  %1,a
544         mov  dpl,%2
545         mov  dph,%3
546         mov  dpx,%4
547         mov  a,%1
548 } by {
549         ; Peephole 136a   removed redundant moves
550         mov  %1,a
551         mov  dpl,%2
552         mov  dph,%3
553         mov  dpx,%4
554 } if 24bitMode
555
556 replace {
557         mov  %1,a
558         mov  dpl,%2
559         mov  dph,%3
560         mov  a,%1
561 } by {
562         ; Peephole 136   removed redundant moves
563         mov  %1,a
564         mov  dpl,%2
565         mov  dph,%3
566 }
567
568 // WTF? Doesn't look sensible to me...
569 //replace {
570 //        mov  b,#0x00
571 //        mov  a,%1
572 //        cjne %2,%3,%4
573 //        mov  b,#0x01
574 //%4:
575 //        mov  a,b
576 //        jz   %5
577 //} by {
578 //        ; Peephole 137   optimized misc jump sequence
579 //        mov  a,%1
580 //        cjne %2,%3,%5
581 //%4:
582 //} if labelRefCount %4 1
583 //
584 //replace {
585 //        mov  b,#0x00
586 //        mov  a,%1
587 //        cjne %2,%3,%4
588 //        mov  b,#0x01
589 //%4:
590 //        mov  a,b
591 //        jnz  %5
592 //} by {
593 //        ; Peephole 138   optimized misc jump sequence
594 //        mov  a,%1
595 //        cjne %2,%3,%4
596 //        sjmp %5
597 //%4:
598 //} if labelRefCount %4 1
599
600 replace {
601         mov  r%1,a
602         anl  ar%1,%2
603         mov  a,r%1
604 } by {
605         ; Peephole 139   removed redundant mov
606         anl  a,%2
607         mov  r%1,a
608 }
609
610 replace {
611         mov  r%1,a
612         orl  ar%1,%2
613         mov  a,r%1
614 } by {
615         ; Peephole 140   removed redundant mov
616         orl  a,%2
617         mov  r%1,a }
618
619 replace {
620         mov  r%1,a
621         xrl  ar%1,%2
622         mov  a,r%1
623 } by {
624         ; Peephole 141   removed redundant mov
625         xrl  a,%2
626         mov  r%1,a
627 }
628
629 replace {
630         mov  r%1,a
631         mov  r%2,ar%1
632         mov  ar%1,@r%2
633 } by {
634         ; Peephole 142   removed redundant moves
635         mov  r%2,a
636         mov  ar%1,@r%2
637 }
638
639 replace {
640         rlc  a
641         mov  acc.0,c
642 } by {
643         ; Peephole 143   converted rlc to rl
644         rl   a
645 }
646
647 replace {
648         rrc  a
649         mov  acc.7,c
650 } by {
651         ; Peephole 144   converted rrc to rc
652         rr   a
653 }
654
655 replace {
656         clr  c
657         addc a,%1
658 } by {
659         ; Peephole 145   changed to add without carry  
660         add  a,%1
661 }
662
663 replace {
664         clr  c
665         mov  a,%1
666         addc a,%2
667 } by {
668         ; Peephole 146   changed to add without carry
669         mov  a,%1
670         add  a,%2
671 }
672
673 replace {
674         orl  r%1,a
675 } by {
676         ; Peephole 147   changed target address mode r%1 to ar%1
677         orl  ar%1,a
678 }
679
680 replace {
681         anl  r%1,a
682 } by {
683         ; Peephole 148   changed target address mode r%1 to ar%1
684         anl  ar%1,a
685 }
686
687 replace {
688         xrl  r%1,a
689 } by {
690         ; Peephole 149   changed target address mode r%1 to ar%1
691         xrl  ar%1,a
692 }
693
694 replace {
695         mov  %1,dpl
696         mov  dpl,%1
697 %9:
698         ret
699 } by {
700         ; Peephole 150   removed misc moves via dpl before return
701 %9:
702         ret
703 }
704
705 replace {
706         mov  %1,dpl
707         mov  %2,dph
708         mov  dpl,%1
709         mov  dph,%2
710 %9:
711         ret
712 } by {
713         ; Peephole 151   removed misc moves via dph, dpl before return
714 %9:
715         ret
716 }
717
718 replace {
719         mov  %1,dpl
720         mov  %2,dph
721         mov  dpl,%1
722 %9:
723         ret
724 } by {
725         ; Peephole 152   removed misc moves via dph, dpl before return
726 %9:
727         ret
728 }
729
730 replace {
731         mov  %1,dpl
732         mov  %2,dph
733         mov  %3,b
734         mov  dpl,%1
735         mov  dph,%2
736         mov  b,%3
737 %9:
738         ret
739 } by {
740         ; Peephole 153   removed misc moves via dph, dpl, b before return
741 %9:
742         ret
743 }
744
745 replace {
746         mov  %1,dpl
747         mov  %2,dph
748         mov  %3,b
749         mov  dpl,%1
750 %9:
751         ret
752 } by {
753         ; Peephole 154   removed misc moves via dph, dpl, b before return
754 %9:
755         ret
756 }
757
758 replace {
759         mov  %1,dpl
760         mov  %2,dph
761         mov  %3,b
762         mov  dpl,%1
763         mov  dph,%2
764 %9:
765         ret
766 } by {
767         ; Peephole 155   removed misc moves via dph, dpl, b before return
768 %9:
769         ret
770 }
771
772 replace {
773         mov  %1,dpl
774         mov  %2,dph
775         mov  %3,b
776         mov  %4,a
777         mov  dpl,%1
778         mov  dph,%2
779         mov  b,%3
780         mov  a,%4
781 %9:
782         ret
783 } by {
784         ; Peephole 156   removed misc moves via dph, dpl, b, a before return
785 %9:
786         ret
787 }
788
789 replace {
790         mov  %1,dpl
791         mov  %2,dph
792         mov  %3,b
793         mov  %4,a
794         mov  dpl,%1
795         mov  dph,%2
796 %9:
797         ret
798 } by {
799         ; Peephole 157   removed misc moves via dph, dpl, b, a before return
800 %9:
801         ret
802 }
803
804 replace {
805         mov  %1,dpl
806         mov  %2,dph
807         mov  %3,b
808         mov  %4,a
809         mov  dpl,%1
810 %9:
811         ret } by {
812         ; Peephole 158   removed misc moves via dph, dpl, b, a before return
813 %9:
814         ret }
815
816 replace {
817         mov  %1,#%2
818         xrl  %1,#0x80
819 } by {
820         ; Peephole 159   avoided xrl during execution
821         mov  %1,#(%2 ^ 0x80)
822 }
823
824 replace {
825         jnc  %1
826         sjmp %2
827 %1:
828 } by {
829         ; Peephole 160   removed sjmp by inverse jump logic
830         jc   %2
831 %1:}
832
833 replace {
834         jc   %1
835         sjmp %2
836 %1:
837 } by {
838         ; Peephole 161   removed sjmp by inverse jump logic
839         jnc  %2
840 %1:}
841
842 replace {
843         jnz  %1
844         sjmp %2
845 %1:
846 } by {
847         ; Peephole 162   removed sjmp by inverse jump logic
848         jz   %2
849 %1:}
850
851 replace {
852         jz   %1
853         sjmp %2
854 %1:
855 } by {
856         ; Peephole 163   removed sjmp by inverse jump logic
857         jnz  %2
858 %1:}
859
860 replace {
861         jnb  %3,%1
862         sjmp %2
863 %1:
864 } by {
865         ; Peephole 164   removed sjmp by inverse jump logic
866         jb   %3,%2
867 %1:
868 }
869
870 replace {
871         jb   %3,%1
872         sjmp %2
873 %1:
874 } by {
875         ; Peephole 165   removed sjmp by inverse jump logic
876         jnb  %3,%2
877 %1:
878 }
879
880 replace {
881         mov  %1,%2
882         mov  %3,%1
883         mov  %2,%1
884 } by {
885         ; Peephole 166   removed redundant mov
886         mov  %1,%2
887         mov  %3,%1 }
888
889 replace {
890         mov  c,%1
891         cpl  c
892         mov  %1,c
893 } by {
894         ; Peephole 167   removed redundant bit moves (c not set to %1)
895         cpl  %1 }
896
897 replace {
898         jnb  %1,%2
899         sjmp %3
900 %2:} by {
901         ; Peephole 168   jump optimization
902         jb   %1,%3
903 %2:}
904
905 replace {
906         jb   %1,%2
907         sjmp %3
908 %2:} by {
909         ; Peephole 169   jump optimization
910         jnb  %1,%3
911 %2:}
912
913 replace {
914         clr  a
915         cjne %1,%2,%3
916         cpl  a
917 %3:
918         jz   %4
919 } by {
920         ; Peephole 170   jump optimization
921         cjne %1,%2,%4
922 %3:
923 } if labelRefCount %3 1
924
925 replace {
926         clr  a
927         cjne %1,%2,%3
928         cjne %9,%10,%3
929         cpl  a
930 %3:
931         jz   %4
932 } by {
933         ; Peephole 171   jump optimization
934         cjne %1,%2,%4
935         cjne %9,%10,%4
936 %3:
937 } if labelRefCount %3 2
938
939 replace {
940         clr  a
941         cjne %1,%2,%3
942         cjne %9,%10,%3
943         cjne %11,%12,%3
944         cpl  a
945 %3:
946         jz   %4
947 } by {
948         ; Peephole 172   jump optimization
949         cjne %1,%2,%4
950         cjne %9,%10,%4
951         cjne %11,%12,%4
952 %3:
953 } if labelRefCount %3 3
954
955 replace {
956         clr  a
957         cjne %1,%2,%3
958         cjne %9,%10,%3
959         cjne %11,%12,%3
960         cjne %13,%14,%3
961         cpl  a
962 %3:
963         jz   %4
964 } by {
965         ; Peephole 173   jump optimization
966         cjne %1,%2,%4
967         cjne %9,%10,%4
968         cjne %11,%12,%4
969         cjne %13,%14,%4
970 %3:
971 } if labelRefCount %3 4
972
973 replace {
974         mov  r%1,%2
975         clr  c
976         mov  a,r%1
977         subb a,#0x01
978         mov  %2,a
979 } by {
980         ; Peephole 174   optimized decrement (acc not set to %2, flags undefined)
981         mov  r%1,%2
982         dec  %2
983 }
984
985
986 replace {
987         mov  r%1,%2
988         mov  a,r%1
989         add  a,#0x01
990         mov  %2,a
991 } by {
992         ; Peephole 175   optimized increment (acc not set to %2, flags undefined)
993         mov  r%1,%2
994         inc  %2
995 }
996
997 replace {
998         mov  %1,@r%2
999         inc  %1
1000         mov  @r%2,%1
1001 } by {
1002         ; Peephole 176   optimized increment, removed redundant mov
1003         inc  @r%2
1004         mov  %1,@r%2
1005 }
1006
1007 // this one will screw assignes to volatile/sfr's
1008 //replace {
1009 //        mov  %1,%2
1010 //        mov  %2,%1
1011 //} by {
1012 //        ; Peephole 177   removed redundant mov
1013 //        mov  %1,%2
1014 //}
1015
1016 replace {
1017         mov  a,%1
1018         mov  b,a
1019         mov  a,%2
1020 } by {
1021         ; Peephole 178   removed redundant mov
1022         mov  b,%1
1023         mov  a,%2
1024 }
1025
1026 // rules 179-182 provided by : Frieder <fe@lake.iup.uni-heidelberg.de>
1027 // saving 2 byte, 1 cycle
1028 replace {
1029         mov  b,#0x00
1030         mov  a,#0x00
1031 } by {
1032         ; Peephole 179   changed mov to clr
1033         clr  a
1034         mov  b,a
1035 }
1036
1037 // saving 1 byte, 0 cycles
1038 replace {
1039         mov  a,#0x00
1040 } by {
1041         ; Peephole 180   changed mov to clr
1042         clr  a
1043 }
1044
1045 replace {
1046         mov  dpl,#0x00
1047         mov  dph,#0x00
1048         mov  dpx,#0x00
1049 } by {
1050         ; Peephole 181a   used 24 bit load of dptr
1051         mov  dptr,#0x0000
1052 } if 24bitMode
1053
1054 // saving 3 byte, 2 cycles, return(NULL) profits here
1055 replace {
1056         mov  dpl,#0x00
1057         mov  dph,#0x00
1058 } by {
1059         ; Peephole 181   used 16 bit load of dptr
1060         mov  dptr,#0x0000
1061 }
1062
1063 replace {
1064         mov dpl,#%1
1065         mov dph,#(%1 >> 8)
1066         mov dpx,#(%1 >> 16)
1067 } by {
1068         ; Peephole 182b used 24 bit load of DPTR
1069         mov dptr,#%1
1070 }
1071
1072 // saves 2 bytes, ?? cycles.
1073 replace {
1074         mov  dpl,#%1
1075         mov  dph,#%2
1076         mov  dpx,#%3
1077 } by {
1078         ; Peephole 182a   used 24 bit load of dptr
1079         mov  dptr,#((%3 << 16) + (%2 << 8) + %1)
1080 } if 24bitMode
1081
1082 // saving 3 byte, 2 cycles, return(float_constant) profits here
1083 replace {
1084         mov  dpl,#%1
1085         mov  dph,#%2
1086 } by {
1087         ; Peephole 182   used 16 bit load of dptr
1088         mov  dptr,#(((%2)<<8) + %1)
1089 }
1090
1091 replace {
1092         anl  %1,#%2
1093         anl  %1,#%3
1094 } by {
1095         ; Peephole 183   avoided anl during execution
1096         anl  %1,#(%2 & %3)
1097 }
1098
1099 replace {
1100         mov  %1,a
1101         cpl  a
1102         mov  %1,a
1103 } by {
1104         ; Peephole 184   removed redundant mov
1105         cpl  a
1106         mov  %1,a
1107 }
1108
1109 replace {
1110 // acc being incremented might cause problems
1111         mov  %1,a
1112         inc  %1
1113 } by {
1114         ; Peephole 185   changed order of increment (acc incremented also!)
1115         inc  a
1116         mov  %1,a
1117 }
1118
1119 replace {
1120         add  a,#%1
1121         mov  dpl,a
1122         clr  a
1123         addc a,#(%1 >> 8)
1124         mov  dph,a
1125         clr  a
1126         movc a,@a+dptr
1127         mov  %2,a
1128         inc  dptr
1129         clr  a
1130         movc a,@a+dptr
1131         mov  %3,a
1132         inc  dptr
1133         clr  a
1134         movc a,@a+dptr
1135         mov  %4,a
1136         inc  dptr
1137         clr  a  
1138 } by {
1139         ; Peephole 186.a   optimized movc sequence
1140         mov  dptr,#%1
1141         mov  b,acc
1142         movc a,@a+dptr
1143         mov  %2,a
1144         mov  acc,b
1145         inc  dptr       
1146         movc a,@a+dptr
1147         mov  %3,a
1148         mov  acc,b
1149         inc  dptr
1150         mov  %4,a
1151         mov  acc,b
1152         inc  dptr
1153 }
1154
1155 replace {
1156         add  a,#%1
1157         mov  dpl,a
1158         clr  a
1159         addc a,#(%1 >> 8)
1160         mov  dph,a
1161         clr  a
1162         movc a,@a+dptr
1163         mov  %2,a
1164         inc  dptr
1165         clr  a
1166         movc a,@a+dptr
1167         mov  %3,a
1168         inc  dptr
1169         clr  a
1170 } by {
1171         ; Peephole 186.b   optimized movc sequence
1172         mov  dptr,#%1
1173         mov  b,acc
1174         movc a,@a+dptr
1175         mov  %2,a
1176         mov  acc,b
1177         inc  dptr       
1178         movc a,@a+dptr
1179         mov  %3,a
1180         mov  acc,b
1181         inc  dptr       
1182 }
1183
1184 replace {
1185         add  a,#%1
1186         mov  dpl,a
1187         clr  a
1188         addc a,#(%1 >> 8)
1189         mov  dph,a
1190         clr  a
1191         movc a,@a+dptr
1192         mov  %2,a
1193         inc  dptr
1194         clr  a
1195 } by {
1196         ; Peephole 186.c   optimized movc sequence
1197         mov  dptr,#%1
1198         mov  b,acc
1199         movc a,@a+dptr
1200         mov  %2,a
1201         mov  acc,b
1202         inc  dptr
1203 }
1204
1205 replace {
1206         add  a,#%1
1207         mov  dpl,a
1208         clr  a
1209         addc a,#(%1 >> 8)
1210         mov  dph,a
1211         clr  a
1212         movc a,@a+dptr
1213 } by {
1214         ; Peephole 186   optimized movc sequence
1215         mov  dptr,#%1
1216         movc a,@a+dptr
1217 }
1218
1219 replace {
1220         mov  r%1,%2
1221         anl  ar%1,#%3
1222         mov  a,r%1
1223 } by {
1224         ; Peephole 187   used a instead of ar%1 for anl
1225         mov  a,%2
1226         anl  a,#%3
1227         mov  r%1,a
1228 }
1229
1230 replace {
1231         mov  %1,a
1232         mov  dptr,%2
1233         movc a,@a+dptr
1234         mov  %1,a
1235 } by {
1236         ; Peephole 188   removed redundant mov
1237         mov  dptr,%2
1238         movc a,@a+dptr
1239         mov  %1,a
1240 }
1241
1242 replace {
1243         anl  a,#0x0f
1244         mov  %1,a
1245         mov  a,#0x0f
1246         anl  a,%1
1247 } by {
1248         ; Peephole 189   removed redundant mov and anl
1249         anl  a,#0x0f
1250         mov  %1,a
1251 }
1252
1253 // rules 190 & 191 need to be in order
1254 replace {
1255         mov  a,%1
1256         lcall __gptrput
1257         mov  a,%1
1258 } by {
1259         ; Peephole 190   removed redundant mov
1260         mov  a,%1
1261         lcall __gptrput
1262 }
1263
1264 replace {
1265         mov  %1,a
1266         mov  dpl,%2
1267         mov  dph,%3
1268         mov  b,%4
1269         mov  a,%1
1270 } by {
1271         ; Peephole 191   removed redundant mov
1272         mov  %1,a
1273         mov  dpl,%2
1274         mov  dph,%3
1275         mov  b,%4
1276 }
1277
1278 replace {
1279         mov  r%1,a
1280         mov  @r%2,ar%1
1281 } by {
1282         ; Peephole 192   used a instead of ar%1 as source
1283         mov  r%1,a
1284         mov  @r%2,a
1285 }
1286
1287 replace {
1288         jnz  %3
1289         mov  a,%4
1290         jnz  %3
1291         mov  a,%9
1292         jnz  %3
1293         mov  a,%12
1294         cjne %13,%14,%3
1295         sjmp %7
1296 %3:
1297         sjmp %8
1298 } by {
1299         ; Peephole 193.a optimized misc jump sequence
1300         jnz  %8
1301         mov  a,%4
1302         jnz  %8
1303         mov  a,%9
1304         jnz  %8
1305         mov  a,%12
1306         cjne %13,%14,%8
1307         sjmp %7
1308 ;%3:
1309 } if labelRefCount %3 4
1310
1311 replace {
1312         cjne %1,%2,%3
1313         mov  a,%4
1314         cjne %5,%6,%3
1315         mov  a,%9
1316         cjne %10,%11,%3
1317         mov  a,%12
1318         cjne %13,%14,%3
1319         sjmp %7
1320 %3:
1321         sjmp %8
1322 } by {
1323         ; Peephole 193   optimized misc jump sequence
1324         cjne %1,%2,%8
1325         mov  a,%4
1326         cjne %5,%6,%8
1327         mov  a,%9
1328         cjne %10,%11,%8
1329         mov  a,%12
1330         cjne %13,%14,%8
1331         sjmp %7
1332 ;%3:
1333 } if labelRefCount %3 4
1334
1335 replace {
1336         cjne @%1,%2,%3
1337         inc  %1
1338         cjne @%1,%6,%3
1339         inc  %1
1340         cjne @%1,%11,%3
1341         inc  %1
1342         cjne @%1,%14,%3
1343         sjmp %7
1344 %3:
1345         sjmp %8
1346 } by {
1347         ; Peephole 193.a   optimized misc jump sequence
1348         cjne @%1,%2,%8
1349         inc  %1
1350         cjne @%1,%6,%8
1351         inc  %1
1352         cjne @%1,%11,%8
1353         inc  %1
1354         cjne @%1,%14,%8
1355         sjmp %7
1356 ;%3:
1357 } if labelRefCount %3 4
1358
1359 replace {
1360         cjne %1,%2,%3
1361         cjne %5,%6,%3
1362         cjne %10,%11,%3
1363         cjne %13,%14,%3
1364         sjmp %7
1365 %3:
1366         sjmp %8
1367 } by {
1368         ; Peephole 194   optimized misc jump sequence
1369         cjne %1,%2,%8
1370         cjne %5,%6,%8
1371         cjne %10,%11,%8
1372         cjne %13,%14,%8
1373         sjmp %7
1374 ;%3:
1375 } if labelRefCount %3 4
1376
1377 replace {
1378         jnz  %3
1379         mov  a,%4
1380         jnz  %3
1381         mov  a,%9
1382         cjne %10,%11,%3
1383         sjmp %7
1384 %3:
1385         sjmp %8
1386 } by {
1387         ; Peephole 195.a optimized misc jump sequence
1388         jnz  %8
1389         mov  a,%4
1390         jnz  %8
1391         mov  a,%9
1392         cjne %10,%11,%8
1393         sjmp %7
1394 ;%3:
1395 } if labelRefCount %3 3
1396
1397 replace {
1398         cjne %1,%2,%3
1399         mov  a,%4
1400         cjne %5,%6,%3
1401         mov  a,%9
1402         cjne %10,%11,%3
1403         sjmp %7
1404 %3:
1405         sjmp %8
1406 } by {
1407         ; Peephole 195   optimized misc jump sequence
1408         cjne %1,%2,%8
1409         mov  a,%4
1410         cjne %5,%6,%8
1411         mov  a,%9
1412         cjne %10,%11,%8
1413         sjmp %7
1414 ;%3:
1415 } if labelRefCount %3 3
1416
1417 replace {
1418         cjne @%1,%2,%3
1419         inc  %1
1420         cjne @%1,%6,%3
1421         inc  %1
1422         cjne @%1,%11,%3
1423         sjmp %7
1424 %3:
1425         sjmp %8
1426 } by {
1427         ; Peephole 195.a   optimized misc jump sequence
1428         cjne @%1,%2,%8
1429         inc  %1
1430         cjne @%1,%6,%8
1431         inc  %1
1432         cjne @%1,%11,%8
1433         sjmp %7
1434 ;%3:
1435 } if labelRefCount %3 3
1436
1437 replace {
1438         cjne %1,%2,%3
1439         cjne %5,%6,%3
1440         cjne %10,%11,%3
1441         sjmp %7
1442 %3:
1443         sjmp %8
1444 } by {
1445         ; Peephole 196   optimized misc jump sequence
1446         cjne %1,%2,%8
1447         cjne %5,%6,%8
1448         cjne %10,%11,%8
1449         sjmp %7
1450 ;%3:
1451 } if labelRefCount %3 3
1452
1453 replace {
1454         jnz  %3
1455         mov  a,%4
1456         cjne %5,%6,%3
1457         sjmp %7
1458 %3:
1459         sjmp %8 
1460 } by {
1461         ; Peephole 197.a optimized misc jump sequence
1462         jnz  %8
1463         mov  a,%4
1464         cjne %5,%6,%8
1465         sjmp %7
1466 ;%3:     
1467 } if labelRefCount %3 2
1468
1469 replace {
1470         cjne %1,%2,%3
1471         mov  a,%4
1472         cjne %5,%6,%3
1473         sjmp %7
1474 %3:
1475         sjmp %8
1476 } by {
1477         ; Peephole 197   optimized misc jump sequence
1478         cjne %1,%2,%8
1479         mov  a,%4
1480         cjne %5,%6,%8
1481         sjmp %7
1482 ;%3:
1483 } if labelRefCount %3 2
1484
1485 replace {
1486         cjne @%1,%2,%3
1487         inc  %1
1488         cjne @%1,%6,%3
1489         sjmp %7
1490 %3:
1491         sjmp %8
1492 } by {
1493         ; Peephole 197.a   optimized misc jump sequence
1494         cjne @%1,%2,%8
1495         inc   %1
1496         cjne @%1,%6,%8
1497         sjmp %7
1498 ;%3:
1499 } if labelRefCount %3 2
1500
1501 replace {
1502         cjne %1,%2,%3
1503         cjne %5,%6,%3
1504         sjmp %7
1505 %3:
1506         sjmp %8
1507 } by {
1508         ; Peephole 198   optimized misc jump sequence
1509         cjne %1,%2,%8
1510         cjne %5,%6,%8
1511         sjmp %7
1512 ;%3:
1513 } if labelRefCount %3 2
1514
1515 replace {
1516         cjne %1,%2,%3
1517         sjmp %4
1518 %3:
1519         sjmp %5
1520 } by {
1521         ; Peephole 199   optimized misc jump sequence
1522         cjne %1,%2,%5
1523         sjmp %4
1524 ;%3:
1525 } if labelRefCount %3 1
1526
1527 replace {
1528         sjmp %1
1529 %1:
1530 } by {
1531         ; Peephole 200   removed redundant sjmp
1532 %1:
1533 }
1534
1535 replace {
1536         sjmp %1
1537 %2:
1538 %1:
1539 } by {
1540         ; Peephole 201   removed redundant sjmp
1541 %2:
1542 %1:
1543 }
1544
1545 replace {
1546         push  acc
1547         mov   dptr,%1
1548         pop   acc
1549 } by {
1550         ; Peephole 202   removed redundant push pop
1551         mov   dptr,%1
1552 }
1553
1554 replace {
1555         mov  r%1,_spx
1556         lcall %2
1557         mov  r%1,_spx
1558 } by {
1559         ; Peephole 203   removed mov  r%1,_spx
1560         lcall %2
1561 }
1562
1563 replace {
1564         mov  %1,a
1565         add  a,acc
1566         mov  %1,a
1567 } by {
1568         ; Peephole 204   removed redundant mov
1569         add  a,acc
1570         mov  %1,a
1571 }
1572
1573 replace {
1574         djnz %1,%2
1575         sjmp  %3
1576 %2:
1577         sjmp  %4
1578 %3:
1579 } by {
1580         ; Peephole 205   optimized misc jump sequence
1581         djnz %1,%4
1582 %2:
1583 %3:
1584 } if labelRefCount %2 1
1585
1586 replace {
1587         mov  %1,%1
1588 } by {
1589         ; Peephole 206   removed redundant mov %1,%1
1590 }
1591
1592 replace {
1593         mov  a,_bp
1594         add  a,#0x00
1595         mov  %1,a
1596 } by {
1597         ; Peephole 207   removed zero add (acc not set to %1, flags undefined)
1598         mov  %1,_bp
1599 }
1600
1601 replace {
1602         push  acc
1603         mov   r%1,_bp
1604         pop   acc
1605 } by {
1606         ; Peephole 208   removed redundant push pop
1607         mov   r%1,_bp
1608 }
1609
1610 replace {
1611         mov  a,_bp
1612         add  a,#0x00
1613         inc  a
1614         mov  %1,a
1615 } by {
1616         ; Peephole 209   optimized increment (acc not set to %1, flags undefined)
1617         mov  %1,_bp
1618         inc  %1
1619 }
1620
1621 replace {
1622         mov  dptr,#((((%1 >> 16)) <<16) + (((%1 >> 8)) <<8) + %1)
1623 } by {
1624         ; Peephole 210a   simplified expression
1625         mov  dptr,#%1
1626 } if 24bitMode
1627
1628 replace {
1629         mov  dptr,#((((%1 >> 8)) <<8) + %1)
1630 } by {
1631         ; Peephole 210   simplified expression
1632         mov  dptr,#%1
1633 }
1634
1635 replace {
1636         push %1
1637         pop  %1
1638 } by {
1639         ; Peephole 211   removed redundant push %1 pop %1  
1640
1641
1642 replace {
1643         mov  a,_bp
1644         add  a,#0x01
1645         mov  r%1,a
1646 } by {
1647         ; Peephole 212  reduced add sequence to inc
1648         mov  r%1,_bp
1649         inc  r%1
1650 }
1651
1652 replace {
1653         mov  %1,#(( %2 >> 8 ) ^ 0x80)
1654 } by {  
1655         mov  %1,#(%2 >> 8)
1656         xrl  %1,#0x80
1657 }
1658
1659 replace {
1660         mov  %1,#(( %2 + %3 >> 8 ) ^ 0x80)
1661 } by {  
1662         mov  %1,#((%2 + %3) >> 8)
1663         xrl  %1,#0x80
1664 }
1665
1666 replace  {
1667         mov  %1,a
1668         mov  a,%2
1669         add  a,%1
1670 } by {
1671         ; Peephole 214 reduced some extra movs
1672         mov  %1,a
1673         add  a,%2       
1674 } if operandsNotSame
1675
1676 replace {
1677         mov  %1,a
1678         add  a,%2
1679         mov  %1,a
1680 } by {
1681         ; Peephole 215 removed some movs
1682         add  a,%2
1683         mov  %1,a
1684 } if operandsNotSame
1685
1686 replace {
1687         mov   r%1,%2
1688         clr   a
1689         inc   r%1
1690         mov   @r%1,a
1691         dec   r%1
1692         mov   @r%1,a
1693 } by {
1694         ; Peephole 216 simplified clear (2bytes)
1695         mov   r%1,%2
1696         clr   a
1697         mov   @r%1,a
1698         inc   r%1
1699         mov   @r%1,a
1700 }
1701
1702 replace {
1703         mov   r%1,%2
1704         clr   a
1705         inc   r%1
1706         inc   r%1
1707         mov   @r%1,a
1708         dec   r%1
1709         mov   @r%1,a
1710         dec   r%1
1711         mov   @r%1,a
1712 } by {
1713         ; Peephole 217 simplified clear (3bytes)
1714         mov   r%1,%2
1715         clr   a
1716         mov   @r%1,a
1717         inc   r%1
1718         mov   @r%1,a
1719         inc   r%1
1720         mov   @r%1,a
1721 }
1722
1723 replace {
1724         mov   r%1,%2
1725         clr   a
1726         inc   r%1
1727         inc   r%1
1728         inc   r%1
1729         mov   @r%1,a
1730         dec   r%1
1731         mov   @r%1,a
1732         dec   r%1
1733         mov   @r%1,a
1734         dec   r%1
1735         mov   @r%1,a
1736 } by {
1737         ; Peephole 218 simplified clear (4bytes)
1738         mov   r%1,%2
1739         clr   a
1740         mov   @r%1,a
1741         inc   r%1
1742         mov   @r%1,a
1743         inc   r%1
1744         mov   @r%1,a
1745         inc   r%1
1746         mov   @r%1,a
1747 }
1748
1749 replace {
1750         clr   a
1751         movx  @dptr,a
1752         mov   dptr,%1
1753         clr   a
1754         movx  @dptr,a
1755 } by {
1756         ; Peephole 219 removed redundant clear
1757         clr   a
1758         movx  @dptr,a
1759         mov   dptr,%1
1760         movx  @dptr,a
1761 }
1762
1763 replace {
1764         clr   a
1765         movx  @dptr,a
1766         mov   dptr,%1
1767         movx  @dptr,a
1768         mov   dptr,%2
1769         clr   a
1770         movx  @dptr,a
1771 } by {
1772         ; Peephole 219a removed redundant clear
1773         clr   a
1774         movx  @dptr,a
1775         mov   dptr,%1
1776         movx  @dptr,a
1777         mov   dptr,%2
1778         movx  @dptr,a
1779 }
1780
1781 replace {
1782         mov     dps, #0x00
1783         mov     dps, #0x01
1784 } by {
1785         ; Peephole 220a removed bogus DPS set
1786         mov     dps, #0x01
1787 }
1788
1789 replace {
1790         mov     dps, #0x01
1791         mov     dps, #0x00
1792 } by {
1793         ; Peephole 220b removed bogus DPS set
1794         mov     dps, #0x00
1795 }
1796
1797 replace {
1798         mov     %1 + %2,(%2 + %1)
1799 } by {
1800         ; Peephole 221a remove redundant move
1801 }
1802
1803 replace {
1804         mov     (%1 + %2 + %3),((%2 + %1) + %3)
1805 } by {
1806         ; Peephole 221b remove redundant move
1807 }
1808
1809 replace {
1810         dec     r%1
1811         inc     r%1
1812 } by {
1813         ; removed dec/inc pair
1814 }
1815
1816 replace {
1817         mov     dps, #0x00
1818         mov     %1,a
1819         mov     dps, #0x01
1820 } by {
1821         ; Peephole 222 removed DPS abuse.
1822         mov     %1,a
1823         mov     dps, #0x01
1824 }
1825
1826 replace {
1827         mov     dps, #0x00
1828         xch     a, ap
1829         mov     %1, ap
1830         mov     dps, #0x01
1831 } by {
1832         ; Peephole 222a removed DPS abuse.
1833         xch     a, ap
1834         mov     %1, ap
1835         mov     dps, #0x01
1836 }
1837
1838 replace {
1839         mov     dps, #0x%1
1840         inc     dptr
1841         movx    a,@dptr
1842         mov     %2,a
1843         mov     dps, #0x%1
1844 } by {
1845         mov     dps, #0x%1
1846         inc     dptr
1847         movx    a,@dptr
1848         mov     %2,a
1849 ; Peephole 223: yet more DPS abuse removed.
1850 }
1851
1852 replace {
1853         mov     dps, #0x00
1854         inc     dps
1855 } by {
1856         mov     dps, #0x01
1857 }
1858
1859 replace {
1860         mov     dps, #0x0%1
1861         mov     dptr, %2
1862         mov     dps, #0x0%1
1863 } by {
1864         mov     dps, #0x0%1
1865         mov     dptr, %2
1866 }
1867
1868 replace {
1869         mov     dps, #0x01
1870         mov     dptr, %1
1871         mov     dps, #0x00
1872         mov     dptr, %2
1873         inc     dps
1874 } by {
1875         mov     dps, #0x00
1876         mov     dptr, %2
1877         inc     dps
1878         mov     dptr, %1
1879 ; Peephole 224a: DPS usage re-arranged.
1880 }
1881
1882 replace {
1883         mov     dps, #0x0%1
1884         mov     dptr, %2
1885         mov     dps, #0x0%3
1886         mov     dptr, %4
1887         mov     dps, #0x0%1
1888 } by {
1889         mov     dps, #0x0%3
1890         mov     dptr, %4
1891         mov     dps, #0x0%1
1892         mov     dptr, %2
1893 ; Peephole 224: DPS usage re-arranged.
1894 }
1895
1896 replace {
1897         mov     dps, #0x01
1898         mov     dptr, %1
1899         mov     dps, #0x00
1900 } by {
1901         mov     dps, #0x01
1902         mov     dptr, %1
1903         dec     dps
1904 }
1905
1906 replace {
1907         xch     a, ap
1908         add     a, ap
1909 } by {
1910         add     a, ap
1911 }
1912
1913 replace {
1914         xch     a, ap
1915         addc    a, ap
1916 } by {
1917         addc    a, ap
1918 }
1919
1920 replace {
1921         inc     dps
1922         mov     dps, #0x%1
1923 } by {
1924         mov     dps, #0x%1
1925 }
1926
1927 replace {
1928         dec     dps
1929         mov     dps, #0x%1
1930 } by {
1931         mov     dps, #0x%1
1932 }
1933
1934