Initial revision
authorgarde <none@none>
Thu, 17 Jan 1985 14:31:34 +0000 (14:31 +0000)
committergarde <none@none>
Thu, 17 Jan 1985 14:31:34 +0000 (14:31 +0000)
mach/i80/ncg/mach.c [new file with mode: 0644]
mach/i80/ncg/mach.h [new file with mode: 0644]
mach/i80/ncg/table [new file with mode: 0644]

diff --git a/mach/i80/ncg/mach.c b/mach/i80/ncg/mach.c
new file mode 100644 (file)
index 0000000..97951a5
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
+ *
+ *          This product is part of the Amsterdam Compiler Kit.
+ *
+ * Permission to use, sell, duplicate or disclose this software must be
+ * obtained in writing. Requests for such permissions may be sent to
+ *
+ *      Dr. Andrew S. Tanenbaum
+ *      Wiskundig Seminarium
+ *      Vrije Universiteit
+ *      Postbox 7161
+ *      1007 MC Amsterdam
+ *      The Netherlands
+ *
+ */
+
+/*
+ * machine dependent back end routines for the Intel 8080.
+ */
+
+con_part(sz,w) register sz; word w; {
+
+       while (part_size % sz)
+               part_size++;
+       if (part_size == 2)
+               part_flush();
+       if (sz == 1) {
+               w &= 0xFF;
+               if (part_size)
+                       w <<= 8;
+               part_word |= w;
+       } else {
+               assert(sz == 2);
+               part_word = w;
+       }
+       part_size += sz;
+}
+
+con_mult(sz) word sz; {
+       long l;
+
+       if (argval != 4)
+               fatal("bad icon/ucon size");
+       l = atol(str);
+       fprintf(codefile,".short\t%d\n",(int)l);
+       fprintf(codefile,".short\t%d\n",(int)(l>>16));
+}
+
+con_float() {
+
+       fatal("no reals");
+}
+
+
+prolog(nlocals) full nlocals; {
+
+       fprintf(codefile,"\tpush\tb\n\tlxi\th,0\n\tdad\tsp\n\tmov\tb,h\n\tmov\tc,l\n");
+       switch (nlocals) {
+       case 8: fprintf(codefile,"\tpush\th\n");
+       case 6: fprintf(codefile,"\tpush\th\n");
+       case 4: fprintf(codefile,"\tpush\th\n");
+       case 2: fprintf(codefile,"\tpush\th\n");
+       case 0: break;
+       default:
+               fprintf(codefile,"\tlxi\th,%d\n\tdad\tsp\n\tsphl\n",-nlocals);
+               break;
+       }
+}
+
+mes(type) word type ; {
+       int argt ;
+
+       switch ( (int)type ) {
+       case ms_ext :
+               for (;;) {
+                       switch ( argt=getarg(
+                           ptyp(sp_cend)|ptyp(sp_pnam)|sym_ptyp) ) {
+                       case sp_cend :
+                               return ;
+                       default:
+                               strarg(argt) ;
+                               fprintf(codefile,".define %s\n",argstr) ;
+                               break ;
+                       }
+               }
+       default :
+               while ( getarg(any_ptyp) != sp_cend ) ;
+               break ;
+       }
+}
+
+char *segname[] = {
+       ".text",
+       ".data",
+       ".data",
+       ".bss"
+};
diff --git a/mach/i80/ncg/mach.h b/mach/i80/ncg/mach.h
new file mode 100644 (file)
index 0000000..b455077
--- /dev/null
@@ -0,0 +1,22 @@
+#define ex_ap(y)        fprintf(codefile,".extern %s\n",y)
+#define in_ap(y)        /* nothing */
+
+#define newilb(x)       fprintf(codefile,"%s:\n",x)
+#define newdlb(x)       fprintf(codefile,"%s:\n",x)
+#define dlbdlb(x,y)     fprintf(codefile,"%s = %s\n",x,y)
+#define newlbss(l,x)       fprintf(codefile,"%s:.space\t%d\n",l,x);
+
+#define cst_fmt         "%d"
+#define off_fmt         "%d"
+#define ilb_fmt         "I%03x%x"
+#define dlb_fmt         "_%d"
+#define hol_fmt         "hol%d"
+
+#define hol_off         "%d+hol%d"
+
+#define con_cst(x)      fprintf(codefile,".word\t%d\n",x)
+#define con_ilb(x)      fprintf(codefile,".word\t%s\n",x)
+#define con_dlb(x)      fprintf(codefile,".word\t%s\n",x)
+
+#define id_first        '_'
+#define BSS_INIT        0
diff --git a/mach/i80/ncg/table b/mach/i80/ncg/table
new file mode 100644 (file)
index 0000000..5f4c8fa
--- /dev/null
@@ -0,0 +1,1772 @@
+/************************************************************/
+/************************************************************/
+/*******                                              ******/
+/*******   8 0 8 0    B A C K  E N D   T A B L E       ******/
+/*******                                              ******/
+/************************************************************/
+/************************************************************/
+
+
+EM_WSIZE = 2
+EM_PSIZE = 2
+EM_BSIZE = 4
+
+SL=4
+
+PROPERTIES
+
+areg                   /* the a-register */
+lbreg                  /* the registers used as localbase */
+reg                    /* the free registers */
+regpair                        /* register pairs bc, de and hl */
+regind                 /* register indirect */
+dereg                  /* de-register-pair */
+hlreg                  /* hl-register-pair */
+hlorde                 /* de- or hl-register-pair */
+localbase
+stackpointer
+psword                 /* consists of a-register + condition codes */
+mem                    /* not really a register property */
+
+
+REGISTERS
+
+a                      :areg,reg.
+b,c                    :lbreg.
+d,e,h,l                        :reg.
+lb("b")=b+c            :regpair, localbase, regind.
+de("d")=d+e            :regpair, regind, dereg, hlorde.
+hl("h")=h+l            :regpair, hlreg, hlorde.
+sp                     :stackpointer.
+psw=a                  :psword.
+m                      :mem.           /* not really a register */
+
+TOKENS
+
+const1                 = { INT num; } 1 num .
+const2                 = { INT num; } 2 num .
+label                  = { ADDR off; } 2 off .
+
+
+SETS
+
+reg1                   = reg + lbreg + mem .
+bdhsp                  = regpair + stackpointer .
+bdhpsw                 = regpair + psword .
+src1                   = reg .
+src2                   = hlorde + const2 .
+src1or2                        = src1 + src2 .
+
+INSTRUCTIONS
+
+/* aci const1:ro       kills a:cc      cost(2,7) .     */
+   adc reg1:ro         kills a:cc      cost(1,4) .
+   add reg1:ro         kills a:cc      cost(1,4) .
+/* adi const1:ro       kills a:cc      cost(2,7) .     */
+   ana reg1:ro         kills a:cc      cost(1,4) .
+   ani const1:ro       kills a:cc      cost(2,7) .
+   Call        "call" label:ro                 cost(3,17) .
+                          /* 'call' is a reserved word */
+/* cc  label:ro                        cost(11,3) .    */
+/* cm  label:ro                        cost(11,3) .    */
+   cma                 kills a         cost(1,4) .
+   cmc                 kills:cc        cost(1,4) .
+   cmp reg1:ro         kills:cc        cost(1,4) .
+/* cnc label:ro                        cost(11,3) .    */
+   cnz label:ro                        cost(11,3) .
+/* cp  label:ro                        cost(11,3) .    */
+/* cpe label:ro                        cost(11,3) .    */
+   cpi const1:ro       kills:cc        cost(11,3) .
+/* cpo label:ro                        cost(11,3) .    */
+/* cz  label:ro                        cost(11,3) .    */
+/* daa                 kills a:cc      cost(1,4) .     */
+   dad bdhsp:ro        kills hl:cc     cost(1,10) .
+   dcr reg1:rw:cc                      cost(1,5) .
+   dcx bdhsp:rw                        cost(1,5) .
+/* di                                  cost(1,4) .     */
+/* ei                                  cost(1,4) .     */
+/* hlt                                 cost(1,4) .     */
+/* in  const1:ro                       cost(2,10) .    */
+   inr reg1:rw:cc                      cost(1,5) .
+   inx bdhsp:rw                        cost(1,5) .
+   jc  label:ro                        cost(3,10) .
+   jm  label:ro                        cost(3,10) .
+   jmp label:ro                        cost(3,10) .
+   jnc label:ro                        cost(3,10) .
+   jnz label:ro                        cost(3,10) .
+   jp  label:ro                        cost(3,10) .
+/* jpe label:ro                        cost(3,10) .    */
+/* jpo label:ro                        cost(3,10) .    */
+   jz  label:ro                        cost(3,10) .
+   lda label:ro        kills a         cost(3,13) .
+   ldax        regind:ro       kills a         cost(1,7) .
+   lhld        label:ro        kills hl        cost(3,16) .
+   lxi bdhsp:wo,const2+label:ro        cost(3,10) .
+   mov reg1:wo,reg1:ro                 cost(1,5) .
+   mvi reg1:wo,const1:ro               cost(2,7) .
+/* nop                                 cost(1,0) .     */
+   ora reg1:ro         kills a:cc      cost(1,4) .
+/* ori const1:ro       kills a:cc      cost(2,7) .     */
+/* out const1:ro                       cost(2,10) .    */
+   pchl                                        cost(1,5) .
+   pop bdhpsw:wo                       cost(1,10) .
+   push        bdhpsw:ro                       cost(1,10) .
+   ral                 kills a:cc      cost(1,4) .
+   rar                 kills a:cc      cost(1,4) .
+/* rc                                  cost(1,8) .     */
+   ret                                 cost(1,10) .
+   rlc                 kills a:cc      cost(1,4) .
+/* rm                                  cost(1,8) .     */
+/* rnc                                 cost(1,8) .     */
+/* rnz                                 cost(1,8) .     */
+/* rp                                  cost(1,8) .     */
+/* rpe                                 cost(1,8) .     */
+/* rpo                                 cost(1,8) .     */
+   rrc                 kills a:cc      cost(1,4) .
+/* rst const1:ro                       cost(1,11) .    */
+/* rz                                  cost(1,8) .     */
+   sbb reg1:ro         kills a:cc      cost(1,4) .
+   sbi const1:ro       kills a:cc      cost(2,7) .
+   shld        label:ro                        cost(3,16) .
+   sphl                                        cost(1,5) .
+   sta label:ro                        cost(3,13) .
+   stax        regind:ro                       cost(1,7) .
+/* stc                 kills:cc        cost(1,4) .     */
+   sub reg1:ro         kills a:cc      cost(1,4) .
+/* sui const1:ro       kills a:cc      cost(2,7) .     */
+   xchg                        kills de hl     cost(1,4) .
+   xra reg1:ro         kills a:cc      cost(1,4) .
+/* xri const1:ro       kills a:cc      cost(2,7) .     */
+   xthl                        kills hl        cost(1,18) .
+   
+
+MOVES
+
+from reg to reg
+gen mov %2,%1
+
+from reg to regpair
+gen mov %2.2,%1
+    mvi %2.1,{const1,0}
+
+from const2 + label to bdhsp
+gen lxi %2,%1
+
+from const1 to reg
+gen mvi %2,%1
+
+from regpair to regpair
+gen mov %2.1,%1.1
+    mov %2.2,%1.2
+
+TESTS
+
+to test areg
+gen cmp %1
+
+STACKINGRULES
+
+from regpair to STACK
+gen push %1
+
+from reg to STACK
+uses hlorde
+gen move %1,%a
+    push %a
+
+from reg to STACK
+gen push hl
+    move %1,hl
+    xthl.
+
+from const2 + label to STACK
+uses hlorde
+gen lxi %a,%1
+    push %a
+
+from const2 + label to STACK
+gen push hl
+    move %1,hl
+    xthl.
+
+COERCIONS
+
+from STACK
+uses regpair
+gen pop %a                             yields %a
+
+from STACK
+uses hlorde
+gen pop %a                             yields %a.2
+
+from STACK
+uses areg
+gen dcx sp
+    pop psw
+    inx sp                             yields a
+
+from const2 + label
+uses regpair
+gen move %1,%a                         yields %a
+
+from const1
+uses reg
+gen move %1,%a                         yields %a
+
+from reg
+uses reusing %1, hlorde
+gen mov %a.2,%1
+    mvi %a.1,{const1,0}                        yields %a
+
+from hlorde                            yields %1.2
+
+PATTERNS
+
+/*********************************************/
+/* Group 1: Load instructions                */
+/*********************************************/
+
+pat loc                                        yields {const2,$1}
+pat ldc                                        yields {const2,highw($1)}
+                                              {const2,loww($1)}
+pat lol lol $1==$2
+uses hlreg={const2,$1}, dereg
+gen dad lb
+    mov e,m
+    inx hl
+    mov d,m                            yields de de
+
+pat lol
+uses hlreg={const2,$1}, dereg
+gen dad lb
+    mov e,m
+    inx hl
+    mov d,m                            yields de
+
+pat loe loe $1==$2
+uses hlreg
+gen lhld {label,$1}                    yields hl hl
+
+pat loe
+uses hlreg
+gen lhld {label,$1}                    yields hl
+
+pat lil
+uses hlreg={const2,$1}, dereg
+gen dad lb
+    mov e,m
+    inx hl
+    mov h,m
+    mov l,e
+    mov e,m
+    inx hl
+    mov d,m                            yields de
+
+pat lof
+with hlorde
+uses hlorde={const2,$1}
+gen dad de
+    mov e,m
+    inx hl
+    mov d,m                            yields de
+
+pat lal
+uses hlreg={const2,$1}
+gen dad lb                             yields hl
+
+pat lae                                        yields {label,$1}
+
+pat lxl $1==0                          yields lb
+
+pat lxl $1==1
+uses dereg, hlreg
+gen move {const2,SL},hl
+    dad lb
+    mov e,m
+    inx hl
+    mov d,m                            yields de
+
+pat lxl $1>1
+uses dereg, areg={const1,$1}, hlreg
+gen move lb,de
+    1:
+    lxi hl,{const2,SL}
+    dad de
+    mov e,m
+    inx hl
+    mov d,m
+    dcr a
+    jnz {label,"1b"}                   yields de
+
+pat lxa $1==0
+uses hlreg
+gen move {const2,SL},hl
+    dad lb                             yields hl
+
+pat lxa $1==1
+uses dereg, hlreg
+gen move {const2,SL},hl
+    dad lb
+    mov e,m
+    inx hl
+    mov d,m
+    lxi hl,{const2,SL}
+    dad de                             yields hl
+
+pat lxa $1>1 && $1<256
+uses dereg, hlreg, areg={const1,$1}
+gen move lb,de
+    1:
+    lxi hl,{const2,SL}
+    dad de
+    mov e,m
+    inx hl
+    mov d,m
+    dcr a
+    jnz {label,"1b"}
+    lxi hl,{const2,SL}
+    dad de                             yields hl
+
+pat loi $1==1
+with hlreg
+  uses reg
+  gen mov %a,m                         yields %a
+with dereg
+  uses areg    /*** ??? ***/
+  gen ldax de                          yields a
+with exact label
+   uses areg   /*** ??? ***/
+   gen lda %1                          yields a
+
+pat loi $1==2
+with exact label
+   gen lhld %1                         yields hl
+with hlreg
+   uses dereg
+   gen mov e,m
+       inx %1
+       mov d,m                         yields de
+
+pat loi $1==4
+with exact label
+   gen lhld %1
+       xchg.
+       lhld {label,%1.off+2}           yields hl de
+with hlreg
+   uses dereg, areg
+   gen mov e,m
+       inx %1
+       mov d,m
+       inx %1
+       mov a,m
+       inx %1
+       mov %1.1,m
+       mov %1.2,a                      yields hl de
+
+pat loi $1<=510
+with hlorde STACK
+uses hlorde={const2,$1-1}, areg
+gen dad de
+    mvi a,{const1,$1/2}
+    1:
+    mov d,m
+    dcx hl
+    mov e,m
+    dcx hl
+    push de
+    dcr a
+    jnz {label,"1b"}
+
+pat loi $1>=512
+with STACK
+uses dereg={const2,$1}
+gen Call {label,".loi"}
+
+pat los $1==2
+with dereg STACK
+gen Call {label,".loi"}
+
+pat ldl
+with STACK
+uses dereg, hlreg={const2,$1+3}
+gen dad lb
+    mov d,m
+    dcx hl
+    mov e,m
+    dcx hl
+    push de
+    mov d,m
+    dcx hl
+    mov e,m                            yields de
+
+pat lde
+with STACK
+gen lhld {label,$1+2}
+    push hl
+    lhld {label,$1}                    yields hl
+
+pat ldf
+with hlorde STACK
+uses hlorde={const2,$1+3}
+gen dad de
+    mov d,m
+    dcx hl
+    mov e,m
+    dcx hl
+    push de
+    mov d,m
+    dcx hl
+    mov e,m                            yields de
+
+pat lpi
+uses hlorde={label,$1}                 yields %a
+
+/******************************************/
+/* Group 2: Store instructions            */
+/******************************************/
+
+pat stl lol $1==$2
+with dereg                             yields de de leaving stl $1
+
+pat stl
+with dereg
+uses hlreg={const2,$1}
+gen dad lb
+    mov m,e
+    inx hl
+    mov m,d
+
+pat ste loe $1==$2
+with hlreg                             yields hl hl leaving ste $1
+
+pat ste
+with hlreg
+gen shld {label,$1}
+
+pat sil
+with dereg
+uses hlreg={const2,$1}, areg
+gen dad lb
+    mov a,m
+    inx hl
+    mov h,m
+    mov l,a
+    mov m,e
+    inx hl
+    mov m,d
+
+
+pat stf
+with hlorde STACK
+uses hlorde={const2,$1}
+gen dad de
+    pop de
+    mov m,e
+    inx hl
+    mov m,d
+
+pat sti $1==1
+with exact label areg
+   gen sta %1
+with hlreg reg
+   gen mov m,%2
+with exact dereg areg
+   gen stax de
+
+
+pat sti $1==2
+with exact label hlreg
+   gen shld %1
+with hlreg dereg
+   gen mov m,e
+       inx %1
+       mov m,d
+
+pat sti $1==4
+with exact label hlreg dereg
+   gen shld %1
+       xchg.
+       shld {label,%1.off+2}
+with exact label dereg hlreg
+    gen shld {label,%1.off+2}
+        xchg.
+        shld %1
+with hlreg dereg STACK
+   gen mov m,e
+       inx %1
+       mov m,d
+       inx %1
+       pop %2
+       mov m,%2.2
+       inx %1
+       mov m,%2.1
+
+pat sti $1<511
+with hlreg STACK
+uses areg ={const1,$1/2}, dereg
+gen 1:
+    pop de
+    mov m,e
+    inx %1
+    mov m,d
+    inx %1
+    dcr a
+    jnz {label,"1b"}
+
+pat sti
+with STACK
+uses dereg={const2,$1}
+gen Call {label,".sti"}
+
+pat sts $1==2
+with dereg STACK
+gen Call {label,".sti"}
+
+pat sdl
+with dereg STACK
+uses hlreg={const2,$1}
+gen dad lb
+    mov m,e
+    inx hl
+    mov m,d
+    inx hl
+    pop de
+    mov m,e
+    inx hl
+    mov m,d
+
+pat sde
+with hlreg STACK
+gen shld {label,$1}
+    pop hl
+    shld {label,$1+2}
+
+pat sdf
+with hlorde STACK
+uses hlorde={const2,$1}
+gen dad de
+    pop de
+    mov m,e
+    inx hl
+    mov m,d
+    inx hl
+    pop de
+    mov m,e
+    inx hl
+    mov m,d
+
+/****************************************/
+/* Group 3: Integer arithmetic          */
+/****************************************/
+
+pat adi $1==2
+with hlreg dereg
+gen dad de                             yields hl
+with dereg hlreg
+   gen dad de                          yields hl
+with hlreg hlreg
+   gen dad hl                          yields hl
+
+pat adi $1==4
+with STACK
+gen Call {label,".adi4"}
+
+pat sbi $1==2
+with hlorde hlorde
+uses areg
+gen mov a,%2.2
+    sub %1.2
+    mov %2.2,a
+    mov a,%2.1
+    sbb %1.1
+    mov %2.1,a                         yields %2
+
+pat sbi $1==4
+with STACK
+gen Call {label,".sbi4"}
+
+pat mli $1==2
+with STACK
+gen Call {label,".mli2"}               yields de
+
+pat mli $1==4
+with STACK
+gen Call {label,".mli4"}
+
+pat dvi $1==2
+with STACK
+uses areg={const1,129}
+gen Call {label,".dvi2"}               yields de
+
+pat dvi $1==4
+with STACK
+uses areg={const1,129}
+gen Call {label,".dvi4"}
+
+pat rmi $1==2
+with STACK
+uses areg={const1,128}
+gen Call {label,".dvi2"}               yields de
+
+pat rmi $1==4
+with STACK
+uses areg={const1,128}
+gen Call {label,".dvi4"}
+
+pat ngi $1==2
+with hlorde
+uses areg
+gen xra a
+    sub %1.2
+    mov %1.2,a
+    mvi a,{const1,0}
+    sbb %1.1
+    mov %1.1,a                         yields %1
+
+pat ngi $1==4
+with STACK
+gen Call {label,".ngi4"}
+
+pat sli $1==2
+with STACK
+gen Call {label,".sli2"}               yields de
+
+pat sli $1==4
+with STACK
+gen Call {label,".sli4"}
+
+pat sri $1==2
+with STACK
+uses areg={const1,1}
+gen Call {label,".sri2"}               yields de
+
+pat sri $1==4
+with STACK
+uses areg={const1,1}
+gen Call {label,".sri4"}
+
+/********************************************/
+/* Group 4: Unsigned arithmetic                    */
+/********************************************/
+
+pat adu                                                leaving adi $1
+
+pat sbu                                                leaving sbi $1
+
+pat mlu                                                leaving mli $1
+
+pat dvu $1==2
+with STACK
+uses areg={const1,1}
+gen Call {label,".dvi2"}               yields de
+
+pat dvu $1==4
+with STACK
+uses areg={const1,1}
+gen Call {label,".dvi4"}
+
+pat rmu $1==2
+with STACK
+uses areg={const1,0}
+gen Call {label,".dvi2"}               yields de
+
+pat rmu $1==4
+with STACK
+uses areg={const1,0}
+gen Call {label,".dvi4"}
+
+pat slu                                                leaving sli $1
+
+pat sru $1==2
+with STACK
+uses areg={const1,0}
+gen Call {label,".sri2"}               yields de
+
+pat sru $1==4
+with STACK
+uses areg={const1,0}
+gen Call {label,".sri4"}
+
+/********************************************/
+/* Group 6: Pointer arithmetic              */
+/********************************************/
+
+pat adp $1==0                  /* do nothing */
+
+pat adp $1==1
+with hlorde
+gen inx %1                             yields %1
+
+pat adp $1==2
+with hlorde
+gen inx %1
+    inx %1                             yields %1
+
+pat adp $1==0-1
+with hlorde
+gen dcx %1                             yields %1
+
+pat adp $1==0-2
+with hlorde
+gen dcx %1
+    dcx %1                             yields %1
+
+pat adp
+with hlorde
+uses hlorde={const2,$1}
+gen dad de                             yields hl
+
+pat ads $1==2                                  leaving adi 2
+
+pat sbs $1==2                                  leaving sbi 2
+
+/********************************************/
+/* Group 7: Increment/ decrement/ zero      */
+/********************************************/
+
+pat inc
+with hlorde
+gen inx %1                             yields %1
+
+pat inl
+uses hlreg={const2,$1}, dereg
+gen dad lb
+    inr m
+    jnz {label,"1f"}
+    inx hl
+    inr m
+    1:
+
+pat ine
+uses hlreg={label,$1}
+gen inr m
+    jnz {label,"1f"}
+    inx hl
+    inr m
+    1:
+
+pat dec
+with hlorde
+gen dcx %1                             yields %1
+
+pat del
+uses hlreg={const2,$1}, dereg
+gen dad lb
+    mov e,m
+    inx hl
+    mov d,m
+    dcx de
+    mov m,d
+    dcx hl
+    mov m,e
+
+pat dee
+uses hlreg
+gen lhld {label,$1}
+    dcx hl
+    shld {label,$1}
+
+pat zrl
+uses hlreg={const2,$1}, areg
+gen dad lb
+    xra a
+    mov m,a
+    inx hl
+    mov m,a
+
+pat zre
+uses hlreg={const2,0}
+gen shld {label,$1}
+
+pat zer $1==2                          yields {const2,0}
+
+pat zer $1==4                          yields {const2,0} {const2,0}
+
+pat zer $1<511
+with STACK
+uses reg={const1,$1/2}, hlorde={const2,0}
+gen 1:
+    push %b
+    dcr %a
+    jnz {label,"1b"}
+
+pat zer
+with STACK
+uses hlorde={const2,$1/2}, hlorde={const2,0}, areg
+gen xra a
+    1:
+    push %b
+    dcx %a
+    cmp %a.2
+    jnz {label,"1b"}
+    cmp %a.1
+    jnz {label,"1b"}
+
+/*****************************************/
+/* Group 8: Convert instructions        */
+/*****************************************/
+
+pat loc loc cii $1==$2
+
+pat loc loc cii $1==2 && $2==4
+with dereg
+uses hlreg
+gen move {const2,0},hl
+    mov a,d
+    ral.
+    jnc {label,"1f"}
+    lxi hl,{const2,0-1}
+    1:                                 yields hl de
+
+pat loc loc cii $1==4 && $2==2
+with hlreg dereg                       yields hl
+with dereg hlreg                       yields de
+
+pat loc loc cii $1==1 && $2==2
+with reg
+uses areg, hlorde
+gen move %1,a
+    move {const1,0},%b.1
+    move a,%b.2
+    ral.
+    jnc {label,"1f"}
+    mvi %b.1,{const1,255}
+    1:                                 yields %b
+with hlorde
+gen move {const1,0},%1.1
+    move %1.2,a
+    ral.
+    jnc {label,"1f"}
+    mvi %1.1,{const1,255}
+    1:                                 yields %1
+
+pat loc loc cii $1==1 && $2==4
+with reg
+   uses hlreg
+   gen move %1,l                       yields hl
+                                               leaving loc $1 loc $2 cii
+with hlreg
+   uses dereg
+   gen move {const1,0},h
+       move l,a
+       ral.
+       jnc {label,"1f"}
+       mvi h,{const1,255}
+       1:
+       mov e,h
+       mov d,h                         yields de hl
+
+pat cii
+with STACK
+uses areg={const1,1}
+gen Call {label,".cii"}
+
+pat loc loc ciu                                        leaving loc $1 loc $2 cuu
+pat loc loc ciu                                        leaving loc $1 loc $2 cuu
+
+pat cui                                                leaving cuu $1
+
+pat ciu                                                leaving cuu $1
+
+pat loc loc cuu $1==$2
+
+pat loc loc cuu $1==2 && $2==4
+with dereg                             yields {const2,0} de
+
+pat loc loc cuu $1==4 && $1==2
+with hlreg dereg                       yields hl
+with dereg hlreg                       yields de
+
+pat loc loc cuu $1==1 && $2==2
+with reg
+   uses hlorde
+   gen move %1,%a                      yields %a
+with hlorde
+   gen move {const1,0},%1.1            yields %1
+
+pat loc loc cuu $1==1 && $2==4
+with reg
+   uses hlorde
+   gen move %1,%a                      yields {const2,0} %a
+with hlorde
+   gen move {const1,0},%1.1            yields {const2,0} %1
+
+pat cuu
+with STACK
+uses areg={const1,0}
+gen Call {label,".cii"}
+
+/*****************************************/
+/* Group 9: Logical instructions         */
+/*****************************************/
+
+pat and $1==2
+with hlorde hlorde
+uses areg
+gen mov a,%1.2
+    ana %2.2
+    mov %2.2,a
+    mov a,%1.1
+    ana %2.1
+    mov %2.1,a                         yields %2
+
+pat and defined($1)
+with STACK
+uses dereg={const2,$1}
+gen Call {label,".and"}
+
+pat and !defined($1)
+with dereg STACK
+gen Call {label,".and"}
+
+pat ior $1==2
+with hlorde hlorde
+uses areg
+gen mov a,%1.2
+    ora %2.2
+    mov %2.2,a
+    mov a,%1.1
+    ora %2.1
+    mov %2.1,a                         yields %2
+
+pat ior defined($1)
+with STACK
+uses dereg={const2,$1}
+gen Call {label,".ior"}
+
+pat ior !defined($1)
+with dereg STACK
+gen Call {label,".ior"}
+
+pat xor $1==2
+with hlorde hlorde
+uses areg
+gen mov a,%1.2
+    xra %2.2
+    mov %2.2,a
+    mov a,%1.1
+    xra %2.1
+    mov %2.1,a                         yields %2
+
+pat xor defined($1)
+with STACK
+uses dereg={const2,$1}
+gen Call {label,".xor"}
+
+pat xor !defined($1)
+with dereg STACK
+gen Call {label,".xor"}
+
+pat com $1==2
+with hlorde
+uses areg
+gen mov a,%1.2
+    cma.
+    mov %1.2,a
+    mov a,%1.1
+    cma.
+    mov %1.1,a                         yields %1
+
+pat com
+with STACK
+uses dereg={const2,$1}
+gen Call {label,".com"}
+
+pat rol $1==2
+with dereg hlreg STACK
+uses areg
+gen mov a,e
+    ani {const1,15}
+    jz {label,"3f"}
+    1:
+    dad hl
+    jnc {label,"2f"}
+    inr l
+    2:
+    dcr a
+    jnz {label,"1b"}
+    3:                                 yields hl
+
+pat rol $1==4
+with hlorde hlorde STACK
+uses areg
+gen mov a,%1.2
+    pop %1
+    push lb
+    ani {const1,31}
+    jz {label,"2f"}
+    mov c,a
+    mov a,%1.1
+    ral.       /* set carry bit iff bit 31 is set */
+    1:
+    mov a,%2.2
+    ral.
+    mov %2.2,a
+    mov a,%2.1
+    ral.
+    mov %2.1,a
+    mov a,%1.2
+    ral.
+    mov %1.2,a
+    mov a,%1.1
+    ral.
+    mov %1.1,a
+    dcr c
+    jnz {label,"1b"}
+    2:
+    pop lb                             yields %1 %2
+
+pat ror $1==2
+with dereg hlreg STACK
+uses areg
+gen mov a,e
+    ani {const1,15}
+    jz {label,"2f"}
+    mov e,a
+    mov a,l
+    1:
+    rar.
+    mov a,h
+    rar.
+    mov h,a
+    mov a,l
+    rar.
+    mov l,a
+    dcr e
+    jnz {label,"1b"}
+    2:                                 yields hl
+
+pat ror $1==4
+with hlorde hlorde STACK
+uses areg
+gen mov a,%1.2
+    pop %1
+    push lb
+    ani {const1,31}
+    jz {label,"2f"}
+    mov c,a
+    mov a,%2.2
+    rar.
+    1:
+    mov a,%1.1
+    rar.
+    mov %1.1,a
+    mov a,%1.2
+    rar.
+    mov %1.2,a
+    mov a,%2.1
+    rar.
+    mov %2.1,a
+    mov a,%2.2
+    rar.
+    mov %2.2,a
+    dcr c
+    jnz {label,"1b"}
+    2:
+    pop lb                                     yields %1 %2
+
+/***********************************************/
+/* Group 10: Set instructions                 */
+/***********************************************/
+
+pat inn $1==2
+with STACK
+gen Call {label,".inn2"}                       yields de
+
+pat inn
+with STACK
+gen Call {label,".inn"}                                yields de
+
+pat set $1==2
+with dereg STACK
+gen Call {label,".set2"}                       yields de
+
+pat set defined($1)
+with STACK
+uses dereg={const2,$1}
+gen Call {label,".set"}
+
+pat set !defined($1)
+with dereg STACK
+gen Call {label,".set"}
+
+/***********************************************/
+/* Group 11: Array instructions               */
+/***********************************************/
+
+pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)==0 leaving adi 2
+pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)!=0 leaving adi 2 adp 0-rom($1,1)
+
+pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)==0
+with hlreg
+gen dad hl                             yields hl leaving adi 2
+
+pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)!=0
+with hlreg
+uses dereg={const2,0-rom($1,1)}
+gen dad de
+    dad hl                             yields hl leaving adi 2
+
+pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)==0
+with hlreg
+gen dad hl
+    dad hl                             yields hl leaving adi 2
+
+pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)!=0
+with hlreg
+uses dereg={const2,0-rom($1,1)}
+gen dad de
+    dad hl
+    dad hl                             yields hl leaving adi 2
+
+pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)==0
+with hlreg
+gen dad hl
+    dad hl
+    dad hl                             yields hl leaving adi 2
+
+pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)!=0
+with hlreg
+uses dereg={const2,0-rom($1,1)}
+gen dad de
+    dad hl
+    dad hl
+    dad hl                             yields hl leaving adi 2
+
+pat lar $1==2
+with STACK
+gen Call {label,".lar2"}
+
+pat lar defined($1)
+gen Call {label,"eunimpl"}
+
+pat lar !defined($1)
+with hlorde STACK
+gen mov a,%1.2
+    cpi {const1,2}
+    cnz {label,"eunimpl"}
+    mov a,%1.1
+    ora a
+    cnz {label,"eunimpl"}
+    Call {label,".lar2"}
+
+pat sar $1==2
+with STACK
+gen Call {label,".sar2"}
+
+pat sar defined($1)
+gen Call {label,"eunimpl"}
+
+pat sar !defined($1)
+with hlorde STACK
+gen mov a,%1.2
+    cpi {const1,2}
+    cnz {label,"eunimpl"}
+    mov a,%1.1
+    ora a
+    cnz {label,"eunimpl"}
+    Call {label,".sar2"}
+
+pat aar $1==2
+with STACK
+gen Call {label,".aar2"}
+
+pat aar defined($1)
+gen Call {label,"eunimpl"}
+
+pat aar !defined($1)
+with hlorde STACK
+gen mov a,%1.2
+    cpi {const1,2}
+    cnz {label,"eunimpl"}
+    mov a,%1.1
+    ora a
+    cnz {label,"eunimpl"}
+    Call {label,".aar2"}
+
+/***********************************************/
+/* Group 12: Compare instructions              */
+/***********************************************/
+
+pat cmi $1==2                                  leaving sbi 2
+
+pat cmi $1==4
+with STACK
+uses areg={const1,1}
+gen Call {label,".cmi4"}               yields de
+
+pat cmu $1==2
+with hlorde hlorde
+kills hlorde           /***** ?????? ******/
+uses areg
+gen mov a,%2.1
+    cmp %1.1
+    jz {label,"2f"}
+    jc {label,"1f"}  
+    0:
+    lxi %2,{const2,1}
+    jmp {label,"3f"}
+    1:
+    lxi %2,{const2,0-1}
+    jmp {label,"3f"}
+    2:
+    mov a,%2.2
+    cmp %1.2
+    jc {label,"1b"}
+    jnz {label,"0b"}
+    lxi %2,{const2,0}
+    3:                                 yields %2
+
+pat cmu $1==4
+with STACK
+uses areg={const1,0}
+gen Call {label,".cmi4"}               yields de
+
+pat cms $1==2                                  leaving cmi 2
+
+pat cms defined($1)
+with STACK
+uses dereg={const2,$1}
+gen Call {label,".cms"}                        yields de
+
+pat cms !defined($1)
+with dereg STACK
+gen Call {label,".cms"}                        yields de
+
+pat cmp                                                leaving cmu 2
+
+pat tlt
+with hlorde
+gen mov a,%1.1
+    ral.
+    mvi a,{const1,0}
+    mov %1.1,a
+    adc a
+    mov %1.2,a                         yields %1
+
+pat tle
+with hlorde
+uses hlorde={const2,1}, areg
+gen xra a
+    add %1.1
+    jm {label,"2f"}
+    jnz {label,"1f"}
+    xra a
+    add %1.2
+    jz {label,"2f"}
+    1:
+    dcx %a
+    2:                                 yields %a
+
+pat teq
+with hlorde
+gen mov a,%1.1
+    ora %1.2
+    move {const2,0},%1
+    jnz {label,"1f"}
+    inx %1
+    1:                                 yields %1
+
+pat tne
+with hlorde
+gen mov a,%1.1
+    ora %1.2
+    move {const2,0},%1
+    jz {label,"1f"}
+    inx %1
+    1:                                 yields %1
+
+pat tge
+with hlorde
+gen mov a,%1.1
+    ral.
+    cmc.
+    mvi a,{const1,0}
+    mov %1.1,a
+    adc a
+    mov %1.2,a                         yields %1
+
+pat tgt
+with hlorde
+uses hlorde={const2,0}, areg
+gen xra a
+    add %1.1
+    jm {label,"2f"}
+    jnz {label,"1f"}
+    xra a
+    add %1.2
+    jz {label,"2f"}
+    1:
+    inx %a
+    2:                                 yields %a
+
+pat loc cmi teq and $1>=0 && $1<=255 && $2==2 && $4==2
+with exact areg hlorde
+gen cpi {const1,$1}
+    jz {label,"1f"}
+    move {const2,0},%2
+    1:                                 yields %2
+with                                   yields {const2,$1}
+                                               leaving cmi 2 teq and 2
+
+pat loc cmi tne and $1>=0 && $1<=255 && $2==2 && $4==2
+with exact areg hlorde
+gen cpi {const1,$1}
+    jnz {label,"1f"}
+    move {const2,0},%2
+    1:                                 yields %2
+with                                   yields {const2,$1}
+                                               leaving cmi 2 tne and 2
+
+pat loc cmi teq ior $1>=0 && $1<=255 && $2==2 && $4==2
+with exact areg hlorde
+gen cpi {const1,$1}
+    jnz {label,"1f"}
+    move {const1,1},%2.2
+    1:                                 yields %2
+with                                   yields {const2,$1}
+                                               leaving cmi 2 teq ior 2
+
+pat loc cmi tne ior $1>=0 && $1<=255 && $2==2 && $4==2
+with exact areg hlorde
+gen cpi {const1,$1}
+    jz {label,"1f"}
+    move {const1,1},%2.2
+    1:                                 yields %2
+with                                   yields {const2,$1}
+                                               leaving cmi 2 tne ior 2
+
+pat loc cmi teq $1>=0 && $1<=255 && $2==2
+with exact areg
+uses hlorde={const2,0}
+gen cpi {const1,$1}
+    jnz {label,"1f"}
+    inx %a                             yields %a
+with                                   yields {const2,$1}
+                                               leaving cmi 2 teq
+
+
+pat loc cmi tne $1>=0 && $1<=255 && $2==2
+with exact areg
+uses hlorde={const2,0}
+gen cpi {const1,$1}
+    jz {label,"1f"}
+    inx %a                             yields %a
+with                                   yields {const2,$1}
+                                               leaving cmi 2 tne
+
+pat loc cmi $1>=0 && $1<=255 && $2==2
+with exact areg
+uses hlorde
+gen sbi {const1,$1}
+    mov %a.2,a
+    rar.
+    mov %a.1,a                         yields %a
+with                                   yields {const2,$1}
+                                               leaving cmi 2
+
+pat loc cmi $1<0 && $2==2
+with exact areg                                yields {const2,0-1}
+with                                   yields {const2,$1}
+                                               leaving cmi 2
+
+/*******************************************/
+/* Group 13: Branch instructions           */
+/*******************************************/
+
+pat bra
+with STACK
+gen jmp {label,$1}
+
+pat blt
+with hlorde hlorde STACK
+uses areg
+gen mov a,%2.2
+    sub %1.2
+    mov a,%2.1
+    sbb %1.1
+    jm {label,$1}
+
+pat ble
+with hlorde hlorde STACK
+uses areg
+gen mov a,%1.2
+    sub %2.2
+    mov a,%1.1
+    sbb %2.1
+    jp {label,$1}
+
+pat beq
+with hlorde hlorde STACK
+uses areg
+gen mov a,%2.2
+    cmp %1.2
+    jnz {label,"1f"}
+    mov a,%2.1
+    cmp %1.1
+    jz {label,$1}
+    1:
+
+pat bne
+with hlorde hlorde STACK
+uses areg
+gen mov a,%2.2
+    cmp %1.2
+    jnz {label,$1}
+    mov a,%2.1
+    cmp %1.1
+    jnz {label,$1}
+
+pat bge
+with hlorde hlorde STACK
+uses areg
+gen mov a,%2.2
+    sub %1.2
+    mov a,%2.1
+    sbb %1.1
+    jp {label,$1}
+
+pat bgt
+with hlorde hlorde STACK
+uses areg
+gen mov a,%1.2
+    sub %2.2
+    mov a,%1.1
+    sbb %2.1
+    jm {label,$1}
+
+pat zlt
+with STACK
+gen pop psw
+    ral.
+    jc {label,$1}
+
+pat zle
+with hlorde STACK
+uses areg
+gen xra a
+    add %1.1
+    jm {label,$1}
+    jnz {label,"1f"}
+    xra a
+    add %1.2
+    jz {label,$1}
+    1:
+
+pat zeq
+with hlorde STACK
+uses areg
+gen mov a,%1.1
+    ora %1.2
+    jz {label,$1}
+
+pat zne
+with hlorde STACK
+uses areg
+gen mov a,%1.1
+    ora %1.2
+    jnz {label,$1}
+
+pat zge
+with STACK
+gen pop psw
+    ral.
+    jnc {label,$1}
+
+pat zgt
+with hlorde STACK
+uses areg
+gen xra a
+    add %1.1
+    jm {label,"1f"}
+    jnz {label,$1}
+    xra a
+    add %1.2
+    jnz {label,$1}
+    1:
+
+pat lol zeq
+uses hlreg={const2,$1}
+gen dad lb
+    mov a,m
+    inx hl
+    ora m
+    jz {label,$2}
+
+pat lol zne
+uses hlreg={const2,$1}
+gen dad lb
+    mov a,m
+    inx hl
+    ora m
+    jnz {label,$2}
+
+pat ior zeq $1==2
+with hlorde hlorde
+gen mov a,%1.1
+    ora %1.2
+    ora %2.1
+    ora %2.2
+    jz {label,$2}
+
+pat ior zne $1==2
+with hlorde hlorde
+gen mov a,%1.1
+    ora %1.2
+    ora %2.1
+    ora %2.2
+    jnz {label,$2}
+
+/*********************************************/
+/* Group 14: Procedure call instructions     */
+/*********************************************/
+
+pat cal
+with STACK
+gen Call {label,$1}
+
+pat cai
+with hlreg STACK
+uses dereg
+gen lxi de,{label,"1f"}
+    push de
+    pchl.
+    1:
+
+pat lfr $1==2                          yields de
+
+pat lfr        $1<=8
+with STACK
+uses areg={const1,$1/2}, hlreg={label,".fra"+$1}
+gen 1:
+    dcx hl
+    mov d,m
+    dcx hl
+    mov e,m
+    push de
+    dcr a
+    jnz {label,"1b"}
+
+pat lfr ret $1==$2                             leaving ret 0
+
+pat ret $1==0
+with STACK
+uses hlreg
+gen move lb,hl
+    sphl.
+    pop lb
+    ret.
+
+pat ret $1==2
+with dereg STACK
+uses hlreg
+gen move lb,hl
+    sphl.
+    pop lb
+    ret.
+
+pat ret $1<=8
+with STACK
+uses areg={const1,$1/2}, hlreg={label,".fra"}
+gen 1:
+    pop de
+    mov m,e
+    inx hl
+    mov m,d
+    inx hl
+    dcr a
+    jnz {label,"1b"}
+    move lb,hl
+    sphl.
+    pop lb
+    ret.
+
+/******************************************/
+/* Group 15: Miscellaneous               */
+/******************************************/
+
+pat asp $1<=0-6
+with STACK
+uses hlreg={const2,$1}
+gen dad sp
+    sphl.
+
+pat asp $1==0-4
+with STACK
+gen dcx sp
+    dcx sp
+    dcx sp
+    dcx sp
+
+pat asp $1==0-2
+with STACK
+gen dcx sp
+    dcx sp
+
+pat asp $1==0                  /* do nothing */
+
+pat asp $1==2
+with exact src1or2
+with STACK
+   gen inx sp
+       inx sp
+
+pat asp $1==4
+with exact src1or2                             leaving asp 2
+with STACK
+   gen inx sp
+       inx sp
+       inx sp
+       inx sp
+
+pat asp $1>=6
+with exact src1or2                             leaving asp $1-2
+with STACK
+  uses hlreg={const2,$1}
+  gen dad sp
+      sphl.
+
+pat ass $1==2
+with hlreg STACK
+gen dad sp
+    sphl.
+
+pat blm
+with STACK
+uses dereg={const2,$1}
+gen Call {label,".blm"}
+
+pat bls
+with dereg STACK
+gen Call {label,".blm"}
+
+pat csa
+with STACK
+gen jmp {label,".csa"}
+
+pat csb
+with STACK
+gen jmp {label,".csb"}
+
+pat dch                                                leaving loi 2
+
+pat dup $1==2
+with hlorde                            yields %1 %1
+
+pat dup $1==4
+with hlorde hlorde                     yields %2 %1 %2 %1
+
+pat dup
+with STACK
+uses dereg={const2,$1}
+gen Call {label,".dup"}
+
+pat dus $1==2
+with dereg STACK
+gen Call {label,".dup"}
+
+pat exg $1==2
+with src2 src2                         yields %1 %2
+
+pat exg defined($1)
+with STACK
+uses dereg={const2,1}
+gen Call {label,".exg"}
+
+pat fil
+gen lxi hl,{label,$1}
+    shld {label,"hol0"+4}
+
+pat gto
+with STACK
+gen lhld {label,$1+2}
+    sphl.
+    lhld {label,$1+4}
+    move hl,lb
+    lhld {label,$1}
+    pchl.
+
+pat lim
+gen lhld {label,".ignmask"}            yields hl
+
+pat lin
+uses hlreg={const2,$1}
+gen shld {label,"hol0"}
+
+pat lni
+gen lhld {label,"hol0"}
+    inx hl
+    shld {label,"hol0"}
+
+pat lor $1==0                          yields lb
+
+pat lor $1==1
+with STACK
+uses hlreg={const2,0}
+gen dad sp                             yields hl
+
+pat lor $1==2
+gen lhld {label,".reghp"}              yields hl
+
+pat lpb                                                leaving adp SL
+
+pat mon
+with STACK
+gen Call {label,".mon"}
+
+pat nop
+with STACK
+gen Call {label,".nop"}
+
+pat rck
+with hlorde STACK
+
+pat rtt                                                leaving ret 0
+
+pat sig
+with dereg
+   gen lhld {label,".trapproc"}
+       xchg.
+       shld {label,".trapproc"}                yields de
+with STACK
+   gen lhld {label,".trapproc"}
+       xthl.
+       shld {label,".trapproc"}
+
+pat sim
+with hlreg
+gen shld {label,".ignmask"}
+
+pat str $1==0
+with localbase
+
+pat str $1==1
+with STACK
+gen pop psw
+
+pat str $1==2
+with hlreg
+gen shld {label,".reghp"}
+
+pat trp
+with STACK
+gen Call {label,".trp"}
+
+pat lof                        gen Call {label,"eunimpl"}
+pat ldf                        gen Call {label,"eunimpl"}
+pat stf                        gen Call {label,"eunimpl"}
+pat sdf                        gen Call {label,"eunimpl"}
+pat adf                        gen Call {label,"eunimpl"}
+pat sbf                        gen Call {label,"eunimpl"}
+pat mlf                        gen Call {label,"eunimpl"}
+pat dvf                        gen Call {label,"eunimpl"}
+pat ngf                        gen Call {label,"eunimpl"}
+pat fif                        gen Call {label,"eunimpl"}
+pat fef                        gen Call {label,"eunimpl"}
+pat zrf                        gen Call {label,"eunimpl"}
+pat cfi                        gen Call {label,"eunimpl"}
+pat cif                        gen Call {label,"eunimpl"}
+pat cuf                        gen Call {label,"eunimpl"}
+pat cff                        gen Call {label,"eunimpl"}
+pat cfu                        gen Call {label,"eunimpl"}
+pat cmf                        gen Call {label,"eunimpl"}