ack/mach/i80/ncg/table
garde a849b751a9 src1 and src2 extended.
Errors in 'pat loc cmi teq' and 'pat loc cmi tne' recovered.
Second stack-pattern for 'pat zlt' and 'pat zge' added.
Patterns for 'lil loc adi sil', 'lil inc sil', 'lil dec sil'
and 'sil lil' added.
1985-01-22 19:55:11 +00:00

1841 lines
30 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 .
immediate2 = const2 + label .
src1 = reg + const1 .
src2 = hlorde + const2 + label .
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,immediate2: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 immediate2 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 /* just a dummy test, never used */
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 immediate2 to STACK
uses hlorde
gen lxi %a,%1
push %a
from immediate2 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 immediate2
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
gen ldax de yields a
with exact label
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 sil lil $1==$2
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 yields de
pat lil loc adi sil $1==$4 && $3==2
with STACK
uses hlreg={const2,$1}, dereg, areg
gen dad lb
mov e,m
inx hl
mov h,m
mov l,e
mov e,m
inx hl
mov d,m
push hl
lxi hl,{const2,$2}
dad de
xchg.
pop hl
mov m,d
dcx hl
mov m,e
pat lil inc sil $1==$3
uses hlreg={const2,$1}
gen dad lb
mov e,m
inx hl
mov h,m
mov l,e
inr m
jnz {label,"1f"}
inx hl
inr m
1:
pat lil dec sil $1==$3
uses hlreg={const2,$1}
gen dad lb
mov e,m
inx hl
mov h,m
mov l,e
mov e,m
inx hl
mov d,m
dcx de
mov m,d
dcx hl
mov m,e
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
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
1: 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
1: 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}
with hlorde
gen mov a,%1.1
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}
with hlorde
gen mov a,%1.1
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"}