ack/mach/i80/ncg/table

2292 lines
39 KiB
Plaintext
Raw Normal View History

1985-01-17 14:31:34 +00:00
/************************************************************/
/************************************************************/
/******* ******/
/******* 8 0 8 0 B A C K E N D T A B L E ******/
/******* ******/
/************************************************************/
/************************************************************/
1994-06-24 14:02:31 +00:00
rcsid = "$Id$"
1985-03-18 12:55:07 +00:00
1985-01-17 14:31:34 +00:00
EM_WSIZE = 2
EM_PSIZE = 2
EM_BSIZE = 4
SL=4
STACKHELPERS=128
1985-01-17 14:31:34 +00:00
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 */
1985-03-04 13:42:38 +00:00
hl_or_de /* de- or hl-register-pair */
1985-01-17 14:31:34 +00:00
localbase
stackpointer
1985-03-04 13:42:38 +00:00
psword
1985-01-17 14:31:34 +00:00
REGISTERS
a :areg,reg.
b,c :lbreg.
d,e,h,l :reg.
lb("b")=b+c :regpair, localbase, regind.
1985-03-04 13:42:38 +00:00
de("d")=d+e :regpair, regind, dereg, hl_or_de.
hl("h")=h+l :regpair, hlreg, hl_or_de.
1985-01-17 14:31:34 +00:00
sp :stackpointer.
1985-03-04 13:42:38 +00:00
psw=a :psword. /* in fact psw also includes
condition codes */
1985-01-17 14:31:34 +00:00
TOKENS
1985-03-04 13:42:38 +00:00
const1 = { INT num; } 1 num.
const2 = { INT num; } 2 num.
smallpconst2 = { INT num; } 2 num. /* Byte-sized positive constant */
smallnconst2 = { INT num; } 2 num. /* Byte-sized negative constant */
1985-03-04 13:42:38 +00:00
label = { ADDR off; } 2 off.
plabel = { ADDR off; INT param; } 2 off param.
1985-03-04 13:42:38 +00:00
m = { } 2 cost(0,3) "m".
comment = { ADDR str; } 2 "! " str.
1985-01-17 14:31:34 +00:00
SETS
1985-03-04 13:42:38 +00:00
reg1 = reg + lbreg + m.
b_d_h_sp = regpair + stackpointer.
b_d_h_psw = regpair + psword.
immediate = smallpconst2 + smallnconst2 + const2 + label.
1985-03-04 13:42:38 +00:00
src1 = reg.
src2 = hl_or_de + const2 + label.
src1or2 = src1 + src2.
1985-01-17 14:31:34 +00:00
INSTRUCTIONS
1985-03-04 13:42:38 +00:00
/* 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 "call" plabel:ro cost(3,17).
1985-01-17 14:31:34 +00:00
/* 'call' is a reserved word */
1985-03-04 13:42:38 +00:00
/* cc label:ro cost(3,14). */
/* cm label:ro cost(3,14). */
cma kills a cost(3,14).
cmc kills:cc cost(1, 4).
cmp reg1:ro kills:cc cost(1, 4).
/* cnc label:ro cost(3,14). */
cnz label:ro cost(3,14).
/* cp label:ro cost(3,14). */
/* cpe label:ro cost(3,14). */
cpi const1:ro kills:cc cost(2, 7).
/* cpo label:ro cost(3,14). */
/* cz label:ro cost(3,14). */
/* daa kills a:cc cost(1, 4). */
data1 ".data1" const1:ro.
data2 ".data2" const2:ro.
1985-03-04 13:42:38 +00:00
dad b_d_h_sp:ro kills hl:cc cost(1,10).
dcr reg+lbreg:rw:cc cost(1, 5).
dcr m:rw:cc cost(1, 7).
dcx b_d_h_sp:rw cost(1, 5).
/* di cost(1, 4). */
/* ei cost(1, 4). */
/* hlt cost(1, 4). */
/* in const1:ro cost(2,10). */
inr reg+lbreg:rw:cc cost(1, 5).
inr m:rw:cc cost(1, 7).
inx b_d_h_sp: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).
1985-03-04 13:42:38 +00:00
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 b_d_h_sp:wo,immediate:ro cost(3,10).
mov reg+lbreg:wo,reg+lbreg:ro cost(1, 5).
mov m:wo,reg1:ro cost(1, 4).
mov reg1:wo,m:ro cost(1, 4).
mvi reg1:wo,const1:ro cost(2, 7).
nop comment:ro cost(1, 3).
1985-03-04 13:42:38 +00:00
ora reg1:ro kills a:cc cost(1, 4).
ori const1:ro kills a:cc cost(2, 7).
1985-03-04 13:42:38 +00:00
/* out const1:ro cost(2,10). */
pchl cost(1, 5).
pop b_d_h_psw:wo cost(1,10).
push b_d_h_psw: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).
1985-03-04 13:42:38 +00:00
/* rz cost(1, 8). */
sbb reg1:ro kills a:cc cost(1, 4).
sbi const1:ro kills a:cc cost(2, 7).
1985-03-04 13:42:38 +00:00
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).
1985-03-04 13:42:38 +00:00
xthl kills hl cost(1,18).
1985-01-17 14:31:34 +00:00
MOVES
from reg to reg
gen mov %2,%1
1985-03-04 13:42:38 +00:00
from const1 %num==0 to areg
gen xra a
from const1 to reg
gen mvi %2,%1
1985-01-17 14:31:34 +00:00
1985-03-04 13:42:38 +00:00
from immediate to b_d_h_sp
1985-01-17 14:31:34 +00:00
gen lxi %2,%1
from reg to regpair
gen mov %2.2,%1
mvi %2.1,{const1,0}
1985-01-17 14:31:34 +00:00
from regpair to regpair
gen mov %2.1,%1.1
mov %2.2,%1.2
TESTS
1985-03-04 13:42:38 +00:00
to test areg /* dummy test, never used */
gen ora a
1985-01-17 14:31:34 +00:00
STACKINGRULES
from regpair to STACK
gen push %1
1985-03-04 13:42:38 +00:00
from immediate + reg to STACK
uses hl_or_de
1985-01-17 14:31:34 +00:00
gen move %1,%a
push %a
1985-03-04 13:42:38 +00:00
from immediate + reg to STACK
1985-01-17 14:31:34 +00:00
gen push hl
move %1,hl
xthl.
COERCIONS
from STACK
uses regpair
gen pop %a yields %a
from STACK
1985-03-04 13:42:38 +00:00
uses hl_or_de
1985-01-17 14:31:34 +00:00
gen pop %a yields %a.2
from STACK
uses areg
gen dcx sp
pop psw
inx sp yields a
from immediate
1985-01-17 14:31:34 +00:00
uses regpair
gen move %1,%a yields %a
1985-03-04 13:42:38 +00:00
from hl_or_de
uses hl_or_de
gen xchg. yields %a
from regpair
uses regpair
1985-01-17 14:31:34 +00:00
gen move %1,%a yields %a
from reg
1985-03-04 13:42:38 +00:00
uses reusing %1, hl_or_de
gen move %1,%a.2
move {const1,0},%a.1 yields %a
from hl_or_de yields %1.2
1985-01-17 14:31:34 +00:00
from smallpconst2
yields {const2, %1.num}
from smallnconst2
yields {const2, %1.num}
1985-03-04 13:42:38 +00:00
from const2
uses hl_or_de
gen move %1,%a yields %a.2
1985-01-17 14:31:34 +00:00
1985-03-04 13:42:38 +00:00
from hl_or_de
uses areg
1985-03-04 13:42:38 +00:00
gen move %1.2,a yields a
1985-01-17 14:31:34 +00:00
PATTERNS
/*********************************************/
/* Group 1: Load instructions */
/*********************************************/
pat loc ufit($1, 8)
yields {smallpconst2, $1}
pat loc sfit($1, 8) && ($1<0)
yields {smallnconst2, $1}
pat loc
yields {const2, $1}
pat ldc
yields {const2, highw($1)} {const2, loww($1)}
1985-01-17 14:31:34 +00:00
#ifdef USE_I80_RSTS
pat lol $1==0-2
uses dereg, hlreg
gen
rst {const1, 1}
yields de
pat lol $1==0-4
uses dereg, hlreg
gen
rst {const1, 2}
yields de
pat lol $1==4
uses dereg, hlreg
gen
rst {const1, 3}
yields de
#endif
1985-01-17 14:31:34 +00:00
pat lol ($1>0) && ($1<=STACKHELPERS)
uses dereg, hlreg
gen
Call {plabel, ".fload", $1}
yields de
pat lol ($1<0) && ($1>=0-STACKHELPERS)
uses dereg, hlreg
gen
Call {plabel, ".floadn", 0-$1}
yields de
pat lol
uses dereg
gen
dad lb
mov e, {m}
inx hl
mov d, {m}
1985-01-17 14:31:34 +00:00
pat loe
uses hlreg
gen
lhld {label,$1}
yields hl
1985-01-17 14:31:34 +00:00
pat lil
leaving
lol $1
loi 2
1985-01-17 14:31:34 +00:00
pat lof
leaving
adp $1
loi 2
pat lal ($1>0) && ($1<=STACKHELPERS)
uses hlreg
gen
Call {plabel, ".faddr", $1}
yields hl
pat lal ($1<0) && ($1>=0-STACKHELPERS)
uses hlreg
gen
Call {plabel, ".faddrn", 0-$1}
yields hl
1985-01-17 14:31:34 +00:00
pat lal
uses hlreg={const2,$1}
gen
dad lb
yields hl
1985-01-17 14:31:34 +00:00
pat lae
yields {label,$1}
1985-01-17 14:31:34 +00:00
pat lxl $1==0
yields lb
1985-01-17 14:31:34 +00:00
pat lxl $1==1
leaving
lxa 0
loi 2
1985-01-17 14:31:34 +00:00
1985-03-04 13:42:38 +00:00
pat lxl $1>1 && $1<256
1985-01-17 14:31:34 +00:00
uses dereg, areg={const1,$1}, hlreg
gen move lb,de
1:
lxi hl,{const2,SL}
dad de
1985-03-04 13:42:38 +00:00
mov e,{m}
1985-01-17 14:31:34 +00:00
inx hl
1985-03-04 13:42:38 +00:00
mov d,{m}
1985-01-17 14:31:34 +00:00
dcr a
1985-03-04 13:42:38 +00:00
jnz {label,1b} yields de
1985-01-17 14:31:34 +00:00
pat lxa $1==0
uses hlreg
gen
move {const2,SL},hl
dad lb
yields hl
1985-01-17 14:31:34 +00:00
pat lxa $1==1
uses dereg, hlreg
gen move {const2,SL},hl
dad lb
1985-03-04 13:42:38 +00:00
mov e,{m}
1985-01-17 14:31:34 +00:00
inx hl
1985-03-04 13:42:38 +00:00
mov d,{m}
1985-01-17 14:31:34 +00:00
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
1985-03-04 13:42:38 +00:00
mov e,{m}
1985-01-17 14:31:34 +00:00
inx hl
1985-03-04 13:42:38 +00:00
mov d,{m}
1985-01-17 14:31:34 +00:00
dcr a
1985-03-04 13:42:38 +00:00
jnz {label,1b}
1985-01-17 14:31:34 +00:00
lxi hl,{const2,SL}
dad de yields hl
pat loi $1==1
with exact label
uses areg
gen lda %1 yields a
with dereg
uses areg
gen ldax de yields a
1985-01-17 14:31:34 +00:00
with hlreg
1985-03-18 10:00:30 +00:00
uses reusing %1, reg
1985-03-04 13:42:38 +00:00
gen mov %a,{m} yields %a
1985-01-17 14:31:34 +00:00
pat loi $1==2
with exact label
gen lhld %1 yields hl
with hlreg
uses dereg
1985-03-04 13:42:38 +00:00
gen mov e,{m}
1985-01-17 14:31:34 +00:00
inx %1
1985-03-04 13:42:38 +00:00
mov d,{m} yields de
1985-01-17 14:31:34 +00:00
pat loi $1==4
with exact label
gen lhld %1
xchg.
lhld {label,%1.off+2} yields hl de
with exact label
gen lhld {label,%1.off+2}
xchg.
lhld %1 yields de hl
1985-01-17 14:31:34 +00:00
with hlreg
uses dereg, areg
1985-03-04 13:42:38 +00:00
gen mov e,{m}
1985-01-17 14:31:34 +00:00
inx %1
1985-03-04 13:42:38 +00:00
mov d,{m}
inx hl
1985-03-04 13:42:38 +00:00
mov a,{m}
inx hl
1985-03-04 13:42:38 +00:00
mov h,{m}
mov l,a yields hl de
1985-01-17 14:31:34 +00:00
pat loi $1<=510
1985-03-04 13:42:38 +00:00
with hl_or_de STACK
uses hl_or_de={const2,$1-1}, areg
1985-01-17 14:31:34 +00:00
gen dad de
mvi a,{const1,$1/2}
1:
1985-03-04 13:42:38 +00:00
mov d,{m}
1985-01-17 14:31:34 +00:00
dcx hl
1985-03-04 13:42:38 +00:00
mov e,{m}
1985-01-17 14:31:34 +00:00
dcx hl
push de
dcr a
1985-03-04 13:42:38 +00:00
jnz {label,1b}
1985-01-17 14:31:34 +00:00
pat loi $1>=512
kills ALL
/* 'uses dereg={const2,$1}' fails to kill de. */
gen lxi de,{const2,$1}
Call {label,".loi"}
1985-01-17 14:31:34 +00:00
pat los $1==2
with dereg
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".loi"}
pat ldl
leaving
lal $1
loi 4
1985-01-17 14:31:34 +00:00
pat lde
with STACK
gen lhld {label,$1+2}
push hl
lhld {label,$1} yields hl
with
uses dereg, hlreg
gen lhld {label,$1}
xchg.
lhld {label,$1+2} yields hl de
with
uses dereg, hlreg
gen lhld {label,$1+2}
xchg.
lhld {label,$1} yields de hl
1985-01-17 14:31:34 +00:00
pat ldf
leaving
adp $1
loi 4
1985-01-17 14:31:34 +00:00
pat lpi
1985-03-04 13:42:38 +00:00
uses hl_or_de={label,$1} yields %a
1985-01-17 14:31:34 +00:00
/******************************************/
/* Group 2: Store instructions */
/******************************************/
pat stl lol $1==$2
with dereg yields de de leaving stl $1
#ifdef USE_I80_RSTS
pat stl $1==0-2
with dereg
uses hlreg
gen
rst {const1, 4}
#endif
pat stl ($1>0) && ($1<=STACKHELPERS)
with dereg
uses hlreg
gen
Call {plabel, ".fstore", $1}
pat stl ($1<0) && ($1>=0-STACKHELPERS)
with dereg
uses hlreg
gen
Call {plabel, ".fstoren", 0-$1}
1985-01-17 14:31:34 +00:00
pat stl
with dereg
uses hlreg={const2, $1}
gen
dad lb
mov {m}, e
inx hl
mov {m}, d
1985-01-17 14:31:34 +00:00
pat ste loe $1==$2
with hlreg yields hl hl leaving ste $1
pat ste
with hlreg
gen shld {label,$1}
pat sil
leaving
lol $1
sti 2
1985-01-17 14:31:34 +00:00
pat sil lil $1==$2
leaving
dup 2
lol $1
sti 2
pat lil inc sil $1==$3
leaving
lol $1
dup 2
loi 2
inc 2
exg 2
sti 2
pat lil inc sil $1==$3
leaving
lol $1
dup 2
loi 2
dec 2
exg 2
sti 2
1985-01-17 14:31:34 +00:00
pat stf
with hl_or_de STACK
uses hl_or_de={const2,$1}
gen
dad de
pop de
mov {m},e
inx hl
mov {m},d
1985-01-17 14:31:34 +00:00
pat sti $1==1
1985-03-04 13:42:38 +00:00
with label areg
1985-01-17 14:31:34 +00:00
gen sta %1
1985-03-04 13:42:38 +00:00
with dereg areg
1985-01-17 14:31:34 +00:00
gen stax de
with hlreg reg
1985-03-04 13:42:38 +00:00
gen mov {m},%2
1985-01-17 14:31:34 +00:00
pat sti $1==2
with label hlreg
gen
shld %1
with hlreg dereg
gen
mov {m},e
inx %1
mov {m},d
with dereg hlreg
gen
xchg.
mov {m},e
inx %2
mov {m},d
1985-01-17 14:31:34 +00:00
pat sti $1==4
1985-03-04 13:42:38 +00:00
with label hlreg dereg
1985-01-17 14:31:34 +00:00
gen shld %1
xchg.
shld {label,%1.off+2}
1985-03-04 13:42:38 +00:00
with label dereg hlreg
gen shld {label,%1.off+2}
xchg.
shld %1
with hlreg dereg
kills ALL
1985-03-04 13:42:38 +00:00
gen mov {m},e
inx hl
1985-03-04 13:42:38 +00:00
mov {m},d
inx hl
pop de
1985-03-04 13:42:38 +00:00
mov {m},e
inx hl
1985-03-04 13:42:38 +00:00
mov {m},d
1985-01-17 14:31:34 +00:00
1985-03-04 13:42:38 +00:00
pat sti $1<512
with hlreg
kills ALL
uses areg={const1,$1/2}, dereg
1985-01-17 14:31:34 +00:00
gen 1:
pop de
1985-03-04 13:42:38 +00:00
mov {m},e
inx hl
1985-03-04 13:42:38 +00:00
mov {m},d
inx hl
1985-01-17 14:31:34 +00:00
dcr a
1985-03-04 13:42:38 +00:00
jnz {label,1b}
1985-01-17 14:31:34 +00:00
pat sti
kills ALL
gen lxi de,{const2,$1}
Call {label,".sti"}
1985-01-17 14:31:34 +00:00
pat sts $1==2
with dereg
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".sti"}
pat sdl
leaving
lal $1
sti 4
1985-01-17 14:31:34 +00:00
pat sdf
leaving
adp $1
sti 4
pat sde
with hlreg
kills ALL
gen
shld {label,$1}
pop hl
shld {label,$1+2}
with hlreg dereg
kills ALL
gen
shld {label,$1}
xchg.
shld {label,$1+2}
with dereg hlreg
kills ALL
gen
shld {label,$1+2}
xchg.
shld {label,$1}
1985-01-17 14:31:34 +00:00
/****************************************/
/* 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
with dereg dereg
gen
xchg.
dad hl
yields hl
1985-01-17 14:31:34 +00:00
pat adi $1==4
kills ALL
gen
Call {label,".adi4"}
1985-01-17 14:31:34 +00:00
pat sbi $1==2
with const2 hl_or_de
yields %2 {const2, 0-%1.num}
leaving
adi 2
with smallnconst2 hl_or_de
yields %2 {smallpconst2, 0-%1.num}
leaving
adi 2
with hl_or_de const2
uses areg
gen
mvi a, {const1, %2.num & 0xff}
sub %1.2
mov %1.2, a
mvi a, {const1, %2.num >> 8}
sbb %1.1
mov %1.1, a
yields %1
with hl_or_de hl_or_de
uses areg
gen
mov a,%2.2
sub %1.2
mov %1.2,a
mov a,%2.1
sbb %1.1
mov %1.1,a
yields %1
with hl_or_de hl_or_de
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
1985-01-17 14:31:34 +00:00
pat sbi $1==4
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".sbi4"}
pat mli $1==2
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".mli2"} yields de
pat mli $1==4
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".mli4"}
pat dvi $1==2
kills ALL
/* 'uses areg={const1,129}' fails to kill a. */
gen mvi a,{const1,129}
Call {label,".dvi2"} yields de
1985-01-17 14:31:34 +00:00
pat dvi $1==4
kills ALL
gen mvi a,{const1,129}
Call {label,".dvi4"}
1985-01-17 14:31:34 +00:00
pat rmi $1==2
kills ALL
gen mvi a,{const1,128}
Call {label,".dvi2"} yields de
1985-01-17 14:31:34 +00:00
pat rmi $1==4
kills ALL
gen mvi a,{const1,128}
Call {label,".dvi4"}
1985-01-17 14:31:34 +00:00
pat ngi $1==2
1985-03-04 13:42:38 +00:00
with hl_or_de
1985-01-17 14:31:34 +00:00
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
1985-01-17 14:31:34 +00:00
pat ngi $1==4
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".ngi4"}
pat loc sli ($1==1) && ($2==2)
with hlreg
gen
dad hl
yields hl
pat loc sli ($1>=2) && ($1<=7) && ($2==2)
with hlreg
gen
dad hl
yields hl
leaving
loc $1-1
sli 2
pat loc sli ($1==8) && ($2==2)
with hl_or_de
gen
mov %1.1, %1.2
mvi %1.2, {const1, 0}
yields %1
1985-01-17 14:31:34 +00:00
pat sli $1==2
kills ALL
gen
Call {label,".sli2"}
yields de
1985-01-17 14:31:34 +00:00
pat sli $1==4
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".sli4"}
pat sri $1==2
kills ALL
gen mvi a,{const1,1}
Call {label,".sri2"} yields de
1985-01-17 14:31:34 +00:00
pat sri $1==4
kills ALL
gen mvi a,{const1,1}
Call {label,".sri4"}
1985-01-17 14:31:34 +00:00
/********************************************/
/* Group 4: Unsigned arithmetic */
/********************************************/
pat adu leaving adi $1
pat sbu leaving sbi $1
pat mlu $1==2
kills ALL
gen Call {label,".mlu2"} yields de
pat mlu $1==4
kills ALL
gen Call {label,".mli4"}
1985-01-17 14:31:34 +00:00
pat dvu $1==2
kills ALL
gen mvi a,{const1,1}
Call {label,".dvi2"} yields de
1985-01-17 14:31:34 +00:00
pat dvu $1==4
kills ALL
gen mvi a,{const1,1}
Call {label,".dvi4"}
1985-01-17 14:31:34 +00:00
pat rmu $1==2
kills ALL
gen mvi a,{const1,0}
Call {label,".dvi2"} yields de
1985-01-17 14:31:34 +00:00
pat rmu $1==4
kills ALL
gen mvi a,{const1,0}
Call {label,".dvi4"}
1985-01-17 14:31:34 +00:00
pat loc slu ($2==2)
leaving
loc $1
sli $2
pat slu
leaving
sli $1
1985-01-17 14:31:34 +00:00
pat loc sru ($1 == 8) && ($2 == 2)
with hl_or_de
gen move %1.1, %1.2
mvi %1.1, {const1,0} yields %1
1985-01-17 14:31:34 +00:00
pat sru $1==2
kills ALL
gen mvi a,{const1,0}
Call {label,".sri2"} yields de
1985-01-17 14:31:34 +00:00
pat sru $1==4
kills ALL
gen mvi a,{const1,0}
Call {label,".sri4"}
1985-01-17 14:31:34 +00:00
1985-03-04 13:42:38 +00:00
/********************************************/
1985-03-18 10:00:30 +00:00
/* Group 5: Floating point arithmetic */
1985-03-04 13:42:38 +00:00
/********************************************/
pat adf $1==4 leaving cal ".adf4" asp 4
pat adf $1==8 leaving cal ".adf8" asp 8
pat sbf $1==4 leaving cal ".sbf4" asp 4
pat sbf $1==8 leaving cal ".sbf8" asp 8
pat mlf $1==4 leaving cal ".mlf4" asp 4
pat mlf $1==8 leaving cal ".mlf8" asp 8
pat dvf $1==4 leaving cal ".dvf4" asp 4
pat dvf $1==8 leaving cal ".dvf8" asp 8
pat ngf $1==4 leaving cal ".ngf4"
pat ngf $1==8 leaving cal ".ngf8"
pat fif $1==4
leaving lor 1 cal ".fif4" asp 2
pat fif $1==8
leaving lor 1 cal ".fif8" asp 2
pat fef $1==4
leaving lor 1 adp 0-2 cal ".fef4"
pat fef $1==8
leaving lor 1 adp 0-2 cal ".fef8"
1985-03-04 13:42:38 +00:00
1985-01-17 14:31:34 +00:00
/********************************************/
/* Group 6: Pointer arithmetic */
/********************************************/
pat adp $1==0 /* do nothing */
pat adp $1==1
1985-03-04 13:42:38 +00:00
with hl_or_de
1985-01-17 14:31:34 +00:00
gen inx %1 yields %1
pat adp $1==2
1985-03-04 13:42:38 +00:00
with hl_or_de
1985-01-17 14:31:34 +00:00
gen inx %1
inx %1 yields %1
pat adp $1==0-1
1985-03-04 13:42:38 +00:00
with hl_or_de
1985-01-17 14:31:34 +00:00
gen dcx %1 yields %1
pat adp $1==0-2
1985-03-04 13:42:38 +00:00
with hl_or_de
1985-01-17 14:31:34 +00:00
gen dcx %1
dcx %1 yields %1
pat adp
1985-03-04 13:42:38 +00:00
with hl_or_de
uses hl_or_de={const2,$1}
1985-01-17 14:31:34 +00:00
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 hl_or_de
gen
inx %1
yields %1
pat inl ($1>0) && ($1<=STACKHELPERS)
uses hlreg
gen
Call {plabel, ".faddr", $1}
inr {m}
jnz {label,1f}
inx hl
inr {m}
1:
pat inl ($1<0) && ($1>=0-STACKHELPERS)
uses hlreg
gen
Call {plabel, ".faddrn", 0-$1}
inr {m}
jnz {label,1f}
inx hl
inr {m}
1:
1985-01-17 14:31:34 +00:00
pat inl
uses hlreg={const2,$1}
gen
dad lb
inr {m}
jnz {label,1f}
inx hl
inr {m}
1:
1985-01-17 14:31:34 +00:00
pat ine
uses hlreg={label,$1}
1985-03-04 13:42:38 +00:00
gen inr {m}
jnz {label,1f}
1985-01-17 14:31:34 +00:00
inx hl
1985-03-04 13:42:38 +00:00
inr {m}
1985-01-17 14:31:34 +00:00
1:
pat dec
1985-03-04 13:42:38 +00:00
with hl_or_de
1985-01-17 14:31:34 +00:00
gen dcx %1 yields %1
pat del
uses hlreg={const2,$1}
gen
dad lb
mov e, {m}
inx hl
mov d, {m}
dcx de
mov {m}, d
dcx hl
mov {m}, e
1985-01-17 14:31:34 +00:00
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
1985-01-17 14:31:34 +00:00
pat zre
uses hlreg={const2,0}
gen shld {label,$1}
pat zrf $1==4 leaving zer 4
pat zrf $1==8 leaving zer 8
1985-03-18 10:00:30 +00:00
1985-01-17 14:31:34 +00:00
pat zer $1==2 yields {const2,0}
pat zer $1==4 yields {const2,0} {const2,0}
pat zer $1<511
kills ALL
1985-03-04 13:42:38 +00:00
uses reg={const1,$1/2}, hl_or_de={const2,0}
1985-01-17 14:31:34 +00:00
gen 1:
push %b
dcr %a
1985-03-04 13:42:38 +00:00
jnz {label,1b}
1985-01-17 14:31:34 +00:00
pat zer
kills ALL
1985-03-04 13:42:38 +00:00
uses hl_or_de={const2,$1/2}, hl_or_de={const2,0}, areg
1985-01-17 14:31:34 +00:00
gen xra a
1:
push %b
dcx %a
cmp %a.2
1985-03-04 13:42:38 +00:00
jnz {label,1b}
1985-01-17 14:31:34 +00:00
cmp %a.1
1985-03-04 13:42:38 +00:00
jnz {label,1b}
1985-01-17 14:31:34 +00:00
/*****************************************/
/* Group 8: Convert instructions */
/*****************************************/
pat loc loc cii $1==$2
pat loc loc cii $1==2 && $2==4
with hl_or_de
uses hl_or_de, areg
gen
mov a, %1.1
ral.
sbb a
mov %a.1, a
mov %a.2, a
yields %a %1
1985-01-17 14:31:34 +00:00
pat loc loc cii $1==4 && $2==2
with hl_or_de hl_or_de
yields %1
1985-01-17 14:31:34 +00:00
pat loc loc cii $1==1 && $2==2
with reg
uses reusing %1, areg=%1, hl_or_de
gen
mov %b.2, a
ral.
sbb a
mov %b.1, a
yields %b
with hl_or_de
uses areg=%1.2
gen
ral.
sbb a
mov %1.1, a
yields %1
1985-01-17 14:31:34 +00:00
pat loc loc cii $1==1 && $2==4
with areg
uses hl_or_de, hl_or_de
gen
mov %b.2, a
ral.
sbb a
mov %b.1, a
mov %a.2, a
mov %a.1, a
yields %a %b
with hlreg
uses dereg, areg
gen
mov a, l
ral.
sbb a
mov h, a
mov e, a
mov d, a
yields de hl
1985-01-17 14:31:34 +00:00
pat cii
kills ALL
gen mvi a,{const1,1}
Call {label,".cii"}
1985-01-17 14:31:34 +00:00
pat loc loc ciu leaving loc $1 loc $2 cuu
1985-03-04 13:42:38 +00:00
pat loc loc cui leaving loc $1 loc $2 cuu
1985-01-17 14:31:34 +00:00
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 src1or2 yields {const2,0} %1
1985-01-17 14:31:34 +00:00
pat loc loc cuu $1==4 && $1==2
with src1or2 src1or2 yields %1
1985-01-17 14:31:34 +00:00
pat loc loc cuu $1==1 && $2==2
with reg
1985-03-04 13:42:38 +00:00
uses reusing %1, hl_or_de
1985-01-17 14:31:34 +00:00
gen move %1,%a yields %a
1985-03-04 13:42:38 +00:00
with hl_or_de
1985-01-17 14:31:34 +00:00
gen move {const1,0},%1.1 yields %1
pat loc loc cuu $1==1 && $2==4
with reg
1985-03-04 13:42:38 +00:00
uses reusing %1, hl_or_de
1985-01-17 14:31:34 +00:00
gen move %1,%a yields {const2,0} %a
1985-03-04 13:42:38 +00:00
with hl_or_de
1985-01-17 14:31:34 +00:00
gen move {const1,0},%1.1 yields {const2,0} %1
pat cuu
kills ALL
gen mvi a,{const1,0}
Call {label,".cii"}
1985-01-17 14:31:34 +00:00
pat loc loc cfi $2==2
leaving loc $1 loc $2 cal ".cfi" asp 4+$1 loe ".fra"
pat loc loc cfi $2==4
leaving loc $1 loc $2 cal ".cfi" asp 4+$1 lfr 4
pat loc loc cif $2==4
leaving loc $1 cal ".cif4" asp $1-2
pat loc loc cif $1==2 && $2==8
with hl_or_de
gen push %1
push %1
push %1 leaving loc $1 cal ".cif8"
pat loc loc cif $1==4 && $2==8
with hl_or_de hl_or_de
gen push %2
push %2
push %1 leaving loc $1 cal ".cif8"
pat loc loc cuf $2==4
leaving loc $1 cal ".cuf4" asp $1-2
pat loc loc cuf $1==2 && $2==8
with hl_or_de
gen push %1
push %1
push %1 leaving loc $1 cal ".cuf8"
pat loc loc cuf $1==4 && $2==8
with hl_or_de hl_or_de
gen push %1
push %2
push %1 leaving loc $1 cal ".cuf8"
pat loc loc cff $1==8 && $2==4 leaving cal ".cff4" asp 4
pat loc loc cff $1==4 && $2==8 leaving dup 4 cal ".cff8"
pat loc loc cfu $2==2
leaving loc $1 loc $2 cal ".cfu" asp 4+$1 loe ".fra"
pat loc loc cfu $2==4
leaving loc $1 loc $2 cal ".cfu" asp 4+$1 lfr 4
1985-01-17 14:31:34 +00:00
/*****************************************/
/* Group 9: Logical instructions */
/*****************************************/
pat and $1==2
with hl_or_de smallpconst2
uses areg
gen
mov a, %1.2
ani {const1, %2.num & 0xff}
yields a
with smallpconst2 hl_or_de
yields %1 %2
leaving
and 2
with hl_or_de smallnconst2
uses areg
gen
mov a, %1.2
ani {const1, %2.num & 0xff}
mov %1.2, a
yields %1
with smallnconst2 hl_or_de
yields %1 %2
leaving
and 2
with hl_or_de const2
uses areg
gen
mov a, %1.2
ani {const1, %2.num & 0xff}
mov %1.2, a
mov a, %1.1
ani {const1, %2.num >> 8}
mov %1.1, a
yields %1
with const2 hl_or_de
yields %1 %2
leaving
and 2
with hl_or_de hl_or_de
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
with hl_or_de hl_or_de
uses areg
gen
mov a,%1.2
ana %2.2
mov %1.2,a
mov a,%1.1
ana %2.1
mov %1.1,a
yields %1
1985-01-17 14:31:34 +00:00
pat and defined($1)
kills ALL
gen
lxi de,{const2,$1}
Call {label,".and"}
1985-01-17 14:31:34 +00:00
pat and !defined($1)
with dereg
kills ALL
gen
Call {label,".and"}
1985-01-17 14:31:34 +00:00
pat ior $1==2
with hl_or_de smallpconst2
uses areg
gen
mov a, %1.2
ori {const1, %2.num & 0xff}
mov %1.2, a
yields %1
with smallpconst2 hl_or_de
yields %1 %2
leaving
ior 2
with hl_or_de smallnconst2
uses areg
gen
mov a, %1.2
ori {const1, %2.num & 0xff}
mov %1.2, a
move {const1, 0xff}, %1.1
yields %1
with smallnconst2 hl_or_de
yields %1 %2
leaving
ior 2
with hl_or_de const2
uses areg
gen
mov a, %1.2
ori {const1, %2.num & 0xff}
mov %1.2, a
mov a, %1.1
ori {const1, %2.num >> 8}
mov %1.1, a
yields %1
with const2 hl_or_de
yields %1 %2
leaving
ior 2
with hl_or_de hl_or_de
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
with hl_or_de hl_or_de
uses areg
gen
mov a,%1.2
ora %2.2
mov %1.2,a
mov a,%1.1
ora %2.1
mov %1.1,a
yields %1
1985-01-17 14:31:34 +00:00
pat ior defined($1)
kills ALL
gen lxi de,{const2,$1}
Call {label,".ior"}
1985-01-17 14:31:34 +00:00
pat ior !defined($1)
with dereg
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".ior"}
pat xor $1==2
with hl_or_de smallpconst2
uses areg
gen
mov a, %1.2
xri {const1, %2.num & 0xff}
mov %1.2, a
yields %1
with smallpconst2 hl_or_de
yields %1 %2
leaving
xor 2
with hl_or_de const2
uses areg
gen
mov a, %1.2
xri {const1, %2.num & 0xff}
mov %1.2, a
mov a, %1.1
xri {const1, %2.num >> 8}
mov %1.1, a
yields %1
with const2 hl_or_de
yields %1 %2
leaving
xor 2
with hl_or_de hl_or_de
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
with hl_or_de hl_or_de
uses areg
gen
mov a,%1.2
xra %2.2
mov %1.2,a
mov a,%1.1
xra %2.1
mov %1.1,a
yields %1
1985-01-17 14:31:34 +00:00
pat xor defined($1)
kills ALL
gen lxi de,{const2,$1}
Call {label,".xor"}
1985-01-17 14:31:34 +00:00
pat xor !defined($1)
with dereg
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".xor"}
pat com $1==2
1985-03-04 13:42:38 +00:00
with hl_or_de
1985-01-17 14:31:34 +00:00
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 defined($1)
kills ALL
gen lxi de,{const2,$1}
Call {label,".com"}
1985-01-17 14:31:34 +00:00
pat com !defined($1)
with dereg
kills ALL
gen Call {label,".com"}
1985-01-17 14:31:34 +00:00
pat rol $1==2
with dereg hlreg
kills ALL
1985-01-17 14:31:34 +00:00
uses areg
gen mov a,e
ani {const1,15}
1985-03-04 13:42:38 +00:00
jz {label,3f}
1985-01-17 14:31:34 +00:00
1:
dad hl
1985-03-04 13:42:38 +00:00
jnc {label,2f}
1985-01-17 14:31:34 +00:00
inr l
2:
dcr a
1985-03-04 13:42:38 +00:00
jnz {label,1b}
1985-01-17 14:31:34 +00:00
3: yields hl
pat rol $1==4
with dereg
kills ALL
gen Call {label,".rol4"}
1985-01-17 14:31:34 +00:00
pat ror $1==2
with dereg hlreg
kills ALL
1985-01-17 14:31:34 +00:00
uses areg
gen mov a,e
ani {const1,15}
1985-03-04 13:42:38 +00:00
jz {label,2f}
1985-01-17 14:31:34 +00:00
mov e,a
mov a,l
1:
rar.
mov a,h
rar.
mov h,a
mov a,l
rar.
mov l,a
dcr e
1985-03-04 13:42:38 +00:00
jnz {label,1b}
1985-01-17 14:31:34 +00:00
2: yields hl
pat ror $1==4
with dereg
kills ALL
gen Call {label,".ror4"}
1985-01-17 14:31:34 +00:00
/***********************************************/
/* Group 10: Set instructions */
/***********************************************/
pat inn $1==2
kills ALL
gen Call {label,".inn2"} yields de
1985-01-17 14:31:34 +00:00
pat inn defined($1)
kills ALL
gen lxi de,{const2,$1}
Call {label,".inn"} yields de
pat inn !defined($1)
with dereg
kills ALL
gen Call {label,".inn"} yields de
1985-01-17 14:31:34 +00:00
pat set $1==2
with dereg
kills ALL
gen Call {label,".set2"} yields de
1985-01-17 14:31:34 +00:00
pat set defined($1)
kills ALL
gen lxi de,{const2,$1}
Call {label,".set"}
1985-01-17 14:31:34 +00:00
pat set !defined($1)
with dereg
kills ALL
1985-01-17 14:31:34 +00:00
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
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".lar2"}
pat lar defined($1)
gen Call {label,"eunimpl"}
pat lar !defined($1)
with hl_or_de
kills ALL
uses areg
1985-01-17 14:31:34 +00:00
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
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".sar2"}
pat sar defined($1)
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,"eunimpl"}
pat sar !defined($1)
with hl_or_de
kills ALL
uses areg
1985-01-17 14:31:34 +00:00
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
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".aar2"}
pat aar defined($1)
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,"eunimpl"}
pat aar !defined($1)
with hl_or_de
kills ALL
uses areg
1985-01-17 14:31:34 +00:00
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
kills ALL
gen mvi a,{const1,1}
Call {label,".cmi4"} yields de
1985-01-17 14:31:34 +00:00
pat cmf $1==4
leaving cal ".cmf4" asp 8 lfr 2
pat cmf $1==8
leaving cal ".cmf8" asp 16 lfr 2
1985-01-17 14:31:34 +00:00
pat cmu $1==2
1985-03-04 13:42:38 +00:00
with hl_or_de hl_or_de
1985-01-17 14:31:34 +00:00
uses areg
gen mov a,%2.1
cmp %1.1
1985-03-04 13:42:38 +00:00
jz {label,2f}
jc {label,1f}
1985-01-17 14:31:34 +00:00
0:
lxi %2,{const2,1}
1985-03-04 13:42:38 +00:00
jmp {label,3f}
1985-01-17 14:31:34 +00:00
1:
lxi %2,{const2,0-1}
1985-03-04 13:42:38 +00:00
jmp {label,3f}
1985-01-17 14:31:34 +00:00
2:
mov a,%2.2
cmp %1.2
1985-03-04 13:42:38 +00:00
jc {label,1b}
jnz {label,0b}
1985-01-17 14:31:34 +00:00
lxi %2,{const2,0}
3: yields %2
pat cmu $1==4
kills ALL
gen mvi a,{const1,0}
Call {label,".cmi4"} yields de
1985-01-17 14:31:34 +00:00
pat cms $1==2 leaving cmi 2
pat cms defined($1)
kills ALL
gen lxi de,{const2,$1}
Call {label,".cms"} yields de
1985-01-17 14:31:34 +00:00
pat cms !defined($1)
with dereg
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".cms"} yields de
pat cmp leaving cmu 2
pat tlt
1985-03-04 13:42:38 +00:00
with hl_or_de
uses areg
1985-01-17 14:31:34 +00:00
gen mov a,%1.1
ral.
mvi a,{const1,0}
mov %1.1,a
adc a
mov %1.2,a yields %1
pat tle
1985-03-04 13:42:38 +00:00
with hl_or_de
uses hl_or_de={const2,1}, areg
1985-01-17 14:31:34 +00:00
gen xra a
add %1.1
1985-03-04 13:42:38 +00:00
jm {label,2f}
jnz {label,1f}
1985-01-17 14:31:34 +00:00
xra a
add %1.2
1985-03-04 13:42:38 +00:00
jz {label,2f}
1985-01-17 14:31:34 +00:00
1:
dcx %a
2: yields %a
pat teq
1985-03-04 13:42:38 +00:00
with hl_or_de
uses areg
1985-01-17 14:31:34 +00:00
gen mov a,%1.1
ora %1.2
move {const2,0},%1
1985-03-04 13:42:38 +00:00
jnz {label,1f}
1985-01-17 14:31:34 +00:00
inx %1
1: yields %1
pat tne
1985-03-04 13:42:38 +00:00
with hl_or_de
uses areg
1985-01-17 14:31:34 +00:00
gen mov a,%1.1
ora %1.2
move {const2,0},%1
1985-03-04 13:42:38 +00:00
jz {label,1f}
1985-01-17 14:31:34 +00:00
inx %1
1: yields %1
pat tge
1985-03-04 13:42:38 +00:00
with hl_or_de
uses areg
1985-01-17 14:31:34 +00:00
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
1985-03-04 13:42:38 +00:00
with hl_or_de
uses hl_or_de={const2,0}, areg
1985-01-17 14:31:34 +00:00
gen xra a
add %1.1
1985-03-04 13:42:38 +00:00
jm {label,2f}
jnz {label,1f}
1985-01-17 14:31:34 +00:00
xra a
add %1.2
1985-03-04 13:42:38 +00:00
jz {label,2f}
1985-01-17 14:31:34 +00:00
1:
inx %a
2: yields %a
pat loc cmi teq and $1>=0 && $1<=255 && $2==2 && $4==2
1985-03-04 13:42:38 +00:00
with exact areg hl_or_de
1985-01-17 14:31:34 +00:00
gen cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jz {label,1f}
1985-01-17 14:31:34 +00:00
move {const2,0},%2
1: yields %2
1985-03-04 13:42:38 +00:00
with hl_or_de hl_or_de
uses areg
gen mov a,%1.2
cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jnz {label,1f}
mov a,%1.1
ora a
1985-03-04 13:42:38 +00:00
jz {label,2f}
1:
move {const2,0},%2
2: yields %2
1985-01-17 14:31:34 +00:00
pat loc cmi tne and $1>=0 && $1<=255 && $2==2 && $4==2
1985-03-04 13:42:38 +00:00
with exact areg hl_or_de
1985-01-17 14:31:34 +00:00
gen cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jnz {label,1f}
1985-01-17 14:31:34 +00:00
move {const2,0},%2
1: yields %2
1985-03-04 13:42:38 +00:00
with hl_or_de hl_or_de
uses areg
gen mov a,%1.2
cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jnz {label,1f}
mov a,%1.1
ora a
1985-03-04 13:42:38 +00:00
jnz {label,1f}
move {const2,0},%2
1: yields %2
1985-01-17 14:31:34 +00:00
pat loc cmi teq ior $1>=0 && $1<=255 && $2==2 && $4==2
1985-03-04 13:42:38 +00:00
with exact areg hl_or_de
1985-01-17 14:31:34 +00:00
gen cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jnz {label,1f}
move {const2,1},%2
1: yields %2
1985-03-04 13:42:38 +00:00
with hl_or_de hl_or_de
uses areg
gen mov a,%1.2
cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jnz {label,1f}
mov a,%1.1
ora a
1985-03-04 13:42:38 +00:00
jnz {label,1f}
move {const2,1},%2
1985-01-17 14:31:34 +00:00
1: yields %2
pat loc cmi tne ior $1>=0 && $1<=255 && $2==2 && $4==2
1985-03-04 13:42:38 +00:00
with exact areg hl_or_de
1985-01-17 14:31:34 +00:00
gen cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jz {label,1f}
move {const2,1},%2
1985-01-17 14:31:34 +00:00
1: yields %2
1985-03-04 13:42:38 +00:00
with hl_or_de hl_or_de
uses areg
gen mov a,%1.2
cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jnz {label,1f}
mov a,%1.1
ora a
1985-03-04 13:42:38 +00:00
jz {label,2f}
1:
move {const2,1},%2
2: yields %2
1985-01-17 14:31:34 +00:00
pat loc cmi teq $1>=0 && $1<=255 && $2==2
with exact areg
1985-03-04 13:42:38 +00:00
uses hl_or_de={const2,0}
1985-01-17 14:31:34 +00:00
gen cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jnz {label,1f}
inx %a
1: yields %a
1985-03-04 13:42:38 +00:00
with hl_or_de
uses hl_or_de={const2,0}, areg
gen mov a,%1.2
cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jnz {label,1f}
mov a,%1.1
ora a
1985-03-04 13:42:38 +00:00
jnz {label,1f}
inx %a
1: yields %a
1985-01-17 14:31:34 +00:00
pat loc cmi tne $1>=0 && $1<=255 && $2==2
with exact areg
1985-03-04 13:42:38 +00:00
uses hl_or_de={const2,0}
1985-01-17 14:31:34 +00:00
gen cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jz {label,1f}
inx %a
1: yields %a
1985-03-04 13:42:38 +00:00
with hl_or_de
uses hl_or_de={const2,1}, areg
gen mov a,%1.2
cpi {const1,$1}
1985-03-04 13:42:38 +00:00
jnz {label,1f}
mov a,%1.1
ora a
1985-03-04 13:42:38 +00:00
jnz {label,1f}
dcx %a
1: yields %a
1985-01-17 14:31:34 +00:00
pat loc cmi $1>=0 && $1<=255 && $2==2
with exact areg
1985-03-04 13:42:38 +00:00
uses hl_or_de
gen sui {const1,$1}
1985-01-17 14:31:34 +00:00
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 */
/*******************************************/
1985-03-18 10:00:30 +00:00
pat loc beq $1>=0 && $1<=255
with exact reg
uses reusing %1, areg=%1
gen cpi {const1,$1}
jz {label,$2}
with yields {const2,$1}
leaving beq $2
pat loc bne $1>=0 && $1<=255
with exact reg
uses reusing %1, areg=%1
gen cpi {const1,$1}
jnz {label,$2}
with yields {const2,$1}
leaving bne $2
1985-01-17 14:31:34 +00:00
pat bra
with STACK
gen
jmp {label,$1}
1985-01-17 14:31:34 +00:00
pat blt
with hlreg dereg STACK
uses areg
gen
#ifdef USE_I80_RSTS
rst {const1, 5}
#else
Call {label, ".cmps_mag"}
#endif
jm {label, $1}
pat bgt
leaving
exg 2
blt $1
pat bge
with hlreg dereg STACK
uses areg
gen
#ifdef USE_I80_RSTS
rst {const1, 5}
#else
Call {label, ".cmps_mag"}
#endif
jp {label, $1}
1985-01-17 14:31:34 +00:00
pat ble
leaving
exg 2
bge $1
1985-01-17 14:31:34 +00:00
pat beq
with const2 hl_or_de STACK
uses areg
gen
mov a, %2.2
cpi {const1, %1.num & 0xff}
jnz {label, 1f}
mov a, %2.1
cpi {const1, %1.num >> 8}
jz {label, $1}
1:
with hl_or_de const2 STACK
leaving
exg 2
beq $1
with hl_or_de hl_or_de 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:
1985-01-17 14:31:34 +00:00
pat bne
with const2 hl_or_de STACK
uses areg
gen
mov a, %2.2
cpi {const1, %1.num & 0xff}
jnz {label, $1}
mov a, %2.1
cpi {const1, %1.num >> 8}
jnz {label, $1}
with hl_or_de const2 STACK
leaving
exg 2
beq $1
with hl_or_de hl_or_de STACK
uses areg
gen
mov a,%2.2
cmp %1.2
jnz {label,$1}
mov a,%2.1
cmp %1.1
jnz {label,$1}
1985-01-17 14:31:34 +00:00
pat zlt
with STACK
gen
pop psw
ora a
jm {label,$1}
with regpair STACK
gen
mov a,%1.1
ora a
jm {label,$1}
1985-01-17 14:31:34 +00:00
pat zle
with regpair STACK
uses areg
gen
mov a, %1.1
ora a
jm {label, $1}
jnz {label, 1f}
ora %1.2
jz {label, $1}
1:
1985-01-17 14:31:34 +00:00
pat zeq
with regpair STACK
uses areg
gen
mov a,%1.1
ora %1.2
jz {label,$1}
1985-01-17 14:31:34 +00:00
pat zne
with regpair STACK
uses areg
gen
mov a,%1.1
ora %1.2
jnz {label,$1}
1985-01-17 14:31:34 +00:00
pat zge
with STACK
gen
pop psw
ral.
jnc {label,$1}
with regpair STACK
gen
mov a,%1.1
ora a
jp {label,$1}
1985-01-17 14:31:34 +00:00
pat zgt
with regpair STACK
uses areg
gen
mov a, %1.1
ora a
jm {label, 1f}
jnz {label, $1}
ora %1.2
jnz {label, $1}
1:
1985-01-17 14:31:34 +00:00
pat lol zeq
with STACK
uses hlreg={const2,$1}, areg
gen
dad lb
mov a,{m}
inx hl
ora {m}
jz {label,$2}
1985-01-17 14:31:34 +00:00
pat lol zne
with STACK
uses hlreg={const2,$1}, areg
gen
dad lb
mov a,{m}
inx hl
ora {m}
jnz {label,$2}
1985-01-17 14:31:34 +00:00
pat ior zeq $1==2
with regpair regpair STACK
uses areg
gen
mov a,%1.1
ora %1.2
ora %2.1
ora %2.2
jz {label,$2}
1985-01-17 14:31:34 +00:00
pat ior zne $1==2
with regpair regpair STACK
uses areg
gen
mov a,%1.1
ora %1.2
ora %2.1
ora %2.2
jnz {label,$2}
1985-01-17 14:31:34 +00:00
/*********************************************/
/* Group 14: Procedure call instructions */
/*********************************************/
pat cal
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,$1}
pat cai
with hlreg
kills ALL
gen Call {label, ".pchl"}
1985-01-17 14:31:34 +00:00
pat lfr $1==2 yields de
pat lfr $1<=8
with STACK
uses areg={const1,$1/2}, hlreg={label,".fra"+$1}, dereg
1985-01-17 14:31:34 +00:00
gen 1:
dcx hl
1985-03-04 13:42:38 +00:00
mov d,{m}
1985-01-17 14:31:34 +00:00
dcx hl
1985-03-04 13:42:38 +00:00
mov e,{m}
1985-01-17 14:31:34 +00:00
push de
dcr a
1985-03-04 13:42:38 +00:00
jnz {label,1b}
1985-01-17 14:31:34 +00:00
pat lfr ret $1==$2 leaving ret 0
pat ret $1==0
with STACK
uses hlreg
gen jmp {label, ".ret"}
1985-01-17 14:31:34 +00:00
pat ret $1==2
with dereg STACK
uses hlreg
gen jmp {label, ".ret"}
1985-01-17 14:31:34 +00:00
pat ret $1<=8
with STACK
uses areg={const1,$1/2}, hlreg={label,".fra"}, dereg
1985-01-17 14:31:34 +00:00
gen 1:
pop de
1985-03-04 13:42:38 +00:00
mov {m},e
1985-01-17 14:31:34 +00:00
inx hl
1985-03-04 13:42:38 +00:00
mov {m},d
1985-01-17 14:31:34 +00:00
inx hl
dcr a
1985-03-04 13:42:38 +00:00
jnz {label,1b}
jmp {label, ".ret"}
1985-01-17 14:31:34 +00:00
/******************************************/
/* Group 15: Miscellaneous */
/******************************************/
pat asp $1==0 /* do nothing */
pat asp ($1==2)
with regpair
with STACK
uses hlreg
gen
pop hl
pat asp ($1==4)
with regpair regpair
with STACK
uses hlreg
gen
pop hl
pop hl
1985-01-17 14:31:34 +00:00
pat asp ($1<0) && ($1>0-12)
with STACK
gen
push hl
leaving
asp $1+2
1985-01-17 14:31:34 +00:00
pat asp ($1>4) && ($1<12)
with STACK
uses hlreg
gen
pop hl
leaving
asp $1-2
1985-01-17 14:31:34 +00:00
pat asp
with STACK
uses hlreg={const2,$1}
gen
dad sp
sphl.
1985-01-17 14:31:34 +00:00
pat ass $1==2
with hlreg STACK
gen dad sp
sphl.
pat blm
kills ALL
gen lxi de,{const2,$1}
Call {label,".blm"}
1985-01-17 14:31:34 +00:00
pat bls
with dereg
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".blm"}
pat csa
kills ALL
1985-01-17 14:31:34 +00:00
gen jmp {label,".csa"}
pat csb
kills ALL
1985-01-17 14:31:34 +00:00
gen jmp {label,".csb"}
pat dch leaving loi 2
pat dup $1==2
with src1or2 yields %1 %1
1985-01-17 14:31:34 +00:00
pat dup $1==4
with src1or2 src1or2 yields %2 %1 %2 %1
1985-01-17 14:31:34 +00:00
pat dup
kills ALL
gen lxi de,{const2,$1}
Call {label,".dup"}
1985-01-17 14:31:34 +00:00
pat dus $1==2
with dereg
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".dup"}
pat exg $1==2
with src1or2 src1or2 yields %1 %2
1985-01-17 14:31:34 +00:00
pat exg defined($1)
kills ALL
gen lxi de,{const2,$1}
Call {label,".exg"}
1985-01-17 14:31:34 +00:00
pat fil
1985-03-04 13:42:38 +00:00
uses hlreg={label,$1}
gen shld {label,"hol0"+4}
1985-01-17 14:31:34 +00:00
pat gto
with STACK
gen lhld {label,$1+2}
sphl.
lhld {label,$1+4}
move hl,lb
lhld {label,$1}
pchl.
pat lim
uses hlreg
1985-01-17 14:31:34 +00:00
gen lhld {label,".ignmask"} yields hl
pat lin
uses hlreg={const2,$1}
gen shld {label,"hol0"}
pat lni
uses hlreg
1985-01-17 14:31:34 +00:00
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
uses hlreg
1985-01-17 14:31:34 +00:00
gen lhld {label,".reghp"} yields hl
pat lpb leaving adp SL
pat mon
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".mon"}
pat nop
kills ALL
#ifdef DEBUG
1985-01-17 14:31:34 +00:00
gen Call {label,".nop"}
#endif
1985-01-17 14:31:34 +00:00
pat rck
1985-03-04 13:42:38 +00:00
with hl_or_de STACK
1985-01-17 14:31:34 +00:00
pat rtt leaving ret 0
pat sig
with dereg
uses hlreg
1985-01-17 14:31:34 +00:00
gen lhld {label,".trapproc"}
xchg.
shld {label,".trapproc"} yields de
with STACK
uses hlreg
1985-01-17 14:31:34 +00:00
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 hlreg
gen sphl.
1985-01-17 14:31:34 +00:00
pat str $1==2
with hlreg
gen shld {label,".reghp"}
pat trp
kills ALL
1985-01-17 14:31:34 +00:00
gen Call {label,".trp"}