ack/mach/i80/ncg/table
1985-01-17 14:31:34 +00:00

1773 lines
29 KiB
Plaintext

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