Pristine Ack-5.5
[Ack-5.5.git] / mach / i80 / ncg / table
1 /************************************************************/
2 /************************************************************/
3 /*******                                               ******/
4 /*******   8 0 8 0    B A C K  E N D   T A B L E       ******/
5 /*******                                               ******/
6 /************************************************************/
7 /************************************************************/
8
9
10 rcsid = "$Id: table,v 1.12 1994/06/24 12:58:11 ceriel Exp $"
11
12 EM_WSIZE = 2
13 EM_PSIZE = 2
14 EM_BSIZE = 4
15
16 SL=4
17
18 PROPERTIES
19
20 areg                    /* the a-register */
21 lbreg                   /* the registers used as localbase */
22 reg                     /* the free registers */
23 regpair                 /* register pairs bc, de and hl */
24 regind                  /* register indirect */
25 dereg                   /* de-register-pair */
26 hlreg                   /* hl-register-pair */
27 hl_or_de                /* de- or hl-register-pair */
28 localbase
29 stackpointer
30 psword
31
32
33 REGISTERS
34
35 a                       :areg,reg.
36 b,c                     :lbreg.
37 d,e,h,l                 :reg.
38 lb("b")=b+c             :regpair, localbase, regind.
39 de("d")=d+e             :regpair, regind, dereg, hl_or_de.
40 hl("h")=h+l             :regpair, hlreg, hl_or_de.
41 sp                      :stackpointer.
42 psw=a                   :psword.     /* in fact psw also includes
43                                         condition codes */
44
45 TOKENS
46
47 const1                  = { INT num; } 1 num.
48 const2                  = { INT num; } 2 num.
49 label                   = { ADDR off; } 2 off.
50 m                       = { } 2 cost(0,3) "m".
51
52 SETS
53
54 reg1                    = reg + lbreg + m.
55 b_d_h_sp                = regpair + stackpointer.
56 b_d_h_psw               = regpair + psword.
57 immediate               = const2 + label.
58 src1                    = reg.
59 src2                    = hl_or_de + const2 + label.
60 src1or2                 = src1 + src2.
61
62 INSTRUCTIONS
63
64 /* aci  const1:ro       kills a:cc      cost(2, 7).     */
65    adc  reg1:ro         kills a:cc      cost(1, 4).
66    add  reg1:ro         kills a:cc      cost(1, 4).
67 /* adi  const1:ro       kills a:cc      cost(2, 7).     */
68    ana  reg1:ro         kills a:cc      cost(1, 4).
69    ani  const1:ro       kills a:cc      cost(2, 7).
70    Call "call" label:ro                 cost(3,17).
71                            /* 'call' is a reserved word */
72 /* cc   label:ro                        cost(3,14).     */
73 /* cm   label:ro                        cost(3,14).     */
74    cma                  kills a         cost(3,14).
75    cmc                  kills:cc        cost(1, 4).
76    cmp  reg1:ro         kills:cc        cost(1, 4).
77 /* cnc  label:ro                        cost(3,14).     */
78    cnz  label:ro                        cost(3,14).
79 /* cp   label:ro                        cost(3,14).     */
80 /* cpe  label:ro                        cost(3,14).     */
81    cpi  const1:ro       kills:cc        cost(2, 7).
82 /* cpo  label:ro                        cost(3,14).     */
83 /* cz   label:ro                        cost(3,14).     */
84 /* daa                  kills a:cc      cost(1, 4).     */
85    dad  b_d_h_sp:ro     kills hl:cc     cost(1,10).
86    dcr  reg+lbreg:rw:cc                 cost(1, 5).
87    dcr  m:rw:cc                         cost(1, 7).
88    dcx  b_d_h_sp:rw                     cost(1, 5).
89 /* di                                   cost(1, 4).     */
90 /* ei                                   cost(1, 4).     */
91 /* hlt                                  cost(1, 4).     */
92 /* in   const1:ro                       cost(2,10).     */
93    inr  reg+lbreg:rw:cc                 cost(1, 5).
94    inr  m:rw:cc                         cost(1, 7).
95    inx  b_d_h_sp:rw                     cost(1, 5).
96    jc   label:ro                        cost(3,10).
97    jm   label:ro                        cost(3,10).
98    jmp  label:ro                        cost(3,10).
99    jnc  label:ro                        cost(3,10).
100    jnz  label:ro                        cost(3,10).
101    jp   label:ro                        cost(3,10).
102 /* jpe  label:ro                        cost(3,10).     */
103 /* jpo  label:ro                        cost(3,10).     */
104    jz   label:ro                        cost(3,10).
105    lda  label:ro        kills a         cost(3,13).
106    ldax regind:ro       kills a         cost(1, 7).
107    lhld label:ro        kills hl        cost(3,16).
108    lxi  b_d_h_sp:wo,immediate:ro        cost(3,10).
109    mov  reg+lbreg:wo,reg+lbreg:ro       cost(1, 5).
110    mov  m:wo,reg1:ro                    cost(1, 4).
111    mov  reg1:wo,m:ro                    cost(1, 4).
112    mvi  reg1:wo,const1:ro               cost(2, 7).
113 /* nop                                  cost(1, 3).     */
114    ora  reg1:ro         kills a:cc      cost(1, 4).
115 /* ori  const1:ro       kills a:cc      cost(2, 7).     */
116 /* out  const1:ro                       cost(2,10).     */
117    pchl                                 cost(1, 5).
118    pop  b_d_h_psw:wo                    cost(1,10).
119    push b_d_h_psw:ro                    cost(1,10).
120    ral                  kills a:cc      cost(1, 4).
121    rar                  kills a:cc      cost(1, 4).
122 /* rc                                   cost(1, 8).     */
123    ret                                  cost(1,10).
124    rlc                  kills a:cc      cost(1, 4).
125 /* rm                                   cost(1, 8).     */
126 /* rnc                                  cost(1, 8).     */
127 /* rnz                                  cost(1, 8).     */
128 /* rp                                   cost(1, 8).     */
129 /* rpe                                  cost(1, 8).     */
130 /* rpo                                  cost(1, 8).     */
131    rrc                  kills a:cc      cost(1, 4).
132 /* rst  const1:ro                       cost(1,11).     */
133 /* rz                                   cost(1, 8).     */
134    sbb  reg1:ro         kills a:cc      cost(1, 4).
135 /* sbi  const1:ro       kills a:cc      cost(2, 7).     */
136    shld label:ro                        cost(3,16).
137    sphl                                 cost(1, 5).
138    sta  label:ro                        cost(3,13).
139    stax regind:ro                       cost(1, 7).
140 /* stc                  kills:cc        cost(1, 4).     */
141    sub  reg1:ro         kills a:cc      cost(1, 4).
142    sui  const1:ro       kills a:cc      cost(2, 7).
143    xchg                 kills de hl     cost(1, 4).
144    xra  reg1:ro         kills a:cc      cost(1, 4).
145 /* xri  const1:ro       kills a:cc      cost(2, 7).     */
146    xthl                 kills hl        cost(1,18).
147    
148
149 MOVES
150
151 from reg to reg
152 gen mov %2,%1
153
154 from const1 %num==0 to areg
155 gen xra a
156
157 from const1 to reg
158 gen mvi %2,%1
159
160 from immediate to b_d_h_sp
161 gen lxi %2,%1
162
163 from reg to regpair
164 gen mov %2.2,%1
165     mvi %2.1,{const1,0}
166
167 from regpair to regpair
168 gen mov %2.1,%1.1
169     mov %2.2,%1.2
170
171 TESTS
172
173 to test areg            /* dummy test, never used */
174 gen ora a
175
176 STACKINGRULES
177
178 from regpair to STACK
179 gen push %1
180
181 from immediate + reg to STACK
182 uses hl_or_de
183 gen move %1,%a
184     push %a
185
186 from immediate + reg to STACK
187 gen push hl
188     move %1,hl
189     xthl.
190
191 COERCIONS
192
193 from STACK
194 uses regpair
195 gen pop %a                              yields %a
196
197 from STACK
198 uses hl_or_de
199 gen pop %a                              yields %a.2
200
201 from STACK
202 uses areg
203 gen dcx sp
204     pop psw
205     inx sp                              yields a
206
207 from immediate
208 uses regpair
209 gen move %1,%a                          yields %a
210
211 from hl_or_de
212 uses hl_or_de
213 gen xchg.                               yields %a
214
215 from regpair
216 uses regpair
217 gen move %1,%a                          yields %a
218
219 from reg
220 uses reusing %1, hl_or_de
221 gen move %1,%a.2
222     move {const1,0},%a.1                yields %a
223
224 from hl_or_de                           yields %1.2
225
226 from const2
227 uses hl_or_de
228 gen move %1,%a                          yields %a.2
229
230 from hl_or_de
231 uses areg
232 gen move %1.2,a                         yields a
233
234 PATTERNS
235
236 /*********************************************/
237 /* Group 1: Load instructions                */
238 /*********************************************/
239
240 pat loc                                 yields {const2,$1}
241 pat ldc                                 yields {const2,highw($1)}
242                                                {const2,loww($1)}
243
244 pat lol
245 uses hlreg={const2,$1}, dereg
246 gen dad lb
247     mov e,{m}
248     inx hl
249     mov d,{m}                           yields de
250
251 pat loe
252 uses hlreg
253 gen lhld {label,$1}                     yields hl
254
255 pat lil
256 uses hlreg={const2,$1}, dereg
257 gen dad lb
258     mov e,{m}
259     inx hl
260     mov h,{m}
261     mov l,e
262     mov e,{m}
263     inx hl
264     mov d,{m}                           yields de
265
266 pat lof
267 with hl_or_de
268 kills hl_or_de
269 uses hl_or_de={const2,$1}
270 gen dad de
271     mov e,{m}
272     inx hl
273     mov d,{m}                           yields de
274
275 pat lal
276 uses hlreg={const2,$1}
277 gen dad lb                              yields hl
278
279 pat lae                                 yields {label,$1}
280
281 pat lxl $1==0                           yields lb
282
283 pat lxl $1==1
284 uses dereg, hlreg
285 gen move {const2,SL},hl
286     dad lb
287     mov e,{m}
288     inx hl
289     mov d,{m}                           yields de
290
291 pat lxl $1>1 && $1<256
292 uses dereg, areg={const1,$1}, hlreg
293 gen move lb,de
294     1:
295     lxi hl,{const2,SL}
296     dad de
297     mov e,{m}
298     inx hl
299     mov d,{m}
300     dcr a
301     jnz {label,1b}                      yields de
302
303 pat lxa $1==0
304 uses hlreg
305 gen move {const2,SL},hl
306     dad lb                              yields hl
307
308 pat lxa $1==1
309 uses dereg, hlreg
310 gen move {const2,SL},hl
311     dad lb
312     mov e,{m}
313     inx hl
314     mov d,{m}
315     lxi hl,{const2,SL}
316     dad de                              yields hl
317
318 pat lxa $1>1 && $1<256
319 uses dereg, hlreg, areg={const1,$1}
320 gen move lb,de
321     1:
322     lxi hl,{const2,SL}
323     dad de
324     mov e,{m}
325     inx hl
326     mov d,{m}
327     dcr a
328     jnz {label,1b}
329     lxi hl,{const2,SL}
330     dad de                              yields hl
331
332 pat loi $1==1
333 with exact label
334   uses areg
335   gen lda %1                            yields a
336 with dereg
337   uses areg
338   gen ldax de                           yields a
339 with hlreg
340   uses reusing %1, reg
341   gen mov %a,{m}                        yields %a
342
343 pat loi $1==2
344 with exact label
345    gen lhld %1                          yields hl
346 with hlreg
347    uses dereg
348    gen mov e,{m}
349        inx %1
350        mov d,{m}                        yields de
351
352 pat loi $1==4
353 with exact label
354    gen lhld %1
355        xchg.
356        lhld {label,%1.off+2}            yields hl de
357 with exact label
358    gen lhld {label,%1.off+2}
359        xchg.
360        lhld %1                          yields de hl
361 with hlreg
362    uses dereg, areg
363    gen mov e,{m}
364        inx %1
365        mov d,{m}
366        inx hl
367        mov a,{m}
368        inx hl
369        mov h,{m}
370        mov l,a                          yields hl de
371
372 pat loi $1<=510
373 with hl_or_de STACK
374 uses hl_or_de={const2,$1-1}, areg
375 gen dad de
376     mvi a,{const1,$1/2}
377     1:
378     mov d,{m}
379     dcx hl
380     mov e,{m}
381     dcx hl
382     push de
383     dcr a
384     jnz {label,1b}
385
386 pat loi $1>=512
387 kills ALL
388 uses dereg={const2,$1}
389 gen Call {label,".loi"}
390
391 pat los $1==2
392 with dereg
393 kills ALL
394 gen Call {label,".loi"}
395
396 pat ldl
397 with STACK
398 uses dereg, hlreg={const2,$1+3}
399 gen dad lb
400     mov d,{m}
401     dcx hl
402     mov e,{m}
403     dcx hl
404     push de
405     mov d,{m}
406     dcx hl
407     mov e,{m}                           yields de
408
409 pat lde
410 with STACK
411 gen lhld {label,$1+2}
412     push hl
413     lhld {label,$1}                     yields hl
414 with
415 uses dereg, hlreg
416 gen lhld {label,$1}
417     xchg.
418     lhld {label,$1+2}                   yields hl de
419 with 
420 uses dereg, hlreg
421 gen lhld {label,$1+2}
422     xchg.
423     lhld {label,$1}                     yields de hl
424
425 pat ldf
426 with hl_or_de STACK
427 uses hl_or_de={const2,$1+3}
428 gen dad de
429     mov d,{m}
430     dcx hl
431     mov e,{m}
432     dcx hl
433     push de
434     mov d,{m}
435     dcx hl
436     mov e,{m}                           yields de
437
438 pat lpi
439 uses hl_or_de={label,$1}                yields %a
440
441 /******************************************/
442 /* Group 2: Store instructions            */
443 /******************************************/
444
445 pat stl lol $1==$2
446 with dereg                              yields de de leaving stl $1
447
448 pat stl
449 with dereg
450 uses hlreg={const2,$1}
451 gen dad lb
452     mov {m},e
453     inx hl
454     mov {m},d
455
456 pat ste loe $1==$2
457 with hlreg                              yields hl hl leaving ste $1
458
459 pat ste
460 with hlreg
461 gen shld {label,$1}
462
463 pat sil
464 with dereg
465 uses hlreg={const2,$1}, areg
466 gen dad lb
467     mov a,{m}
468     inx hl
469     mov h,{m}
470     mov l,a
471     mov {m},e
472     inx hl
473     mov {m},d
474
475 pat sil lil $1==$2
476 with dereg
477 uses hlreg={const2,$1}, areg
478 gen dad lb
479     mov a,{m}
480     inx hl
481     mov h,{m}
482     mov l,a
483     mov {m},e
484     inx hl
485     mov {m},d                           yields de
486
487 pat lil loc adi sil $1==$4 && $3==2
488 uses hlreg={const2,$1}, dereg, areg
489 gen dad lb
490     mov e,{m}
491     inx hl
492     mov h,{m}
493     mov l,e
494     mov e,{m}
495     inx hl
496     mov d,{m}
497     push hl
498     lxi hl,{const2,$2}
499     dad de
500     xchg.
501     pop hl
502     mov {m},d
503     dcx hl
504     mov {m},e
505
506 pat lil inc sil $1==$3
507 uses hlreg={const2,$1}, areg
508 gen dad lb
509     mov a,{m}
510     inx hl
511     mov h,{m}
512     mov l,a
513     inr {m}
514     jnz {label,1f}
515     inx hl
516     inr {m}
517     1:
518
519 pat lil dec sil $1==$3
520 uses hlreg={const2,$1}, dereg
521 gen dad lb
522     mov e,{m}
523     inx hl
524     mov h,{m}
525     mov l,e
526     mov e,{m}
527     inx hl
528     mov d,{m}
529     dcx de
530     mov {m},d
531     dcx hl
532     mov {m},e
533
534 pat stf
535 with hl_or_de
536 uses hl_or_de={const2,$1}
537 gen dad de
538     pop de
539     mov {m},e
540     inx hl
541     mov {m},d
542
543 pat sti $1==1
544 with label areg
545    gen sta %1
546 with dereg areg
547    gen stax de
548 with hlreg reg
549    gen mov {m},%2
550
551
552 pat sti $1==2
553 with label hlreg
554    gen shld %1
555 with hlreg dereg
556    gen mov {m},e
557        inx %1
558        mov {m},d
559 with dereg hlreg
560    gen xchg.
561        mov {m},e
562        inx %2
563        mov {m},d
564
565 pat sti $1==4
566 with label hlreg dereg
567    gen shld %1
568        xchg.
569        shld {label,%1.off+2}
570 with label dereg hlreg
571    gen shld {label,%1.off+2}
572        xchg.
573        shld %1
574 with hlreg dereg
575 kills ALL
576    gen mov {m},e
577        inx hl
578        mov {m},d
579        inx hl
580        pop de
581        mov {m},e
582        inx hl
583        mov {m},d
584
585 pat sti $1<512
586 with hlreg
587 kills ALL
588 uses areg={const1,$1/2}, dereg
589 gen 1:
590     pop de
591     mov {m},e
592     inx hl
593     mov {m},d
594     inx hl
595     dcr a
596     jnz {label,1b}
597
598 pat sti
599 kills ALL
600 uses dereg={const2,$1}
601 gen Call {label,".sti"}
602
603 pat sts $1==2
604 with dereg
605 kills ALL
606 gen Call {label,".sti"}
607
608 pat sdl
609 with dereg
610 kills ALL
611 uses hlreg={const2,$1}
612 gen dad lb
613     mov {m},e
614     inx hl
615     mov {m},d
616     inx hl
617     pop de
618     mov {m},e
619     inx hl
620     mov {m},d
621
622 pat sde
623 with hlreg
624 kills ALL
625 gen shld {label,$1}
626     pop hl
627     shld {label,$1+2}
628 with hlreg dereg
629 kills ALL
630 gen shld {label,$1}
631     xchg.
632     shld {label,$1+2}
633 with dereg hlreg
634 kills ALL
635 gen shld {label,$1+2}
636     xchg.
637     shld {label,$1}
638
639 pat sdf
640 with hl_or_de
641 kills ALL
642 uses hl_or_de={const2,$1}
643 gen dad de
644     pop de
645     mov {m},e
646     inx hl
647     mov {m},d
648     inx hl
649     pop de
650     mov {m},e
651     inx hl
652     mov {m},d
653
654 /****************************************/
655 /* Group 3: Integer arithmetic          */
656 /****************************************/
657
658 pat adi $1==2
659 with hlreg dereg
660    gen dad de                           yields hl
661 with dereg hlreg
662    gen dad de                           yields hl
663 with hlreg hlreg
664    gen dad hl                           yields hl
665 with dereg dereg
666    gen xchg.
667        dad hl                           yields hl
668
669 pat adi $1==4
670 kills ALL
671 gen Call {label,".adi4"}
672
673 pat sbi $1==2
674 with hl_or_de hl_or_de
675 uses areg
676 gen mov a,%2.2
677     sub %1.2
678     mov %1.2,a
679     mov a,%2.1
680     sbb %1.1
681     mov %1.1,a                          yields %1
682 with hl_or_de hl_or_de
683 uses areg
684 gen mov a,%2.2
685     sub %1.2
686     mov %2.2,a
687     mov a,%2.1
688     sbb %1.1
689     mov %2.1,a                          yields %2
690
691 pat sbi $1==4
692 kills ALL
693 gen Call {label,".sbi4"}
694
695 pat mli $1==2
696 kills ALL
697 gen Call {label,".mli2"}                yields de
698
699 pat mli $1==4
700 kills ALL
701 gen Call {label,".mli4"}
702
703 pat dvi $1==2
704 kills ALL
705 uses areg={const1,129}
706 gen Call {label,".dvi2"}                yields de
707
708 pat dvi $1==4
709 kills ALL
710 uses areg={const1,129}
711 gen Call {label,".dvi4"}
712
713 pat rmi $1==2
714 kills ALL
715 uses areg={const1,128}
716 gen Call {label,".dvi2"}                yields de
717
718 pat rmi $1==4
719 kills ALL
720 uses areg={const1,128}
721 gen Call {label,".dvi4"}
722
723 pat ngi $1==2
724 with hl_or_de
725 uses areg
726 gen xra a
727     sub %1.2
728     mov %1.2,a
729     mvi a,{const1,0}
730     sbb %1.1
731     mov %1.1,a                          yields %1
732
733 pat ngi $1==4
734 kills ALL
735 gen Call {label,".ngi4"}
736
737 pat sli $1==2
738 kills ALL
739 gen Call {label,".sli2"}                yields de
740
741 pat sli $1==4
742 kills ALL
743 gen Call {label,".sli4"}
744
745 pat sri $1==2
746 kills ALL
747 uses areg={const1,1}
748 gen Call {label,".sri2"}                yields de
749
750 pat sri $1==4
751 kills ALL
752 uses areg={const1,1}
753 gen Call {label,".sri4"}
754
755 /********************************************/
756 /* Group 4: Unsigned arithmetic             */
757 /********************************************/
758
759 pat adu                                         leaving adi $1
760
761 pat sbu                                         leaving sbi $1
762
763 pat mlu $1==2
764 kills ALL
765 gen Call {label,".mlu2"}                yields de
766
767 pat mlu $1==4
768 kills ALL
769 gen Call {label,".mli4"}
770
771 pat dvu $1==2
772 kills ALL
773 uses areg={const1,1}
774 gen Call {label,".dvi2"}                yields de
775
776 pat dvu $1==4
777 kills ALL
778 uses areg={const1,1}
779 gen Call {label,".dvi4"}
780
781 pat rmu $1==2
782 kills ALL
783 uses areg={const1,0}
784 gen Call {label,".dvi2"}                yields de
785
786 pat rmu $1==4
787 kills ALL
788 uses areg={const1,0}
789 gen Call {label,".dvi4"}
790
791 pat slu                                         leaving sli $1
792
793 pat sru $1==2
794 kills ALL
795 uses areg={const1,0}
796 gen Call {label,".sri2"}                yields de
797
798 pat sru $1==4
799 kills ALL
800 uses areg={const1,0}
801 gen Call {label,".sri4"}
802
803
804 /********************************************/
805 /* Group 5: Floating point arithmetic       */
806 /********************************************/
807
808 pat adf $1==4
809 kills ALL
810 gen Call {label,".adf4"}
811
812 pat adf $1==8
813 kills ALL
814 gen Call {label,".adf8"}
815
816 pat sbf $1==4
817 kills ALL
818 gen Call {label,".sbf4"}
819
820 pat sbf $1==8
821 kills ALL
822 gen Call {label,".sbf8"}
823
824 pat mlf $1==4
825 kills ALL
826 gen Call {label,".mlf4"}
827
828 pat mlf $1==8
829 kills ALL
830 gen Call {label,".mlf8"}
831
832 pat dvf $1==4
833 kills ALL
834 gen Call {label,".dvf4"}
835
836 pat dvf $1==8
837 kills ALL
838 gen Call {label,".dvf8"}
839
840 pat ngf $1==4
841 kills ALL
842 gen Call {label,".ngf4"}
843
844 pat ngf $1==8
845 kills ALL
846 gen Call {label,".ngf8"}
847
848 pat fif $1==4
849 kills ALL
850 gen Call {label,".fif4"}
851
852 pat fif $1==8
853 kills ALL
854 gen Call {label,".fif8"}
855
856 pat fef $1==4
857 kills ALL
858 gen Call {label,".fef4"}
859
860 pat fef $1==8
861 kills ALL
862 gen Call {label,".fef8"}
863
864 /********************************************/
865 /* Group 6: Pointer arithmetic              */
866 /********************************************/
867
868 pat adp $1==0                   /* do nothing */
869
870 pat adp $1==1
871 with hl_or_de
872 gen inx %1                              yields %1
873
874 pat adp $1==2
875 with hl_or_de
876 gen inx %1
877     inx %1                              yields %1
878
879 pat adp $1==0-1
880 with hl_or_de
881 gen dcx %1                              yields %1
882
883 pat adp $1==0-2
884 with hl_or_de
885 gen dcx %1
886     dcx %1                              yields %1
887
888 pat adp
889 with hl_or_de
890 uses hl_or_de={const2,$1}
891 gen dad de                              yields hl
892
893 pat ads $1==2                                   leaving adi 2
894
895 pat sbs $1==2                                   leaving sbi 2
896
897 /********************************************/
898 /* Group 7: Increment/ decrement/ zero      */
899 /********************************************/
900
901 pat inc
902 with hl_or_de
903 gen inx %1                              yields %1
904
905 pat inl
906 uses hlreg={const2,$1}
907 gen dad lb
908     inr {m}
909     jnz {label,1f}
910     inx hl
911     inr {m}
912     1:
913
914 pat ine
915 uses hlreg={label,$1}
916 gen inr {m}
917     jnz {label,1f}
918     inx hl
919     inr {m}
920     1:
921
922 pat dec
923 with hl_or_de
924 gen dcx %1                              yields %1
925
926 pat del
927 uses hlreg={const2,$1}, dereg
928 gen dad lb
929     mov e,{m}
930     inx hl
931     mov d,{m}
932     dcx de
933     mov {m},d
934     dcx hl
935     mov {m},e
936
937 pat dee
938 uses hlreg
939 gen lhld {label,$1}
940     dcx hl
941     shld {label,$1}
942
943 pat zrl
944 uses hlreg={const2,$1}, areg
945 gen dad lb
946     xra a
947     mov {m},a
948     inx hl
949     mov {m},a
950
951 pat zre
952 uses hlreg={const2,0}
953 gen shld {label,$1}
954
955 pat zrf $1==4
956 kills ALL
957 gen Call {label,".zrf4"}
958
959 pat zrf $1==8
960 kills ALL
961 gen Call {label,".zrf8"}
962
963 pat zer $1==2                           yields {const2,0}
964
965 pat zer $1==4                           yields {const2,0} {const2,0}
966
967 pat zer $1<511
968 kills ALL
969 uses reg={const1,$1/2}, hl_or_de={const2,0}
970 gen 1:
971     push %b
972     dcr %a
973     jnz {label,1b}
974
975 pat zer
976 kills ALL
977 uses hl_or_de={const2,$1/2}, hl_or_de={const2,0}, areg
978 gen xra a
979     1:
980     push %b
981     dcx %a
982     cmp %a.2
983     jnz {label,1b}
984     cmp %a.1
985     jnz {label,1b}
986
987 /*****************************************/
988 /* Group 8: Convert instructions         */
989 /*****************************************/
990
991 pat loc loc cii $1==$2
992
993 pat loc loc cii $1==2 && $2==4
994 with hl_or_de
995 uses hl_or_de={const2,0}, areg
996 gen mov a,%1.1
997     ora a
998     jp {label,1f}
999     lxi %a,{const2,0-1}
1000     1:                                  yields %a %1
1001
1002 pat loc loc cii $1==4 && $2==2
1003 with hl_or_de hl_or_de                  yields %1
1004
1005 pat loc loc cii $1==1 && $2==2
1006 with reg
1007 uses reusing %1, areg=%1, hl_or_de
1008 gen move {const1,0},%b.1
1009     move a,%b.2
1010     ora a
1011     jp {label,1f}
1012     mvi %b.1,{const1,255}
1013     1:                                  yields %b
1014 with hl_or_de
1015 uses areg=%1.2
1016 gen move {const1,0},%1.1
1017     ora a
1018     jp {label,1f}
1019     mvi %1.1,{const1,255}
1020     1:                                  yields %1
1021
1022 pat loc loc cii $1==1 && $2==4
1023 with reg
1024    uses hlreg
1025    gen move %1,l                        yields hl
1026                                                 leaving loc $1 loc $2 cii
1027 with hlreg
1028    uses dereg, areg
1029    gen move {const1,0},%1.1
1030        move l,a
1031        ora a
1032        jp {label,1f}
1033        mvi h,{const1,255}
1034        1:
1035        mov e,h
1036        mov d,h                          yields de hl
1037
1038 pat cii
1039 kills ALL
1040 uses areg={const1,1}
1041 gen Call {label,".cii"}
1042
1043 pat loc loc ciu                                 leaving loc $1 loc $2 cuu
1044 pat loc loc cui                                 leaving loc $1 loc $2 cuu
1045
1046 pat cui                                         leaving cuu $1
1047
1048 pat ciu                                         leaving cuu $1
1049
1050 pat loc loc cuu $1==$2
1051
1052 pat loc loc cuu $1==2 && $2==4
1053 with src1or2                            yields {const2,0} %1
1054
1055 pat loc loc cuu $1==4 && $1==2
1056 with src1or2 src1or2                    yields %1
1057
1058 pat loc loc cuu $1==1 && $2==2
1059 with reg
1060    uses reusing %1, hl_or_de
1061    gen move %1,%a                       yields %a
1062 with hl_or_de
1063    gen move {const1,0},%1.1             yields %1
1064
1065 pat loc loc cuu $1==1 && $2==4
1066 with reg
1067    uses reusing %1, hl_or_de
1068    gen move %1,%a                       yields {const2,0} %a
1069 with hl_or_de
1070    gen move {const1,0},%1.1             yields {const2,0} %1
1071
1072 pat cuu
1073 kills ALL
1074 uses areg={const1,0}
1075 gen Call {label,".cii"}
1076
1077 pat cfi
1078 kills ALL
1079 gen Call {label,".cfi"}
1080
1081 pat cif
1082 kills ALL
1083 gen Call {label,".cif"}
1084
1085 pat cuf
1086 kills ALL
1087 gen Call {label,".cuf"}
1088
1089 pat cff
1090 kills ALL
1091 gen Call {label,".cff"}
1092
1093 pat cfu
1094 kills ALL
1095 gen Call {label,".cfu"}
1096
1097 /*****************************************/
1098 /* Group 9: Logical instructions         */
1099 /*****************************************/
1100
1101 pat and $1==2
1102 with hl_or_de hl_or_de
1103 uses areg
1104 gen mov a,%1.2
1105     ana %2.2
1106     mov %2.2,a
1107     mov a,%1.1
1108     ana %2.1
1109     mov %2.1,a                          yields %2
1110 with hl_or_de hl_or_de
1111 uses areg
1112 gen mov a,%1.2
1113     ana %2.2
1114     mov %1.2,a
1115     mov a,%1.1
1116     ana %2.1
1117     mov %1.1,a                          yields %1
1118
1119 pat and defined($1)
1120 kills ALL
1121 uses dereg={const2,$1}
1122 gen Call {label,".and"}
1123
1124 pat and !defined($1)
1125 with dereg
1126 kills ALL
1127 gen Call {label,".and"}
1128
1129 pat ior $1==2
1130 with hl_or_de hl_or_de
1131 uses areg
1132 gen mov a,%1.2
1133     ora %2.2
1134     mov %2.2,a
1135     mov a,%1.1
1136     ora %2.1
1137     mov %2.1,a                          yields %2
1138 with hl_or_de hl_or_de
1139 uses areg
1140 gen mov a,%1.2
1141     ora %2.2
1142     mov %1.2,a
1143     mov a,%1.1
1144     ora %2.1
1145     mov %1.1,a                          yields %1
1146
1147 pat ior defined($1)
1148 kills ALL
1149 uses dereg={const2,$1}
1150 gen Call {label,".ior"}
1151
1152 pat ior !defined($1)
1153 with dereg
1154 kills ALL
1155 gen Call {label,".ior"}
1156
1157 pat xor $1==2
1158 with hl_or_de hl_or_de
1159 uses areg
1160 gen mov a,%1.2
1161     xra %2.2
1162     mov %2.2,a
1163     mov a,%1.1
1164     xra %2.1
1165     mov %2.1,a                          yields %2
1166 with hl_or_de hl_or_de
1167 uses areg
1168 gen mov a,%1.2
1169     xra %2.2
1170     mov %1.2,a
1171     mov a,%1.1
1172     xra %2.1
1173     mov %1.1,a                          yields %1
1174
1175 pat xor defined($1)
1176 kills ALL
1177 uses dereg={const2,$1}
1178 gen Call {label,".xor"}
1179
1180 pat xor !defined($1)
1181 with dereg
1182 kills ALL
1183 gen Call {label,".xor"}
1184
1185 pat com $1==2
1186 with hl_or_de
1187 uses areg
1188 gen mov a,%1.2
1189     cma.
1190     mov %1.2,a
1191     mov a,%1.1
1192     cma.
1193     mov %1.1,a                          yields %1
1194
1195 pat com defined($1)
1196 kills ALL
1197 uses dereg={const2,$1}
1198 gen Call {label,".com"}
1199
1200 pat com !defined($1)
1201 with dereg
1202 kills ALL
1203 gen Call {label,".com"}
1204
1205 pat rol $1==2
1206 with dereg hlreg
1207 kills ALL
1208 uses areg
1209 gen mov a,e
1210     ani {const1,15}
1211     jz {label,3f}
1212     1:
1213     dad hl
1214     jnc {label,2f}
1215     inr l
1216     2:
1217     dcr a
1218     jnz {label,1b}
1219     3:                                  yields hl
1220
1221 pat rol $1==4
1222 with dereg
1223 kills ALL
1224 gen Call {label,".rol4"}
1225
1226 pat ror $1==2
1227 with dereg hlreg
1228 kills ALL
1229 uses areg
1230 gen mov a,e
1231     ani {const1,15}
1232     jz {label,2f}
1233     mov e,a
1234     mov a,l
1235     1:
1236     rar.
1237     mov a,h
1238     rar.
1239     mov h,a
1240     mov a,l
1241     rar.
1242     mov l,a
1243     dcr e
1244     jnz {label,1b}
1245     2:                                  yields hl
1246
1247 pat ror $1==4
1248 with dereg
1249 kills ALL
1250 gen Call {label,".ror4"}
1251
1252 /***********************************************/
1253 /* Group 10: Set instructions                  */
1254 /***********************************************/
1255
1256 pat inn $1==2
1257 kills ALL
1258 gen Call {label,".inn2"}                yields de
1259
1260 pat inn defined($1)
1261 kills ALL
1262 uses dereg={const2,$1}
1263 gen Call {label,".inn"}                 yields de
1264
1265 pat inn !defined($1)
1266 with dereg
1267 kills ALL
1268 gen Call {label,".inn"}                 yields de
1269
1270 pat set $1==2
1271 with dereg
1272 kills ALL
1273 gen Call {label,".set2"}                yields de
1274
1275 pat set defined($1)
1276 kills ALL
1277 uses dereg={const2,$1}
1278 gen Call {label,".set"}
1279
1280 pat set !defined($1)
1281 with dereg
1282 kills ALL
1283 gen Call {label,".set"}
1284
1285 /***********************************************/
1286 /* Group 11: Array instructions                */
1287 /***********************************************/
1288
1289 pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)==0 leaving adi 2
1290 pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)!=0 leaving adi 2 adp 0-rom($1,1)
1291
1292 pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)==0
1293 with hlreg
1294 gen dad hl                              yields hl leaving adi 2
1295
1296 pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)!=0
1297 with hlreg
1298 uses dereg={const2,0-rom($1,1)}
1299 gen dad de
1300     dad hl                              yields hl leaving adi 2
1301
1302 pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)==0
1303 with hlreg
1304 gen dad hl
1305     dad hl                              yields hl leaving adi 2
1306
1307 pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)!=0
1308 with hlreg
1309 uses dereg={const2,0-rom($1,1)}
1310 gen dad de
1311     dad hl
1312     dad hl                              yields hl leaving adi 2
1313
1314 pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)==0
1315 with hlreg
1316 gen dad hl
1317     dad hl
1318     dad hl                              yields hl leaving adi 2
1319
1320 pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)!=0
1321 with hlreg
1322 uses dereg={const2,0-rom($1,1)}
1323 gen dad de
1324     dad hl
1325     dad hl
1326     dad hl                              yields hl leaving adi 2
1327
1328 pat lar $1==2
1329 kills ALL
1330 gen Call {label,".lar2"}
1331
1332 pat lar defined($1)
1333 gen Call {label,"eunimpl"}
1334
1335 pat lar !defined($1)
1336 with hl_or_de
1337 kills ALL
1338 uses areg
1339 gen mov a,%1.2
1340     cpi {const1,2}
1341     cnz {label,"eunimpl"}
1342     mov a,%1.1
1343     ora a
1344     cnz {label,"eunimpl"}
1345     Call {label,".lar2"}
1346
1347 pat sar $1==2
1348 kills ALL
1349 gen Call {label,".sar2"}
1350
1351 pat sar defined($1)
1352 kills ALL
1353 gen Call {label,"eunimpl"}
1354
1355 pat sar !defined($1)
1356 with hl_or_de
1357 kills ALL
1358 uses areg
1359 gen mov a,%1.2
1360     cpi {const1,2}
1361     cnz {label,"eunimpl"}
1362     mov a,%1.1
1363     ora a
1364     cnz {label,"eunimpl"}
1365     Call {label,".sar2"}
1366
1367 pat aar $1==2
1368 kills ALL
1369 gen Call {label,".aar2"}
1370
1371 pat aar defined($1)
1372 kills ALL
1373 gen Call {label,"eunimpl"}
1374
1375 pat aar !defined($1)
1376 with hl_or_de
1377 kills ALL
1378 uses areg
1379 gen mov a,%1.2
1380     cpi {const1,2}
1381     cnz {label,"eunimpl"}
1382     mov a,%1.1
1383     ora a
1384     cnz {label,"eunimpl"}
1385     Call {label,".aar2"}
1386
1387 /***********************************************/
1388 /* Group 12: Compare instructions              */
1389 /***********************************************/
1390
1391 pat cmi $1==2                                   leaving sbi 2
1392
1393 pat cmi $1==4
1394 kills ALL
1395 uses areg={const1,1}
1396 gen Call {label,".cmi4"}                yields de
1397
1398 pat cmf $1==4
1399 kills ALL
1400 gen Call {label,".cmf4"}
1401
1402 pat cmf $1==8
1403 kills ALL
1404 gen Call {label,".cmf8"}
1405  
1406 pat cmu $1==2
1407 with hl_or_de hl_or_de
1408 uses areg
1409 gen mov a,%2.1
1410     cmp %1.1
1411     jz {label,2f}
1412     jc {label,1f}  
1413     0:
1414     lxi %2,{const2,1}
1415     jmp {label,3f}
1416     1:
1417     lxi %2,{const2,0-1}
1418     jmp {label,3f}
1419     2:
1420     mov a,%2.2
1421     cmp %1.2
1422     jc {label,1b}
1423     jnz {label,0b}
1424     lxi %2,{const2,0}
1425     3:                                  yields %2
1426
1427 pat cmu $1==4
1428 kills ALL
1429 uses areg={const1,0}
1430 gen Call {label,".cmi4"}                yields de
1431
1432 pat cms $1==2                                   leaving cmi 2
1433
1434 pat cms defined($1)
1435 kills ALL
1436 uses dereg={const2,$1}
1437 gen Call {label,".cms"}                 yields de
1438
1439 pat cms !defined($1)
1440 with dereg
1441 kills ALL
1442 gen Call {label,".cms"}                 yields de
1443
1444 pat cmp                                         leaving cmu 2
1445
1446 pat tlt
1447 with hl_or_de
1448 uses areg
1449 gen mov a,%1.1
1450     ral.
1451     mvi a,{const1,0}
1452     mov %1.1,a
1453     adc a
1454     mov %1.2,a                          yields %1
1455
1456 pat tle
1457 with hl_or_de
1458 uses hl_or_de={const2,1}, areg
1459 gen xra a
1460     add %1.1
1461     jm {label,2f}
1462     jnz {label,1f}
1463     xra a
1464     add %1.2
1465     jz {label,2f}
1466     1:
1467     dcx %a
1468     2:                                  yields %a
1469
1470 pat teq
1471 with hl_or_de
1472 uses areg
1473 gen mov a,%1.1
1474     ora %1.2
1475     move {const2,0},%1
1476     jnz {label,1f}
1477     inx %1
1478     1:                                  yields %1
1479
1480 pat tne
1481 with hl_or_de
1482 uses areg
1483 gen mov a,%1.1
1484     ora %1.2
1485     move {const2,0},%1
1486     jz {label,1f}
1487     inx %1
1488     1:                                  yields %1
1489
1490 pat tge
1491 with hl_or_de
1492 uses areg
1493 gen mov a,%1.1
1494     ral.
1495     cmc.
1496     mvi a,{const1,0}
1497     mov %1.1,a
1498     adc a
1499     mov %1.2,a                          yields %1
1500
1501 pat tgt
1502 with hl_or_de
1503 uses hl_or_de={const2,0}, areg
1504 gen xra a
1505     add %1.1
1506     jm {label,2f}
1507     jnz {label,1f}
1508     xra a
1509     add %1.2
1510     jz {label,2f}
1511     1:
1512     inx %a
1513     2:                                  yields %a
1514
1515 pat loc cmi teq and $1>=0 && $1<=255 && $2==2 && $4==2
1516 with exact areg hl_or_de
1517 gen cpi {const1,$1}
1518     jz {label,1f}
1519     move {const2,0},%2
1520     1:                                  yields %2
1521 with hl_or_de hl_or_de
1522 uses areg
1523 gen mov a,%1.2
1524     cpi {const1,$1}
1525     jnz {label,1f}
1526     mov a,%1.1
1527     ora a
1528     jz {label,2f}
1529     1:
1530     move {const2,0},%2
1531     2:                                  yields %2
1532
1533 pat loc cmi tne and $1>=0 && $1<=255 && $2==2 && $4==2
1534 with exact areg hl_or_de
1535 gen cpi {const1,$1}
1536     jnz {label,1f}
1537     move {const2,0},%2
1538     1:                                  yields %2
1539 with hl_or_de hl_or_de
1540 uses areg
1541 gen mov a,%1.2
1542     cpi {const1,$1}
1543     jnz {label,1f}
1544     mov a,%1.1
1545     ora a
1546     jnz {label,1f}
1547     move {const2,0},%2
1548     1:                                  yields %2
1549
1550 pat loc cmi teq ior $1>=0 && $1<=255 && $2==2 && $4==2
1551 with exact areg hl_or_de
1552 gen cpi {const1,$1}
1553     jnz {label,1f}
1554     move {const2,1},%2
1555     1:                                  yields %2
1556 with hl_or_de hl_or_de
1557 uses areg
1558 gen mov a,%1.2
1559     cpi {const1,$1}
1560     jnz {label,1f}
1561     mov a,%1.1
1562     ora a
1563     jnz {label,1f}
1564     move {const2,1},%2
1565     1:                                  yields %2
1566
1567 pat loc cmi tne ior $1>=0 && $1<=255 && $2==2 && $4==2
1568 with exact areg hl_or_de
1569 gen cpi {const1,$1}
1570     jz {label,1f}
1571     move {const2,1},%2
1572     1:                                  yields %2
1573 with hl_or_de hl_or_de
1574 uses areg
1575 gen mov a,%1.2
1576     cpi {const1,$1}
1577     jnz {label,1f}
1578     mov a,%1.1
1579     ora a
1580     jz {label,2f}
1581     1:
1582     move {const2,1},%2
1583     2:                                  yields %2
1584
1585 pat loc cmi teq $1>=0 && $1<=255 && $2==2
1586 with exact areg
1587 uses hl_or_de={const2,0}
1588 gen cpi {const1,$1}
1589     jnz {label,1f}
1590     inx %a
1591     1:                                  yields %a
1592 with hl_or_de
1593 uses hl_or_de={const2,0}, areg
1594 gen mov a,%1.2
1595     cpi {const1,$1}
1596     jnz {label,1f}
1597     mov a,%1.1
1598     ora a
1599     jnz {label,1f}
1600     inx %a
1601     1:                                  yields %a
1602
1603
1604 pat loc cmi tne $1>=0 && $1<=255 && $2==2
1605 with exact areg
1606 uses hl_or_de={const2,0}
1607 gen cpi {const1,$1}
1608     jz {label,1f}
1609     inx %a
1610     1:                                  yields %a
1611 with hl_or_de
1612 uses hl_or_de={const2,1}, areg
1613 gen mov a,%1.2
1614     cpi {const1,$1}
1615     jnz {label,1f}
1616     mov a,%1.1
1617     ora a
1618     jnz {label,1f}
1619     dcx %a
1620     1:                                  yields %a
1621
1622 pat loc cmi $1>=0 && $1<=255 && $2==2
1623 with exact areg
1624 uses hl_or_de
1625 gen sui {const1,$1}
1626     mov %a.2,a
1627     rar.
1628     mov %a.1,a                          yields %a
1629 with                                    yields {const2,$1}
1630                                                 leaving cmi 2
1631
1632 pat loc cmi $1<0 && $2==2
1633 with exact areg                         yields {const2,0-1}
1634 with                                    yields {const2,$1}
1635                                                 leaving cmi 2
1636
1637 /*******************************************/
1638 /* Group 13: Branch instructions           */
1639 /*******************************************/
1640
1641 pat loc beq $1>=0 && $1<=255
1642 with exact reg
1643 uses reusing %1, areg=%1
1644 gen cpi {const1,$1}
1645     jz {label,$2}
1646 with                                    yields {const2,$1}
1647                                                 leaving beq $2
1648  
1649 pat loc bne $1>=0 && $1<=255
1650 with exact reg
1651 uses reusing %1, areg=%1
1652 gen cpi {const1,$1}
1653     jnz {label,$2}
1654 with                                    yields {const2,$1}
1655                                                 leaving bne $2
1656  
1657 pat bra
1658 with STACK
1659 gen jmp {label,$1}
1660
1661 pat blt
1662 with hl_or_de hl_or_de STACK
1663 uses areg
1664 gen mov a,%2.2
1665     sub %1.2
1666     mov a,%2.1
1667     sbb %1.1
1668     jm {label,$1}
1669
1670 pat ble
1671 with hl_or_de hl_or_de STACK
1672 uses areg
1673 gen mov a,%1.2
1674     sub %2.2
1675     mov a,%1.1
1676     sbb %2.1
1677     jp {label,$1}
1678
1679 pat beq
1680 with hl_or_de hl_or_de STACK
1681 uses areg
1682 gen mov a,%2.2
1683     cmp %1.2
1684     jnz {label,1f}
1685     mov a,%2.1
1686     cmp %1.1
1687     jz {label,$1}
1688     1:
1689
1690 pat bne
1691 with hl_or_de hl_or_de STACK
1692 uses areg
1693 gen mov a,%2.2
1694     cmp %1.2
1695     jnz {label,$1}
1696     mov a,%2.1
1697     cmp %1.1
1698     jnz {label,$1}
1699
1700 pat bge
1701 with hl_or_de hl_or_de STACK
1702 uses areg
1703 gen mov a,%2.2
1704     sub %1.2
1705     mov a,%2.1
1706     sbb %1.1
1707     jp {label,$1}
1708
1709 pat bgt
1710 with hl_or_de hl_or_de STACK
1711 uses areg
1712 gen mov a,%1.2
1713     sub %2.2
1714     mov a,%1.1
1715     sbb %2.1
1716     jm {label,$1}
1717
1718 pat zlt
1719 with STACK
1720 gen pop psw
1721     ora a
1722     jm {label,$1}
1723 with hl_or_de STACK
1724 gen mov a,%1.1
1725     ora a
1726     jm {label,$1}
1727
1728 pat zle
1729 with hl_or_de STACK
1730 uses areg
1731 gen xra a
1732     add %1.1
1733     jm {label,$1}
1734     jnz {label,1f}
1735     xra a
1736     add %1.2
1737     jz {label,$1}
1738     1:
1739
1740 pat zeq
1741 with hl_or_de STACK
1742 uses areg
1743 gen mov a,%1.1
1744     ora %1.2
1745     jz {label,$1}
1746
1747 pat zne
1748 with hl_or_de STACK
1749 uses areg
1750 gen mov a,%1.1
1751     ora %1.2
1752     jnz {label,$1}
1753
1754 pat zge
1755 with STACK
1756 gen pop psw
1757     ral.
1758     jnc {label,$1}
1759 with hl_or_de STACK
1760 gen mov a,%1.1
1761     ora a
1762     jp {label,$1}
1763
1764 pat zgt
1765 with hl_or_de STACK
1766 uses areg
1767 gen xra a
1768     add %1.1
1769     jm {label,1f}
1770     jnz {label,$1}
1771     xra a
1772     add %1.2
1773     jnz {label,$1}
1774     1:
1775
1776 pat lol zeq
1777 with STACK
1778 uses hlreg={const2,$1}, areg
1779 gen dad lb
1780     mov a,{m}
1781     inx hl
1782     ora {m}
1783     jz {label,$2}
1784
1785 pat lol zne
1786 with STACK
1787 uses hlreg={const2,$1}, areg
1788 gen dad lb
1789     mov a,{m}
1790     inx hl
1791     ora {m}
1792     jnz {label,$2}
1793
1794 pat ior zeq $1==2
1795 with hl_or_de hl_or_de STACK
1796 uses areg
1797 gen mov a,%1.1
1798     ora %1.2
1799     ora %2.1
1800     ora %2.2
1801     jz {label,$2}
1802
1803 pat ior zne $1==2
1804 with hl_or_de hl_or_de STACK
1805 uses areg
1806 gen mov a,%1.1
1807     ora %1.2
1808     ora %2.1
1809     ora %2.2
1810     jnz {label,$2}
1811
1812 /*********************************************/
1813 /* Group 14: Procedure call instructions     */
1814 /*********************************************/
1815
1816 pat cal
1817 kills ALL
1818 gen Call {label,$1}
1819
1820 pat cai
1821 with hlreg
1822 kills ALL
1823 uses dereg
1824 gen lxi de,{label,1f}
1825     push de
1826     pchl.
1827     1:
1828
1829 pat lfr $1==2                           yields de
1830
1831 pat lfr $1<=8
1832 with STACK
1833 uses areg={const1,$1/2}, hlreg={label,".fra"+$1}, dereg
1834 gen 1:
1835     dcx hl
1836     mov d,{m}
1837     dcx hl
1838     mov e,{m}
1839     push de
1840     dcr a
1841     jnz {label,1b}
1842
1843 pat lfr ret $1==$2                              leaving ret 0
1844
1845 pat ret $1==0
1846 with STACK
1847 uses hlreg
1848 gen move lb,hl
1849     sphl.
1850     pop lb
1851     ret.
1852
1853 pat ret $1==2
1854 with dereg STACK
1855 uses hlreg
1856 gen move lb,hl
1857     sphl.
1858     pop lb
1859     ret.
1860
1861 pat ret $1<=8
1862 with STACK
1863 uses areg={const1,$1/2}, hlreg={label,".fra"}, dereg
1864 gen 1:
1865     pop de
1866     mov {m},e
1867     inx hl
1868     mov {m},d
1869     inx hl
1870     dcr a
1871     jnz {label,1b}
1872     move lb,hl
1873     sphl.
1874     pop lb
1875     ret.
1876
1877 /******************************************/
1878 /* Group 15: Miscellaneous                */
1879 /******************************************/
1880
1881 pat asp $1<=0-6
1882 with STACK
1883 uses hlreg={const2,$1}
1884 gen dad sp
1885     sphl.
1886
1887 pat asp $1==0-4
1888 with STACK
1889 gen dcx sp
1890     dcx sp
1891     dcx sp
1892     dcx sp
1893
1894 pat asp $1==0-2
1895 with STACK
1896 gen dcx sp
1897     dcx sp
1898
1899 pat asp $1==0                   /* do nothing */
1900
1901 pat asp $1==2
1902 with exact src1or2
1903 with STACK
1904    gen inx sp
1905        inx sp
1906
1907 pat asp $1==4
1908 with exact src1or2                              leaving asp 2
1909 with STACK
1910    gen inx sp
1911        inx sp
1912        inx sp
1913        inx sp
1914
1915 pat asp $1>=6
1916 with exact src1or2                              leaving asp $1-2
1917 with STACK
1918   uses hlreg={const2,$1}
1919   gen dad sp
1920       sphl.
1921
1922 pat ass $1==2
1923 with hlreg STACK
1924 gen dad sp
1925     sphl.
1926
1927 pat blm
1928 kills ALL
1929 uses dereg={const2,$1}
1930 gen Call {label,".blm"}
1931
1932 pat bls
1933 with dereg
1934 kills ALL
1935 gen Call {label,".blm"}
1936
1937 pat csa
1938 kills ALL
1939 gen jmp {label,".csa"}
1940
1941 pat csb
1942 kills ALL
1943 gen jmp {label,".csb"}
1944
1945 pat dch                                         leaving loi 2
1946
1947 pat dup $1==2
1948 with src1or2                            yields %1 %1
1949
1950 pat dup $1==4
1951 with src1or2 src1or2                    yields %2 %1 %2 %1
1952
1953 pat dup
1954 kills ALL
1955 uses dereg={const2,$1}
1956 gen Call {label,".dup"}
1957
1958 pat dus $1==2
1959 with dereg
1960 kills ALL
1961 gen Call {label,".dup"}
1962
1963 pat exg $1==2
1964 with src1or2 src1or2                    yields %1 %2
1965
1966 pat exg defined($1)
1967 kills ALL
1968 uses dereg={const2,1}
1969 gen Call {label,".exg"}
1970
1971 pat fil
1972 uses hlreg={label,$1}
1973 gen shld {label,"hol0"+4}
1974
1975 pat gto
1976 with STACK
1977 gen lhld {label,$1+2}
1978     sphl.
1979     lhld {label,$1+4}
1980     move hl,lb
1981     lhld {label,$1}
1982     pchl.
1983
1984 pat lim
1985 uses hlreg
1986 gen lhld {label,".ignmask"}             yields hl
1987
1988 pat lin
1989 uses hlreg={const2,$1}
1990 gen shld {label,"hol0"}
1991
1992 pat lni
1993 uses hlreg
1994 gen lhld {label,"hol0"}
1995     inx hl
1996     shld {label,"hol0"}
1997
1998 pat lor $1==0                           yields lb
1999
2000 pat lor $1==1
2001 with STACK
2002 uses hlreg={const2,0}
2003 gen dad sp                              yields hl
2004
2005 pat lor $1==2
2006 uses hlreg
2007 gen lhld {label,".reghp"}               yields hl
2008
2009 pat lpb                                         leaving adp SL
2010
2011 pat mon
2012 kills ALL
2013 gen Call {label,".mon"}
2014
2015 pat nop
2016 kills ALL
2017 #ifdef DEBUG
2018 gen Call {label,".nop"}
2019 #endif
2020
2021 pat rck
2022 with hl_or_de STACK
2023
2024 pat rtt                                         leaving ret 0
2025
2026 pat sig
2027 with dereg
2028 uses hlreg
2029    gen lhld {label,".trapproc"}
2030        xchg.
2031        shld {label,".trapproc"}         yields de
2032 with STACK
2033 uses hlreg
2034    gen lhld {label,".trapproc"}
2035        xthl.
2036        shld {label,".trapproc"}
2037
2038 pat sim
2039 with hlreg
2040 gen shld {label,".ignmask"}
2041
2042 pat str $1==0
2043 with localbase
2044
2045 pat str $1==1
2046 with hlreg
2047 gen sphl.
2048
2049 pat str $1==2
2050 with hlreg
2051 gen shld {label,".reghp"}
2052
2053 pat trp
2054 kills ALL
2055 gen Call {label,".trp"}