reg /* the free registers */
regpair /* register pairs bc, de and hl */
regind /* register indirect */
+bcreg /* bc-register-pair */
dereg /* de-register-pair */
hlreg /* hl-register-pair */
+bc_or_de /* bc- or de-register-pair */
hl_or_de /* de- or hl-register-pair */
+ localbase
stackpointer
psword
STACKINGRULES
- from regpair to STACK
- gen push %1
+ from regpair to STACK
+ gen
+ push %1
- from immediate + reg to STACK
- uses hl_or_de
- gen
- move %1, %a
- push %a
+from immediate + reg to STACK
+ uses regpair
+ gen
+ move %1,%a
+ push %a
- from immediate + reg to STACK
- gen
- push hl
- move %1,hl
- xthl.
-
+ from immediate + reg to STACK
+ gen
+ push hl
+ move %1, hl
+ xthl.
COERCIONS
- from STACK
- uses regpair
- gen
- pop %a
- yields %a
+ from STACK
+ uses regpair
+ gen
+ pop %a
+ yields %a
- from STACK
- uses hl_or_de
- gen
- pop %a
- yields %a.2
+from STACK
+ uses regpair
+ gen
+ pop %a
+ yields %a.2
- from STACK
- uses areg
- gen
- dcx sp
- pop psw
- inx sp
- yields %a
+from STACK
+uses areg
+gen dcx sp
+ pop psw
+ inx sp yields a
- from immediate
- uses regpair
- gen
- move %1,%a
- yields %a
+ from immediate
+ uses regpair=%1
+ yields %a
- from hl_or_de
- uses hl_or_de
+from hl_or_de
+ uses hl_or_de
gen
xchg.
yields %a
- from regpair
- uses regpair
- gen
- move %1,%a
- yields %a
+ from regpair
+ uses regpair=%1
+ yields %a
- from reg
- uses reusing %1, regpair
- gen
- move %1,%a.2
- move {const1,0},%a.1
- yields %a
+ from reg
- uses reusing %1, hl_or_de
++ uses reusing %1, regpair
+ gen
+ move %1,%a.2
+ move {const1,0},%a.1
+ yields %a
- from hl_or_de yields %1.2
+from regpair
+ yields %1.2
- from smallpconst2
- yields {const2, %1.num}
-
- from smallnconst2
- yields {const2, %1.num}
+from smallconst2
+ yields {const2, %1.num}
- from const2
- uses regpair
+ from const2
- uses hl_or_de=%1
++ uses regpair=%1
+ yields %a
+
+ from smallpconst2
+ uses reg={const1, %1.num & 0xff}
+ yields %a
+
+ from smallnconst2
+ uses reg={const1, %1.num & 0xff}
+ yields %a
+
+ from smallpconst2 %1.num == 1
+ uses reg={const1, 0}
gen
- move %1, %a
- yields %a.2
+ inr %a
+ yields %a
- from regpair
- uses areg
- gen
- move %1.2,a
- yields a
+ from smallnconst2 %1.num == 0-1
+ uses reg={const1, 0}
+ gen
+ dcr %a
+ yields %a
+
+ from const2
+ uses reg={const1, %1.num & 0xff}
+ yields %a
+
+ from hl_or_de
+ uses reg=%1.2
+ yields %a
PATTERNS
adp $1
loi 2
- #ifdef USE_I80_RSTS
- pat lal sfit($1, 8)
- uses dereg, hlreg, areg
- gen
- rst {const1, 3}
- data1 {const1, $1}
- yields hl
- #endif
+ 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
pat lal
- uses hlreg={const2,$1}
+ uses hlreg={fp}, regpair={const2,$1}
gen
- dad lb
+ dad %b
yields hl
pat lae
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
+ uses dereg={const2, SL}, hlreg={fp}
+ gen
+ dad de
+ 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
+ uses dereg, hlreg={fp}, areg={const1,$1}
+ gen
+ xchg.
+ 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 exact label
- uses areg
- gen lda %1 yields a
-with dereg
- uses areg
- gen ldax de yields a
-with hlreg
- uses reusing %1, reg
- gen mov %a,{m} yields %a
+ with exact label
+ uses areg
+ gen
+ lda %1
- yields a
++ yields a
+ with bc_or_de
+ uses areg
+ gen
+ ldax %1
+ yields a
+ with hlreg
+ uses reusing %1, reg
+ gen
+ mov %a,{m}
+ 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
+ with exact label
+ gen
+ lhld %1
+ yields hl
+ with hlreg
+ uses regpair
+ gen
+ mov %a.2, {m}
+ inx %1
+ mov %a.1, {m}
+ yields %a
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
-with hlreg
- uses dereg, areg
- gen mov e,{m}
- inx %1
- mov d,{m}
- inx hl
- mov a,{m}
- inx hl
- mov h,{m}
- mov l,a yields hl de
+ 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
+ with hlreg
+ uses regpair, areg
+ gen
+ mov %a.2, {m}
+ inx %1
+ mov %a.1,{m}
+ inx hl
+ mov a,{m}
+ inx hl
+ mov h,{m}
+ mov l,a
+ yields hl %a
pat loi $1<=510
-with hl_or_de STACK
-uses hl_or_de={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}
+ with hl_or_de STACK
+ uses hl_or_de={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
kills ALL
/******************************************/
pat stl lol $1==$2
-with dereg yields de de leaving stl $1
+ with regpair
+ yields %1 %1
+ leaving
+ stl $1
#ifdef USE_I80_RSTS
- pat stl sfit($1, 8)
- with bcreg
- uses hlreg, dereg, areg
- gen
- rst {const1, 2}
- data1 {const1, $1}
+ 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}
+
pat stl
- with dereg
- uses hlreg={const2, $1}
- gen
- dad lb
- mov {m}, e
- inx hl
- mov {m}, d
+ with regpair
+ uses hlreg={fp}, regpair={const2, $1}
+ gen
+ dad %b
+ mov {m}, %1.2
+ inx hl
+ mov {m}, %1.1
pat ste loe $1==$2
-with hlreg yields hl hl leaving ste $1
+ with regpair
+ yields %1 %1
+ leaving
+ ste $1
pat ste
-with hlreg
-gen shld {label,$1}
+ with hlreg
+ gen
+ shld {label,$1}
pat sil
leaving
inx hl
inr {m}
1:
- #endif
pat inl
- uses hlreg={const2,$1}
+ uses hlreg={fp}, regpair={const2, $1}
gen
- dad lb
+ dad %b
inr {m}
jnz {label,1f}
inx hl
1:
pat dec
-with hl_or_de
-gen dcx %1 yields %1
+ with regpair
+ gen
+ dcx %1
+ yields %1
- #ifdef USE_I80_RSTS
- pat del sfit($1, 8)
- uses hlreg, areg, dereg
+ pat del
- uses hlreg={const2,$1}
++ uses hlreg={fp}, regpair={const2,$1}
gen
- rst {const1, 3}
- data1 {const1, $1}
- dad lb
-- mov e, {m}
++ dad %b
++ mov %b.2, {m}
inx hl
-- mov d, {m}
++ mov %b.1, {m}
dcx de
-- mov {m}, d
++ mov {m}, %b.1
dcx hl
mov {m}, e
- #endif
-
- pat del
- uses hlreg={fp}, regpair={const2,$1}
- gen
- dad %b
- mov %b.2, {m}
- inx hl
- mov %b.1, {m}
- dcx %b
- mov {m}, %b.1
- dcx hl
- mov {m}, %b.2
pat dee
uses hlreg
dcx hl
shld {label,$1}
- #ifdef USE_I80_RSTS
- pat zrl sfit($1, 8)
- uses hlreg, dereg, areg
- gen
- rst {const1, 3}
- data1 {const1, $1}
- xra a
- mov {m}, a
- inx hl
- mov {m}, a
- #endif
-
pat zrl
- uses hlreg={const2,$1}, areg
+ uses hlreg={fp}, regpair={const2,$1}, areg
gen
- dad lb
+ dad %b
xra a
mov {m},a
inx hl
/*****************************************/
pat and $1==2
- with regpair smallconst2
- with hl_or_de smallpconst2
++ with regpair smallpconst2
+ uses areg
+ gen
+ mov a, %1.2
+ ani {const1, %2.num & 0xff}
+ yields a
- with smallpconst2 hl_or_de
++ with smallpconst2 regpair
+ yields %1 %2
+ leaving
+ and 2
- with hl_or_de smallnconst2
++ with regpair smallnconst2
uses areg
gen
mov a, %1.2
ani {const1, %2.num & 0xff}
mov %1.2, a
- mvi %1.1, {const1, 0}
yields %1
- with smallnconst2 hl_or_de
++ with smallnconst2 regpair
+ yields %1 %2
+ leaving
+ and 2
- with hl_or_de const2
+ with regpair const2
uses areg
gen
mov a, %1.2
ani {const1, %2.num >> 8}
mov %1.1, a
yields %1
- with const2 hl_or_de
+ with const2 regpair
- uses areg
- gen
- mov a, %2.2
- ani {const1, %1.num & 0xff}
- mov %2.2, a
- mov a, %2.1
- ani {const1, %1.num >> 8}
- mov %2.1, a
- yields %2
- with smallconst2 regpair
- uses areg
- gen
- mov a, %2.2
- ani {const1, %1.num & 0xff}
- mov %2.2, a
- mvi %2.1, {const1, 0}
- yields %2
+ yields %1 %2
+ leaving
+ and 2
- with hl_or_de hl_or_de
+ with regpair regpair
uses areg
gen
mov a, %1.2
ori {const1, %2.num & 0xff}
mov %1.2, a
yields %1
- with smallpconst2 hl_or_de
++ with smallpconst2 regpair
+ yields %1 %2
+ leaving
+ ior 2
- with hl_or_de smallnconst2
++ with regpair 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
++ with smallnconst2 regpair
+ yields %1 %2
+ leaving
+ ior 2
- with hl_or_de const2
+ with regpair const2
uses areg
gen
mov a, %1.2
ori {const1, %2.num >> 8}
mov %1.1, a
yields %1
- with const2 hl_or_de
+ with const2 regpair
- uses areg
- gen
- mov a, %2.2
- ori {const1, %1.num & 0xff}
- mov %2.2, a
- mov a, %2.1
- ori {const1, %1.num >> 8}
- mov %2.1, a
- yields %2
- with smallconst2 regpair
- uses areg
- gen
- mov a, %2.2
- ori {const1, %1.num & 0xff}
- mov %2.2, a
- yields %2
+ yields %1 %2
+ leaving
+ ior 2
- with hl_or_de hl_or_de
+ with regpair regpair
uses areg
gen
mov a, %1.2
xri {const1, %2.num & 0xff}
mov %1.2, a
yields %1
- with smallpconst2 hl_or_de
++ with smallpconst2 regpair
+ yields %1 %2
+ leaving
+ xor 2
- with hl_or_de const2
+ with regpair const2
uses areg
gen
mov a, %1.2
xri {const1, %2.num >> 8}
mov %1.1, a
yields %1
- with const2 hl_or_de
+ with const2 regpair
- uses areg
- gen
- mov a, %2.2
- xri {const1, %1.num & 0xff}
- mov %2.2, a
- mov a, %2.1
- xri {const1, %1.num >> 8}
- mov %2.1, a
- yields %2
- with smallconst2 regpair
- uses areg
- gen
- mov a, %2.2
- xri {const1, %1.num & 0xff}
- mov %2.2, a
- yields %2
+ yields %1 %2
+ leaving
+ xor 2
- with hl_or_de hl_or_de
+ with regpair regpair
uses areg
gen
mov a, %1.2
pat cmf $1==8
leaving cal ".cmf8" asp 16 lfr 2
- pat cmu $1==2
- with regpair regpair
+ pat cmu zlt $1==2
- with hl_or_de hl_or_de STACK
++ with regpair regpair STACK
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
+ mov a, %2.2
+ sub %1.2
+ mov a, %2.1
+ sbb %1.1
+ jc {label, $2}
- with const2 hl_or_de STACK
++ with const2 regpair STACK
+ uses areg
+ gen
+ mov a, %2.2
+ sbi {const1, %1.num & 0xff}
+ mov a, %2.1
+ sbi {const1, %1.num >> 8}
+ jc {label, $2}
- with hl_or_de const2 STACK
++ with regpair const2 STACK
+ uses areg
+ gen
+ mvi a, {const1, %2.num & 0xff}
+ sub %1.2
+ mvi a, {const1, %2.num >> 8}
+ sbb %1.1
+ jc {label, $2}
+
+ pat cmu zgt $1==2
+ leaving
+ exg 2
+ cmu 2
+ zlt $2
+
+ pat cmu zge $1==2
- with hl_or_de hl_or_de STACK
++ with regpair regpair STACK
+ uses areg
+ gen
+ mov a, %2.2
+ sub %1.2
+ mov a, %2.1
+ sbb %1.1
+ jnc {label, $2}
- with const2 hl_or_de STACK
++ with const2 regpair STACK
+ uses areg
+ gen
+ mov a, %2.2
+ sbi {const1, %1.num & 0xff}
+ mov a, %2.1
+ sbi {const1, %1.num >> 8}
+ jnc {label, $2}
- with hl_or_de const2 STACK
++ with regpair const2 STACK
+ uses areg
+ gen
+ mvi a, {const1, %2.num & 0xff}
+ sub %1.2
+ mvi a, {const1, %2.num >> 8}
+ sbb %1.1
+ jnc {label, $2}
+
+ pat cmu zle $1==2
+ leaving
+ exg 2
+ cmu 2
+ zge $2
+
+ pat cmu $1==2
-with hl_or_de hl_or_de
++with regpair regpair
+ 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
kills ALL
jnz {label,$1}
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}
+ with STACK
+ gen
+ pop psw
+ ora a
+ jm {label,$1}
- with hl_or_de STACK
++ with regpair STACK
+ gen
+ mov a,%1.1
+ ora a
+ jm {label,$1}
pat zle
- with regpair STACK
- uses areg
- gen xra a
- add %1.1
- jm {label,$1}
- jnz {label,1f}
- xra a
- add %1.2
- jz {label,$1}
- 1:
- with hl_or_de STACK
++ 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:
pat zeq
- with regpair STACK
- uses areg
- gen mov a,%1.1
- ora %1.2
- jz {label,$1}
- with hl_or_de STACK
++ with regpair STACK
+ uses areg
+ gen
+ mov a,%1.1
+ ora %1.2
+ jz {label,$1}
pat zne
- with regpair STACK
- uses areg
- gen mov a,%1.1
- ora %1.2
- jnz {label,$1}
- with hl_or_de STACK
++ with regpair 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 regpair STACK
- gen mov a,%1.1
- ora a
- jp {label,$1}
+ with STACK
+ gen
+ pop psw
+ ral.
+ jnc {label,$1}
- with hl_or_de STACK
++ with regpair STACK
+ gen
+ mov a,%1.1
+ ora a
+ jp {label,$1}
pat zgt
- with regpair STACK
- uses areg
- gen xra a
- add %1.1
- jm {label,1f}
- jnz {label,$1}
- xra a
- add %1.2
- jnz {label,$1}
- 1:
-
- #ifdef USE_I80_RSTS
- pat lol zeq sfit($1, 8)
- with STACK
- uses hlreg, dereg, areg
- gen
- rst {const1, 3}
- data1 {const1, $1}
- mov a, {m}
- inx hl
- ora {m}
- jz {label, $2}
- #endif
- with hl_or_de STACK
++ 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:
pat lol zeq
with STACK
ora {m}
jz {label,$2}
- #ifdef USE_I80_RSTS
- pat lol zne sfit($1, 8)
- with STACK
- uses hlreg, dereg, areg
- gen
- rst {const1, 3}
- data1 {const1, $1}
- mov a, {m}
- inx hl
- ora {m}
- jnz {label, $2}
- #endif
-
pat lol zne
with STACK
- uses hlreg={const2,$1}, areg
- gen
- dad lb
- mov a,{m}
- inx hl
- ora {m}
- jnz {label,$2}
+ uses hlreg={fp}, regpair={const2,$1}, areg
+ gen
+ dad %b
+ mov a,{m}
+ inx hl
+ ora {m}
+ jnz {label,$2}
pat ior zeq $1==2
- with hl_or_de hl_or_de STACK
+ with regpair regpair STACK
uses areg
gen
mov a,%1.1
/* Group 15: Miscellaneous */
/******************************************/
- pat asp ($1<=0-12) || ($1>=12)
+ pat asp $1==0 /* do nothing */
+
+ pat asp ($1==2)
- with hl_or_de
++ with regpair
with STACK
- uses hlreg={const2,$1}
- uses hlreg
++ uses regpair
gen
- dad sp
- sphl.
- pop hl
++ pop %a
+
+ pat asp ($1==4)
- with hl_or_de hl_or_de
++ with regpair regpair
+ with STACK
- uses hlreg
++ uses regpair
+ gen
- pop hl
- pop hl
++ pop %a
++ pop %a
pat asp ($1<0) && ($1>0-12)
with STACK
leaving
asp $1+2
- pat asp $1==0 /* do nothing */
-
- pat asp ($1>0) && ($1<12)
+ pat asp ($1>4) && ($1<12)
with STACK
- uses hlreg
+ uses regpair
gen
- pop hl
+ pop %a
leaving
asp $1-2