--- /dev/null
+/************************************************************/
+/************************************************************/
+/******* ******/
+/******* 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"}