1988-03-30 13:06:41 +00:00
|
|
|
/*
|
|
|
|
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
|
|
* See the copyright notice in the ACK home directory, in the file "Copyright".
|
|
|
|
*/
|
|
|
|
|
|
|
|
rscid = "$Header$"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Back end tables for Intel 8086, 80286
|
|
|
|
*
|
|
|
|
* Author : Ed Keizer
|
|
|
|
*
|
|
|
|
* Adapted to ncg format by BMT Mosseveld, EM v Mulligen, M de Rooy, E tulp,
|
|
|
|
* and R Vendelmans (practical work course compiler construction).
|
|
|
|
*
|
1988-03-31 17:58:56 +00:00
|
|
|
* New format table much corrected: Ceriel Jacobs
|
1988-03-30 13:06:41 +00:00
|
|
|
* Added register variables: Ceriel Jacobs
|
|
|
|
* Adapted to use floating point library: Ceriel Jacobs
|
|
|
|
*
|
|
|
|
* wordsize = 2 bytes, pointersize = 2 bytes.
|
|
|
|
*
|
|
|
|
* Register bp is used as LB, sp is used for SP.
|
|
|
|
* Some global variables are used:
|
|
|
|
* - .reghp : the heap pointer
|
|
|
|
* - .ignmask : trap ignore mask
|
|
|
|
* - .trppc : address of user defined trap handler
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
SL = 4
|
|
|
|
SSL = "4"
|
|
|
|
|
|
|
|
EM_WSIZE = 2
|
|
|
|
EM_PSIZE = 2
|
|
|
|
EM_BSIZE = 4
|
|
|
|
|
|
|
|
SIZEFACTOR = 5/1
|
|
|
|
|
|
|
|
#define EXACT exact
|
|
|
|
#define REGVARS
|
|
|
|
|
|
|
|
/*****************************************************************/
|
|
|
|
PROPERTIES
|
|
|
|
/*****************************************************************/
|
|
|
|
|
|
|
|
REG1
|
|
|
|
ACC1
|
|
|
|
AREG
|
|
|
|
SHIFT_CREG
|
|
|
|
REG
|
|
|
|
GENREG
|
|
|
|
ACC
|
|
|
|
BREG
|
|
|
|
BXREG
|
|
|
|
ADDREG
|
|
|
|
CXREG
|
|
|
|
DXREG
|
|
|
|
IREG
|
1988-03-31 17:58:56 +00:00
|
|
|
#ifdef REGVARS
|
1988-03-30 13:06:41 +00:00
|
|
|
RADDREG
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*****************************************************************/
|
|
|
|
REGISTERS
|
|
|
|
/*****************************************************************/
|
|
|
|
|
|
|
|
al : REG1 , ACC1 .
|
|
|
|
ah,bl,bh,ch,dl,dh : REG1 .
|
|
|
|
cl : REG1 , SHIFT_CREG .
|
|
|
|
ax = al + ah : REG , GENREG , ACC .
|
1988-03-31 17:58:56 +00:00
|
|
|
bx = bl + bh : REG , GENREG , BXREG , ADDREG , AREG .
|
1988-03-30 13:06:41 +00:00
|
|
|
cx = cl + ch : REG , GENREG , CXREG , SHIFT_CREG.
|
|
|
|
dx = dl + dh : REG , GENREG , DXREG .
|
|
|
|
#ifndef REGVARS
|
1988-03-31 17:58:56 +00:00
|
|
|
si : REG , IREG , AREG , ADDREG .
|
|
|
|
di : REG , IREG , AREG , ADDREG .
|
1988-03-30 13:06:41 +00:00
|
|
|
#else
|
1988-03-31 17:58:56 +00:00
|
|
|
si : AREG , RADDREG , IREG regvar(reg_any) .
|
|
|
|
di : AREG , RADDREG , IREG regvar(reg_any) .
|
1988-03-30 13:06:41 +00:00
|
|
|
#endif
|
1988-03-31 17:58:56 +00:00
|
|
|
bp : AREG .
|
1988-03-30 13:06:41 +00:00
|
|
|
sp : BREG .
|
|
|
|
|
|
|
|
/*****************************************************************/
|
|
|
|
TOKENS
|
|
|
|
/*****************************************************************/
|
|
|
|
|
|
|
|
ANYCON = { INT val; } 2 cost(2,2) val .
|
1988-03-31 17:58:56 +00:00
|
|
|
CONSTR = { ADDR off; } 2 cost(2,2) off .
|
|
|
|
ADDR_EXTERN = { ADDR off; } 2 cost(2,2) off .
|
1988-03-30 13:06:41 +00:00
|
|
|
EXTERN1 = { ADDR off; } 2 cost(2,12) "(" off ")" .
|
|
|
|
EXTERN2 = { ADDR off; } 2 cost(2,12) "(" off ")" .
|
1988-03-31 17:58:56 +00:00
|
|
|
ADDR_LOCAL = { INT ind; } 2 cost(1,9) ind "(bp)" .
|
1988-03-30 13:06:41 +00:00
|
|
|
LOCAL = { INT ind; INT size; } 2 cost(1,15) ind "(bp)" .
|
|
|
|
LOCAL1 = { INT ind; INT size; } 2 cost(1,15) ind "(bp)" .
|
|
|
|
|
|
|
|
Rreg_off = { AREG reg; ADDR off;} 2 cost(1,9) off "(" reg
|
|
|
|
")" .
|
|
|
|
Rbpreg_off = { AREG reg; INT ind;} 2 cost(1,11) ind "(bp)" "("
|
|
|
|
reg ")" .
|
|
|
|
Xreg_off = { AREG reg; ADDR off;} 2 cost(1,9) off "(" reg
|
|
|
|
")" .
|
|
|
|
|
|
|
|
ind_reg2 = { AREG reg;} 2 cost(0,11) "(" reg ")" .
|
|
|
|
ind_regoff2 = { AREG reg; ADDR off;} 2 cost(1,15) off "(" reg
|
|
|
|
")" .
|
|
|
|
ind_bpregoff2 = { AREG reg; INT ind;} 2 cost(1,18) ind "(bp)" "("
|
|
|
|
reg ")" .
|
|
|
|
|
|
|
|
ind_reg1 = { AREG reg;} 2 cost(0,11) "(" reg ")" .
|
|
|
|
ind_regoff1 = { AREG reg; ADDR off;} 2 cost(1,15) off "(" reg
|
|
|
|
")" .
|
|
|
|
ind_bpregoff1 = { AREG reg; INT ind;} 2 cost(1,18) ind "(bp)" "("
|
|
|
|
reg ")" .
|
|
|
|
label = { ADDR off;} 2 off .
|
|
|
|
|
|
|
|
/*****************************************************************/
|
|
|
|
SETS
|
|
|
|
/*****************************************************************/
|
|
|
|
|
|
|
|
/* Mode refering to a word in memory */
|
|
|
|
memory2 = EXTERN2 + ind_reg2 + ind_regoff2 + ind_bpregoff2 +
|
|
|
|
LOCAL .
|
|
|
|
|
|
|
|
|
|
|
|
memory1 = EXTERN1 + ind_reg1 + ind_regoff1 + ind_bpregoff1 +
|
|
|
|
LOCAL1 .
|
|
|
|
|
1988-03-31 17:58:56 +00:00
|
|
|
const = ANYCON + ADDR_EXTERN + CONSTR .
|
|
|
|
register = REG + AREG
|
1988-03-30 13:06:41 +00:00
|
|
|
#ifdef REGVARS
|
1988-03-31 17:58:56 +00:00
|
|
|
+ IREG
|
1988-03-30 13:06:41 +00:00
|
|
|
#endif
|
|
|
|
.
|
|
|
|
addreg = ADDREG
|
|
|
|
#ifdef REGVARS
|
|
|
|
+ RADDREG
|
|
|
|
#endif
|
|
|
|
.
|
|
|
|
anyreg = register + BREG .
|
|
|
|
rm = anyreg + memory2 .
|
1988-03-31 17:58:56 +00:00
|
|
|
rmnoacc = IREG + BXREG + CXREG + memory2 .
|
1988-03-30 13:06:41 +00:00
|
|
|
rmorconst = const + rm .
|
|
|
|
regorconst = const + anyreg .
|
|
|
|
#ifdef REGVARS
|
|
|
|
/* Needed because there is a shortage of ADDREG-registers.
|
|
|
|
This is the main penalty for having register variables.
|
|
|
|
*/
|
1988-03-31 17:58:56 +00:00
|
|
|
regorconstnoaddr = const + IREG + ACC + CXREG + DXREG .
|
1988-03-30 13:06:41 +00:00
|
|
|
#else
|
|
|
|
regorconstnoaddr = regorconst .
|
|
|
|
#endif
|
|
|
|
dest = register + memory2 .
|
|
|
|
|
|
|
|
rm1 = REG1 + memory1 .
|
|
|
|
rmorconst1 = const + rm1 .
|
|
|
|
regorconst12 = REG1 + GENREG + const .
|
|
|
|
dest1 = REG1 + memory1 .
|
1988-07-26 13:00:30 +00:00
|
|
|
rm12 = rm1 + memory2 + REG .
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
/* Modes used to indicate tokens to be removed from the fakestack */
|
|
|
|
reg_indexed = ind_reg2 + ind_regoff2 + ind_reg1 + ind_regoff1 .
|
|
|
|
lb_indexed = ind_bpregoff2 + ind_bpregoff1 .
|
|
|
|
indexed = reg_indexed + lb_indexed .
|
|
|
|
externals = EXTERN2 + EXTERN1 .
|
|
|
|
locals = LOCAL + LOCAL1 .
|
|
|
|
all_locals = locals + lb_indexed .
|
|
|
|
indirects = externals + reg_indexed .
|
|
|
|
referals = indirects + locals .
|
|
|
|
|
|
|
|
/* Miscellaneous */
|
|
|
|
reg_off = Xreg_off + Rreg_off .
|
1988-03-31 17:58:56 +00:00
|
|
|
bpreg_off = Rbpreg_off .
|
1988-03-30 13:06:41 +00:00
|
|
|
halfindir = reg_off + bpreg_off + ADDR_LOCAL .
|
|
|
|
some_off = halfindir + ADDR_EXTERN + addreg .
|
|
|
|
a_word = rmorconst + rm1 + halfindir .
|
|
|
|
no_reg_off = rmorconst + rm1 + ADDR_LOCAL .
|
|
|
|
|
|
|
|
/*****************************************************************/
|
|
|
|
INSTRUCTIONS
|
|
|
|
/*****************************************************************/
|
|
|
|
|
|
|
|
cost(1,3)
|
|
|
|
adc rm:rw:cc, regorconst:ro.
|
|
|
|
adc anyreg:rw:cc, rmorconst:ro.
|
|
|
|
#ifdef REGVARS
|
|
|
|
add LOCAL:rw:cc, rmorconst:ro. /* only for register variables; UNSAFE !!! */
|
|
|
|
#endif
|
|
|
|
add anyreg:rw:cc, a_word:ro.
|
|
|
|
add memory2:rw:cc, regorconst:ro.
|
|
|
|
#ifdef REGVARS
|
|
|
|
and LOCAL:rw:cc, rmorconst:ro. /* only for register variables; UNSAFE !!! */
|
|
|
|
#endif
|
|
|
|
and rm:rw:cc, regorconst:ro.
|
|
|
|
and anyreg:rw:cc, rmorconst:ro.
|
|
|
|
cbw kills ah cost(1,2).
|
|
|
|
cmp rm:ro, regorconst:ro kills :cc.
|
|
|
|
cmp anyreg:ro, rmorconst:ro kills :cc.
|
|
|
|
cmpb rm1:rw, const:ro kills :cc.
|
|
|
|
cwd kills dx cost(1,5).
|
|
|
|
dec rm:rw:cc cost(1,2).
|
|
|
|
div rm:ro kills:cc ax dx cost(1,150).
|
|
|
|
idiv rm:ro kills:cc ax dx cost(1,170).
|
|
|
|
inc rm:rw:cc cost(1,2).
|
|
|
|
ja label cost(1,4).
|
|
|
|
jae label cost(1,4).
|
|
|
|
jb label cost(1,4).
|
|
|
|
jbe label cost(1,4).
|
|
|
|
jcxz label cost(1,5).
|
|
|
|
je label cost(1,4).
|
|
|
|
jg label cost(1,4).
|
|
|
|
jge label cost(1,4).
|
|
|
|
jl label cost(1,4).
|
|
|
|
jle label cost(1,4).
|
|
|
|
jne label cost(1,4).
|
|
|
|
jmp label cost(1,7).
|
|
|
|
joehoe "call" label+rm cost(1,8).
|
|
|
|
jxx "syntax error" label.
|
|
|
|
lea anyreg:wo, halfindir:ro cost(1,2).
|
1988-07-15 13:00:43 +00:00
|
|
|
loop label kills cx cost(1,5).
|
1988-03-30 13:06:41 +00:00
|
|
|
#ifdef REGVARS
|
|
|
|
mov LOCAL:wo, memory2:ro cost(1,2). /* only for register variables, UNSAFE!!! */
|
|
|
|
#endif
|
|
|
|
mov a_word:wo, regorconst:ro cost(1,2).
|
|
|
|
mov anyreg:wo, rmorconst:ro cost(1,2).
|
|
|
|
movb rm1:wo, regorconst12:ro cost(1,2).
|
|
|
|
movb REG1:wo, rm1:ro cost(1,2).
|
|
|
|
mul rmorconst:ro kills :cc ax dx cost(1,124).
|
|
|
|
neg rmorconst:rw:cc.
|
|
|
|
nop .
|
1988-07-15 13:00:43 +00:00
|
|
|
not rmorconst:rw.
|
1988-03-30 13:06:41 +00:00
|
|
|
ORB "orb" REG1:ro, REG1:ro:cc. /* use ORB for tests */
|
|
|
|
OR "or" anyreg:ro, anyreg:ro:cc. /* Use OR for tests */
|
|
|
|
#ifdef REGVARS
|
|
|
|
or LOCAL:rw:cc, rmorconst:ro. /* only for register variables; UNSAFE !!! */
|
|
|
|
#endif
|
|
|
|
or rm:rw:cc, regorconst:ro.
|
|
|
|
or anyreg:rw:cc, rmorconst:ro.
|
|
|
|
pop rmorconst+rm1:wo cost(1,8).
|
|
|
|
push rmorconst+rm1:ro cost(1,10).
|
|
|
|
rcl rm:rw:cc, ANYCON+SHIFT_CREG:ro.
|
|
|
|
rcr rm:rw:cc, ANYCON+SHIFT_CREG:ro.
|
|
|
|
ret cost(1,8).
|
|
|
|
rol rm:rw:cc, ANYCON+SHIFT_CREG:ro.
|
|
|
|
ror rm:rw:cc, ANYCON+SHIFT_CREG:ro.
|
|
|
|
sal rm:rw:cc, ANYCON+SHIFT_CREG:ro.
|
|
|
|
sar rm:rw:cc, ANYCON+SHIFT_CREG:ro.
|
|
|
|
sbb rm:rw:cc, regorconst:ro.
|
|
|
|
sbb anyreg:rw:cc, rmorconst:ro.
|
|
|
|
shl rm:rw:cc, ANYCON+SHIFT_CREG:ro.
|
|
|
|
shr rm:rw:cc, ANYCON+SHIFT_CREG:ro.
|
|
|
|
#ifdef REGVARS
|
|
|
|
sub LOCAL:rw:cc, rmorconst:ro. /* only for register variables; UNSAFE !!! */
|
|
|
|
#endif
|
|
|
|
sub rm:rw:cc, regorconst:ro.
|
|
|
|
sub anyreg:rw:cc, rmorconst+halfindir:ro.
|
|
|
|
check "test" rm:ro, regorconst:ro kills :cc.
|
|
|
|
check "test" anyreg:ro, rmorconst:ro kills :cc.
|
|
|
|
testb "testb" rm12:ro, regorconst:ro kills :cc.
|
|
|
|
testb "testb" REG+REG1:ro, rmorconst:ro kills :cc.
|
|
|
|
testb "testb" ACC+ACC1:ro, const:ro kills :cc.
|
|
|
|
xchg rm:rw, anyreg:rw.
|
|
|
|
xchg anyreg:rw, rm:rw.
|
|
|
|
xor rm:rw:cc, regorconst:ro.
|
|
|
|
xor anyreg:rw:cc, rmorconst:ro.
|
|
|
|
xorb rm1:rw:cc, regorconst12:ro.
|
|
|
|
xorb anyreg:rw:cc, rm1:ro.
|
|
|
|
killreg "! kill" anyreg:wo cost(0,0).
|
|
|
|
|
|
|
|
data ".sect .data".
|
|
|
|
word ".data2" const:ro.
|
|
|
|
text ".sect .text".
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************/
|
|
|
|
MOVES
|
|
|
|
/*****************************************************************/
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
from memory2 to LOCAL /* unsafe !!! */
|
|
|
|
gen mov %2,%1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
from rm to register
|
|
|
|
gen mov %2,%1
|
|
|
|
|
|
|
|
from anyreg to dest
|
|
|
|
gen mov %2,%1
|
|
|
|
|
|
|
|
from halfindir to register+AREG
|
|
|
|
gen lea %2,%1
|
|
|
|
|
|
|
|
from rm1 to REG1
|
|
|
|
gen movb %2,%1
|
|
|
|
|
|
|
|
from GENREG to rm1
|
|
|
|
gen movb %2,%1.1
|
|
|
|
|
|
|
|
from ANYCON %val==0 to register
|
|
|
|
gen xor %2,%2
|
|
|
|
|
|
|
|
from ANYCON %val==0 to REG1
|
|
|
|
gen xorb %2,%2
|
|
|
|
|
|
|
|
from const to dest
|
|
|
|
gen mov %2,%1
|
|
|
|
|
|
|
|
from const+REG1 to rm1
|
|
|
|
gen movb %2,%1
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************/
|
|
|
|
TESTS
|
|
|
|
/*****************************************************************/
|
|
|
|
|
|
|
|
to test anyreg
|
|
|
|
gen OR %1,%1
|
|
|
|
|
|
|
|
to test memory2
|
|
|
|
gen cmp %1, {ANYCON,0}
|
|
|
|
|
|
|
|
to test REG1
|
|
|
|
gen ORB %1,%1
|
|
|
|
|
|
|
|
to test memory1
|
|
|
|
gen cmpb %1, {ANYCON,0}
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************/
|
|
|
|
STACKINGRULES
|
|
|
|
/*****************************************************************/
|
|
|
|
|
|
|
|
from anyreg to STACK
|
|
|
|
gen push %1
|
|
|
|
|
|
|
|
from memory2 to STACK
|
|
|
|
gen push %1
|
|
|
|
|
|
|
|
from const to STACK
|
|
|
|
uses REG
|
|
|
|
gen move %1,%a
|
|
|
|
push %a
|
|
|
|
|
|
|
|
from const to STACK
|
|
|
|
gen data.
|
|
|
|
1:
|
|
|
|
word %1
|
|
|
|
text.
|
|
|
|
push {EXTERN2,"1b"}
|
|
|
|
|
|
|
|
from rm1 to STACK
|
|
|
|
uses GENREG
|
|
|
|
gen move {ANYCON,0},%a
|
|
|
|
move %1,%a.1
|
|
|
|
push %a
|
|
|
|
|
|
|
|
from rm1 to STACK
|
|
|
|
gen push %1
|
|
|
|
push bx
|
|
|
|
mov bx,sp
|
|
|
|
movb {ind_regoff1,bx,3},{ANYCON,0}
|
|
|
|
pop bx
|
|
|
|
|
|
|
|
from Xreg_off to STACK
|
1988-03-31 17:58:56 +00:00
|
|
|
gen add %1.reg,{CONSTR,%1.off}
|
1988-03-30 13:06:41 +00:00
|
|
|
push %1.reg
|
|
|
|
|
|
|
|
from ADDR_LOCAL %ind==0 to STACK
|
1988-03-31 17:58:56 +00:00
|
|
|
gen
|
|
|
|
push bp
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
from halfindir to STACK
|
|
|
|
uses REG
|
|
|
|
gen move %1,%a
|
|
|
|
push %a
|
|
|
|
|
|
|
|
from halfindir to STACK
|
|
|
|
gen push ax
|
|
|
|
push bx
|
|
|
|
lea ax,%1
|
|
|
|
mov bx,sp
|
|
|
|
xchg {ind_regoff2,bx,2},ax
|
|
|
|
pop bx
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************/
|
|
|
|
COERCIONS
|
|
|
|
/*****************************************************************/
|
|
|
|
|
|
|
|
/***************************
|
|
|
|
* From source to register *
|
|
|
|
***************************/
|
|
|
|
|
|
|
|
from rmorconst
|
|
|
|
uses reusing %1,REG=%1 yields %a
|
|
|
|
|
|
|
|
from Xreg_off
|
1988-03-31 17:58:56 +00:00
|
|
|
gen add %1.reg,{CONSTR,%1.off} yields %1.reg
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
from halfindir
|
|
|
|
uses reusing %1,ADDREG
|
|
|
|
gen move %1,%a yields %a
|
|
|
|
|
1988-03-31 17:58:56 +00:00
|
|
|
from halfindir
|
|
|
|
uses REG
|
|
|
|
gen move %1,%a yields %a
|
1988-03-30 13:06:41 +00:00
|
|
|
/************************
|
|
|
|
* From source to token *
|
|
|
|
************************/
|
|
|
|
|
|
|
|
from ANYCON yields {ADDR_EXTERN,%1.val}
|
|
|
|
|
|
|
|
/****************
|
|
|
|
* From source1 *
|
|
|
|
****************/
|
|
|
|
|
|
|
|
from rm1
|
|
|
|
uses reusing %1,REG1=%1 yields %a
|
|
|
|
|
|
|
|
from rm1
|
|
|
|
uses reusing %1,GENREG
|
|
|
|
gen move %1,%a.1
|
|
|
|
xorb %a.2,%a.2 yields %a
|
|
|
|
|
|
|
|
from ACC1
|
|
|
|
uses reusing %1,ACC
|
|
|
|
gen xorb %a.2,%a.2 yields %a
|
|
|
|
|
|
|
|
/************************
|
|
|
|
* From STACK coercions *
|
|
|
|
************************/
|
|
|
|
|
|
|
|
from STACK
|
|
|
|
uses REG
|
|
|
|
gen pop %a yields %a
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************/
|
|
|
|
PATTERNS
|
|
|
|
/*****************************************************************/
|
|
|
|
|
|
|
|
/******************************************************************
|
|
|
|
* Group 1 : Load Instructions *
|
|
|
|
******************************************************************/
|
|
|
|
|
|
|
|
pat loc yields {ANYCON,$1}
|
|
|
|
|
|
|
|
pat ldc yields {ANYCON,highw($1)}
|
|
|
|
{ANYCON,loww($1)}
|
|
|
|
|
|
|
|
pat lol yields {LOCAL,$1,2}
|
|
|
|
|
|
|
|
pat lol lol $1==$2
|
|
|
|
#ifdef REGVARS
|
|
|
|
&& inreg($1) <= 0
|
|
|
|
#endif
|
|
|
|
uses GENREG = {LOCAL, $1, 2} yields %a %a
|
|
|
|
|
|
|
|
pat loe yields {EXTERN2,$1}
|
|
|
|
|
|
|
|
pat loe loe $1==$2
|
|
|
|
uses GENREG = {EXTERN2, $1} yields %a %a
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lil inreg($1) > 0 yields {ind_reg2, regvar($1)}
|
|
|
|
#endif
|
|
|
|
pat lil
|
|
|
|
uses ADDREG={ind_regoff2,bp,$1} yields {ind_reg2,%a}
|
|
|
|
|
|
|
|
pat lof
|
|
|
|
with exact reg_off yields {ind_regoff2,%1.reg,%1.off+$1}
|
|
|
|
with exact bpreg_off yields {ind_bpregoff2,%1.reg,%1.ind+$1}
|
|
|
|
with exact ADDR_EXTERN yields {EXTERN2,%1.off+$1}
|
|
|
|
with exact ADDR_LOCAL yields {LOCAL,%1.ind + $1,2}
|
1988-03-31 17:58:56 +00:00
|
|
|
with addreg yields {ind_regoff2,%1,$1}
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat lal yields {ADDR_LOCAL,$1}
|
|
|
|
|
|
|
|
pat lae yields {ADDR_EXTERN,$1}
|
|
|
|
|
|
|
|
pat lpb leaving adp SL
|
|
|
|
|
|
|
|
pat lxl $1==0 yields {ADDR_LOCAL,0}
|
|
|
|
|
|
|
|
pat lxl $1==1 yields {LOCAL,SL,2}
|
|
|
|
|
|
|
|
pat lxl $1==2
|
|
|
|
uses ADDREG={ind_regoff2,bp,SSL} yields {ind_regoff2,%a,SSL}
|
|
|
|
|
|
|
|
pat lxl $1>2
|
|
|
|
uses ADDREG={ind_regoff2,bp,SSL},
|
|
|
|
CXREG={ANYCON,$1-1}
|
|
|
|
gen 1:
|
|
|
|
mov %a,{ind_regoff2,%a,4}
|
|
|
|
loop {label,1b} yields %a
|
|
|
|
|
|
|
|
pat lxa $1==0 yields {ADDR_LOCAL,SL}
|
|
|
|
|
|
|
|
pat lxa $1==1
|
|
|
|
uses ADDREG={ind_regoff2,bp,SSL} yields {Xreg_off,%a,SSL}
|
|
|
|
|
|
|
|
pat lxa $1==2
|
|
|
|
uses ADDREG={ind_regoff2,bp,SSL}
|
|
|
|
gen move {ind_regoff2,%a,SSL},%a yields {Xreg_off,%a,SSL}
|
|
|
|
|
|
|
|
pat lxa $1>2
|
|
|
|
uses ADDREG={ind_regoff2,bp,SSL},
|
|
|
|
CXREG={ANYCON,$1-1}
|
|
|
|
gen 1:
|
|
|
|
mov %a,{ind_regoff2,%a,4}
|
|
|
|
loop {label,1b} yields {Xreg_off,%a,SSL}
|
|
|
|
|
|
|
|
pat dch leaving loi 2
|
|
|
|
|
|
|
|
pat loi $1==2
|
|
|
|
with addreg yields {ind_reg2,%1}
|
|
|
|
with exact reg_off yields {ind_regoff2,%1.reg,%1.off}
|
|
|
|
with exact bpreg_off yields {ind_bpregoff2,%1.reg,%1.ind}
|
|
|
|
with exact ADDR_EXTERN yields {EXTERN2,%1.off}
|
|
|
|
with exact ADDR_LOCAL yields {LOCAL,%1.ind,2}
|
|
|
|
|
|
|
|
pat loi $1==1
|
|
|
|
with addreg yields {ind_reg1,%1}
|
|
|
|
with exact reg_off yields {ind_regoff1,%1.reg,%1.off}
|
|
|
|
with exact bpreg_off yields {ind_bpregoff1,%1.reg,%1.ind}
|
|
|
|
with exact ADDR_EXTERN yields {EXTERN1,%1.off}
|
|
|
|
with exact ADDR_LOCAL yields {LOCAL1,%1.ind,1}
|
|
|
|
|
|
|
|
pat loi $1==4
|
|
|
|
with addreg yields {ind_regoff2,%1,2}
|
|
|
|
{ind_reg2,%1}
|
|
|
|
with exact reg_off yields {ind_regoff2,%1.reg,%1.off+2}
|
|
|
|
{ind_regoff2,%1.reg,%1.off}
|
|
|
|
with exact bpreg_off yields {ind_bpregoff2,%1.reg,%1.ind+2}
|
|
|
|
{ind_bpregoff2,%1.reg,%1.ind}
|
|
|
|
with exact ADDR_LOCAL yields {LOCAL,%1.ind+2,2}
|
|
|
|
{LOCAL,%1.ind,2}
|
|
|
|
with exact ADDR_EXTERN yields {EXTERN2,%1.off + 2}
|
|
|
|
{EXTERN2,%1.off}
|
|
|
|
|
|
|
|
pat loi $1>4
|
|
|
|
with BXREG
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON,$1}
|
|
|
|
joehoe {label,".loi"}
|
|
|
|
|
|
|
|
pat los $1==2
|
|
|
|
with CXREG BXREG
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".loi"}
|
|
|
|
|
|
|
|
pat los !defined($1)
|
|
|
|
with rm CXREG BXREG
|
|
|
|
kills ALL
|
|
|
|
gen cmp %1,{ANYCON,2}
|
|
|
|
jne {label,".unknown"}
|
|
|
|
joehoe {label,".loi"}
|
|
|
|
|
|
|
|
pat ldl yields {LOCAL,$1+2,2}
|
|
|
|
{LOCAL,$1,2}
|
|
|
|
|
|
|
|
pat lde yields {EXTERN2,$1 + 2}
|
|
|
|
{EXTERN2,$1}
|
|
|
|
|
|
|
|
pat ldf
|
|
|
|
with exact reg_off yields {ind_regoff2,%1.reg,
|
|
|
|
%1.off + 2 + $1}
|
|
|
|
{ind_regoff2,%1.reg,
|
|
|
|
%1.off + $1}
|
|
|
|
with addreg yields {ind_regoff2,%1,$1+2}
|
|
|
|
{ind_regoff2,%1,$1}
|
|
|
|
with exact bpreg_off yields {ind_bpregoff2,%1.reg,%1.ind+2+$1}
|
|
|
|
{ind_bpregoff2,%1.reg,%1.ind+$1}
|
|
|
|
with exact ADDR_EXTERN yields {EXTERN2,%1.off+2+$1}
|
|
|
|
{EXTERN2,%1.off+$1}
|
|
|
|
with exact ADDR_LOCAL yields {LOCAL,%1.ind + $1 + 2,2}
|
|
|
|
{LOCAL,%1.ind + $1,2}
|
|
|
|
|
|
|
|
pat lpi yields {ADDR_EXTERN,$1}
|
|
|
|
|
|
|
|
/* this code sequence is generated by the C-compiler to tackle
|
|
|
|
char parameters, on the 8086 it reduces to nil */
|
|
|
|
|
|
|
|
pat lol lal sti $1==$2 && $3<=2
|
|
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
* Group 2 : Store Instructions *
|
|
|
|
*******************************************************************/
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat stl inreg($1)==reg_any
|
|
|
|
with rmorconst
|
|
|
|
kills regvar($1)
|
|
|
|
gen move %1, {LOCAL,$1,2}
|
|
|
|
with exact STACK
|
|
|
|
kills regvar($1)
|
|
|
|
gen pop {LOCAL, $1, 2}
|
|
|
|
#endif
|
|
|
|
pat stl
|
|
|
|
with regorconst
|
|
|
|
kills indexed,locals %ind>=$1 && %ind<$1+2
|
|
|
|
gen move %1,{ind_regoff2,bp,$1}
|
|
|
|
with exact STACK
|
|
|
|
kills ALL
|
|
|
|
gen pop {ind_regoff2,bp,$1}
|
|
|
|
|
|
|
|
pat ste
|
|
|
|
with regorconst
|
|
|
|
kills indirects
|
|
|
|
gen move %1,{EXTERN2,$1}
|
|
|
|
with exact STACK
|
|
|
|
kills ALL
|
|
|
|
gen pop {EXTERN2,$1}
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat sil inreg($1)==reg_any
|
|
|
|
with regorconst
|
|
|
|
kills referals
|
|
|
|
gen move %1,{ind_reg2,regvar($1)}
|
|
|
|
with exact STACK
|
|
|
|
kills ALL
|
|
|
|
gen pop {ind_reg2,regvar($1)}
|
|
|
|
#endif
|
|
|
|
pat sil
|
|
|
|
with regorconstnoaddr
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={ind_regoff2,bp,$1}
|
|
|
|
gen move %1,{ind_reg2,%a}
|
|
|
|
killreg %a
|
|
|
|
with exact STACK
|
|
|
|
kills ALL
|
|
|
|
uses ADDREG={ind_regoff2,bp,$1}
|
|
|
|
gen pop {ind_reg2,%a}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat stf
|
|
|
|
with addreg regorconst
|
|
|
|
kills referals
|
|
|
|
gen move %2,{ind_regoff2,%1,$1}
|
|
|
|
with exact addreg STACK
|
|
|
|
kills ALL
|
|
|
|
gen pop {ind_regoff2, %1,$1}
|
|
|
|
with reg_off regorconst
|
|
|
|
kills referals
|
|
|
|
gen move %2,{ind_regoff2,%1.reg,%1.off+$1}
|
|
|
|
with exact reg_off STACK
|
1988-03-31 17:58:56 +00:00
|
|
|
gen pop {ind_regoff2,%1.reg,$1+%1.off}
|
1988-03-30 13:06:41 +00:00
|
|
|
with exact bpreg_off STACK
|
1988-03-31 17:58:56 +00:00
|
|
|
gen pop {ind_bpregoff2,%1.reg,$1+%1.ind}
|
1988-03-30 13:06:41 +00:00
|
|
|
with exact ADDR_LOCAL leaving stl %1.ind+$1
|
|
|
|
with bpreg_off regorconst
|
|
|
|
kills all_locals,indexed
|
|
|
|
gen move %2,{ind_bpregoff2,%1.reg,%1.ind+$1}
|
|
|
|
with ADDR_EXTERN regorconst
|
|
|
|
kills indirects
|
|
|
|
gen move %2,{EXTERN2,%1.off+$1}
|
1988-03-31 17:58:56 +00:00
|
|
|
with exact ADDR_EXTERN STACK
|
|
|
|
kills indirects
|
|
|
|
gen pop {EXTERN2,%1.off+$1}
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat sti $1==2
|
|
|
|
with addreg regorconst
|
|
|
|
kills referals
|
|
|
|
gen move %2,{ind_reg2,%1}
|
|
|
|
with exact addreg STACK
|
|
|
|
kills ALL
|
|
|
|
gen pop {ind_reg2,%1}
|
|
|
|
with reg_off regorconst
|
|
|
|
kills referals
|
|
|
|
gen move %2,{ind_regoff2,%1.reg,%1.off}
|
|
|
|
with exact reg_off STACK
|
|
|
|
kills ALL
|
|
|
|
gen pop {ind_regoff2,%1.reg,%1.off}
|
|
|
|
with exact ADDR_LOCAL leaving stl %1.ind
|
|
|
|
with bpreg_off regorconst
|
|
|
|
kills all_locals,indexed
|
|
|
|
gen move %2,{ind_bpregoff2,%1.reg,%1.ind}
|
|
|
|
with exact bpreg_off STACK
|
|
|
|
gen pop {ind_bpregoff2,%1.reg,%1.ind}
|
1988-03-31 17:58:56 +00:00
|
|
|
with exact ADDR_EXTERN leaving ste %1.off
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat sti $1==1
|
|
|
|
with addreg regorconst12
|
|
|
|
kills referals
|
|
|
|
gen move %2,{ind_reg1,%1}
|
|
|
|
with reg_off regorconst12
|
|
|
|
kills referals
|
|
|
|
gen move %2,{ind_regoff1,%1.reg,%1.off}
|
|
|
|
with bpreg_off regorconst12
|
|
|
|
kills all_locals,indexed
|
|
|
|
gen move %2,{ind_bpregoff1,%1.reg,%1.ind}
|
|
|
|
with ADDR_EXTERN regorconst12
|
|
|
|
kills indirects
|
|
|
|
gen move %2,{EXTERN1,%1.off}
|
|
|
|
with ADDR_LOCAL regorconst12
|
|
|
|
kills indexed,locals %ind<=%1.ind && %ind+%size>%1.ind
|
|
|
|
gen move %2,{ind_regoff1,bp,%1.ind}
|
|
|
|
|
|
|
|
pat sti $1==4
|
|
|
|
with addreg regorconst regorconst
|
|
|
|
kills referals
|
|
|
|
gen move %2,{ind_reg2,%1}
|
|
|
|
move %3,{ind_regoff2,%1,2}
|
|
|
|
with exact addreg STACK
|
|
|
|
kills referals
|
|
|
|
gen pop {ind_reg2,%1}
|
|
|
|
pop {ind_regoff2,%1,2}
|
|
|
|
with reg_off regorconst regorconst
|
|
|
|
kills referals
|
|
|
|
gen move %2,{ind_regoff2,%1.reg,%1.off}
|
|
|
|
move %3,{ind_regoff2,%1.reg,%1.off+2}
|
|
|
|
with exact reg_off STACK
|
|
|
|
kills referals
|
|
|
|
gen pop {ind_regoff2,%1.reg,%1.off}
|
|
|
|
pop {ind_regoff2,%1.reg,%1.off+2}
|
|
|
|
with bpreg_off regorconst regorconst
|
|
|
|
kills all_locals,indexed
|
|
|
|
gen move %2,{ind_bpregoff2,%1.reg,%1.ind}
|
|
|
|
move %3,{ind_bpregoff2,%1.reg,%1.ind+2}
|
|
|
|
with exact bpreg_off STACK
|
|
|
|
kills all_locals,indexed
|
|
|
|
gen pop {ind_bpregoff2,%1.reg,%1.ind}
|
|
|
|
pop {ind_bpregoff2,%1.reg,%1.ind+2}
|
1988-03-31 17:58:56 +00:00
|
|
|
with exact ADDR_EXTERN leaving sde %1.off
|
|
|
|
with exact ADDR_LOCAL leaving sdl %1.ind
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat sti $1>4
|
|
|
|
with BXREG
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON,$1}
|
|
|
|
joehoe {label, ".sti"}
|
|
|
|
|
|
|
|
/* this sort of construction gives problems in the codegenerator
|
|
|
|
because of the potential very large lookahead
|
|
|
|
|
|
|
|
with addreg
|
|
|
|
kills ALL
|
|
|
|
gen pop (%1)
|
|
|
|
add %1,{ANYCON,2} yields %1 leaving sti $1-2
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
pat sts $1==2
|
|
|
|
with CXREG BXREG
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".sti"}
|
|
|
|
|
|
|
|
pat sdl
|
|
|
|
with regorconst regorconst yields %2 %1
|
|
|
|
leaving stl $1 stl $1+2
|
|
|
|
with exact STACK leaving stl $1 stl $1+2
|
|
|
|
|
|
|
|
pat sde
|
|
|
|
with regorconst regorconst yields %2 %1
|
|
|
|
leaving ste $1 ste $1+2
|
|
|
|
with exact STACK leaving ste $1 ste $1+2
|
|
|
|
|
|
|
|
pat sdf
|
|
|
|
with addreg regorconst regorconst
|
|
|
|
kills referals
|
|
|
|
gen move %2,{ind_regoff2,%1,$1}
|
|
|
|
move %3,{ind_regoff2,%1,$1+2}
|
|
|
|
with exact addreg STACK
|
|
|
|
kills ALL
|
|
|
|
gen pop {ind_regoff2,%1,$1}
|
|
|
|
pop {ind_regoff2,%1,$1+2}
|
|
|
|
with reg_off regorconst regorconst
|
|
|
|
kills referals
|
|
|
|
gen move %2,{ind_regoff2,%1.reg,%1.off+$1}
|
|
|
|
move %3,{ind_regoff2,%1.reg,%1.off+$1+2}
|
|
|
|
with exact reg_off STACK
|
|
|
|
kills ALL
|
1988-03-31 17:58:56 +00:00
|
|
|
gen pop {ind_regoff2,%1.reg,$1+%1.off}
|
|
|
|
pop {ind_regoff2,%1.reg,$1+2+%1.off}
|
1988-03-30 13:06:41 +00:00
|
|
|
with exact bpreg_off STACK
|
|
|
|
kills ALL
|
1988-03-31 17:58:56 +00:00
|
|
|
gen pop {ind_bpregoff2, %1.reg,$1+%1.ind}
|
|
|
|
pop {ind_bpregoff2, %1.reg,$1+2+%1.ind}
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
/* Funny things happen when the sign changes in the stl parameters */
|
|
|
|
|
|
|
|
with exact ADDR_LOCAL leaving stl %1.ind+$1
|
|
|
|
stl %1.ind+$1+2
|
1988-03-31 17:58:56 +00:00
|
|
|
with exact ADDR_EXTERN leaving sde %1.off+$1
|
1988-03-30 13:06:41 +00:00
|
|
|
with bpreg_off regorconst regorconst
|
|
|
|
kills all_locals,indexed
|
|
|
|
gen move %2,{ind_bpregoff2,%1.reg,%1.ind+$1}
|
|
|
|
move %3,{ind_bpregoff2,%1.reg,%1.ind+$1+2}
|
|
|
|
with halfindir regorconst
|
|
|
|
kills referals
|
|
|
|
gen mov %1,%2 yields %1 leaving stf $1+2
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************
|
|
|
|
* Group 3 : Integer Arithmetic. *
|
|
|
|
* *
|
|
|
|
* Implemented (sometimes with the use of subroutines) : *
|
|
|
|
* all 2 and 4 byte arithmetic. *
|
|
|
|
****************************************************************/
|
|
|
|
|
|
|
|
pat adi $1==2
|
|
|
|
with EXACT REG rmorconst
|
|
|
|
gen add %1,%2 yields %1
|
|
|
|
with rmorconst REG
|
|
|
|
gen add %2,%1 yields %2
|
1988-07-26 14:21:15 +00:00
|
|
|
with EXACT rmorconst const
|
|
|
|
uses reusing %1,REG=%1
|
|
|
|
gen add %a,%2 yields %a
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat adi $1==4
|
|
|
|
with EXACT REG REG rmorconst rmorconst
|
|
|
|
gen add %1,%3
|
|
|
|
adc %2,%4 yields %2 %1
|
|
|
|
with rmorconst rmorconst REG REG
|
|
|
|
gen add %3,%1
|
|
|
|
adc %4,%2 yields %4 %3
|
|
|
|
|
|
|
|
pat adi !defined($1)
|
|
|
|
with CXREG ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".adi"} yields ax
|
|
|
|
|
|
|
|
pat sbi $1==2
|
|
|
|
|
|
|
|
with rmorconst REG
|
|
|
|
gen sub %2,%1 yields %2
|
|
|
|
with EXACT REG rmorconst
|
|
|
|
gen sub %1,%2
|
|
|
|
neg %1 yields %1
|
|
|
|
|
|
|
|
pat sbi $1==4
|
|
|
|
with rmorconst rmorconst REG REG
|
|
|
|
gen sub %3,%1
|
|
|
|
sbb %4,%2 yields %4 %3
|
|
|
|
|
|
|
|
pat sbi !defined($1)
|
|
|
|
with CXREG ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".sbi"} yields ax
|
|
|
|
|
|
|
|
pat mli $1==2
|
|
|
|
with ACC rm
|
|
|
|
uses reusing %2,DXREG
|
|
|
|
gen mul %2 yields %1
|
|
|
|
/* mul and imul have same low order result
|
|
|
|
but mul is faster
|
|
|
|
*/
|
|
|
|
|
|
|
|
with rmnoacc rmorconst
|
|
|
|
uses reusing %2,DXREG,ACC=%2
|
|
|
|
gen mul %1 yields %b
|
|
|
|
|
|
|
|
pat mli $1==4
|
|
|
|
with ACC DXREG
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".mli4"} yields dx ax
|
|
|
|
|
|
|
|
/*
|
|
|
|
pat mli !defined($1)
|
|
|
|
with ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".mli"}
|
|
|
|
*/
|
|
|
|
|
|
|
|
pat dvi $1==2
|
|
|
|
with rmnoacc rmorconst
|
|
|
|
uses reusing %2,DXREG,ACC=%2
|
|
|
|
gen cwd.
|
|
|
|
idiv %1 yields ax
|
|
|
|
|
|
|
|
pat dvi $1==4
|
|
|
|
kills ALL
|
1988-07-15 13:00:43 +00:00
|
|
|
gen joehoe {label,".dvi4"} yields dx ax
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
pat dvi !defined($1)
|
|
|
|
with ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".dvi"}
|
|
|
|
*/
|
|
|
|
|
|
|
|
pat rmi $1==2
|
|
|
|
with rmnoacc rmorconst
|
|
|
|
uses reusing %2, ACC=%2, DXREG
|
|
|
|
gen cwd.
|
|
|
|
idiv %1 yields dx
|
|
|
|
|
|
|
|
pat rmi $1==4
|
|
|
|
kills ALL
|
1988-07-15 13:00:43 +00:00
|
|
|
gen joehoe {label,".rmi4"} yields dx ax
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
pat rmi !defined($1)
|
|
|
|
with ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".rmi"}
|
|
|
|
*/
|
|
|
|
|
|
|
|
pat ngi $1==2
|
|
|
|
with REG
|
|
|
|
gen neg %1 yields %1
|
|
|
|
|
|
|
|
pat ngi $1==4
|
|
|
|
with REG REG
|
|
|
|
gen neg %2
|
|
|
|
neg %1
|
|
|
|
sbb %2,{ANYCON,0} yields %2 %1
|
|
|
|
|
|
|
|
/*
|
|
|
|
pat ngi !defined($1)
|
|
|
|
with ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".ngi"}
|
|
|
|
*/
|
|
|
|
|
|
|
|
pat loc sli $1==1 && $2==2
|
|
|
|
with REG
|
|
|
|
gen sal %1,{ANYCON,1} yields %1
|
|
|
|
|
|
|
|
pat loc sli $1==1 && $2==4
|
|
|
|
with REG REG
|
|
|
|
gen sal %1,{ANYCON,1}
|
|
|
|
rcl %2,{ANYCON,1} yields %2 %1
|
|
|
|
|
|
|
|
pat loc sli $1==16 && $2==4
|
|
|
|
with rmorconst rmorconst yields %1 {ANYCON,0}
|
|
|
|
|
|
|
|
pat sli $1==2
|
|
|
|
with SHIFT_CREG REG
|
|
|
|
gen sal %2,cl yields %2
|
|
|
|
|
|
|
|
pat sli $1==4
|
|
|
|
with CXREG REG REG
|
|
|
|
gen jcxz {label,1f}
|
|
|
|
2:
|
|
|
|
sal %2,{ANYCON,1}
|
|
|
|
rcl %3,{ANYCON,1}
|
|
|
|
loop {label,2b}
|
|
|
|
1:
|
|
|
|
yields %3 %2
|
|
|
|
|
|
|
|
/*
|
|
|
|
pat sli !defined($1)
|
|
|
|
with ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".sli"}
|
|
|
|
*/
|
|
|
|
|
|
|
|
pat loc sri $1==1 && $2==2
|
|
|
|
with REG
|
|
|
|
gen sar %1,{ANYCON,1} yields %1
|
|
|
|
|
|
|
|
pat loc sri $1==1 && $2==4
|
|
|
|
with REG REG
|
|
|
|
gen sar %2,{ANYCON,1}
|
|
|
|
rcr %1,{ANYCON,1} yields %2 %1
|
|
|
|
|
|
|
|
pat sri $1==2
|
|
|
|
with SHIFT_CREG REG
|
|
|
|
gen sar %2,cl yields %2
|
|
|
|
|
|
|
|
pat sri $1==4
|
|
|
|
with CXREG REG REG
|
|
|
|
gen jcxz {label,1f}
|
|
|
|
2:
|
|
|
|
sar %3,{ANYCON,1}
|
|
|
|
rcr %2,{ANYCON,1}
|
|
|
|
loop {label,2b}
|
|
|
|
1:
|
|
|
|
yields %3 %2
|
|
|
|
|
|
|
|
/*
|
|
|
|
pat sri !defined($1)
|
|
|
|
with ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".sri"}
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
* Group 4: Unsigned Arithmetic *
|
|
|
|
*******************************************************************/
|
|
|
|
|
|
|
|
pat adu leaving adi $1
|
|
|
|
pat sbu leaving sbi $1
|
|
|
|
pat mlu leaving mli $1
|
|
|
|
|
|
|
|
pat dvu $1==2
|
|
|
|
with rmnoacc rmorconst
|
|
|
|
uses reusing %2, ACC=%2, DXREG={ANYCON,0}
|
|
|
|
gen div %1 yields ax
|
|
|
|
|
|
|
|
pat dvu $1==4
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".dvu4"} yields dx ax
|
|
|
|
|
|
|
|
/*
|
|
|
|
pat dvu !defined($1)
|
|
|
|
with ACC STACK
|
1988-07-15 13:00:43 +00:00
|
|
|
kills ALL
|
1988-03-30 13:06:41 +00:00
|
|
|
gen joehoe {label,".dvu"}
|
|
|
|
*/
|
|
|
|
|
|
|
|
pat rmu $1==2
|
|
|
|
with rmnoacc rmorconst
|
|
|
|
uses reusing %2, ACC=%2, DXREG={ANYCON,0}
|
|
|
|
gen div %1 yields dx
|
|
|
|
|
|
|
|
pat rmu $1==4
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".rmu4"} yields dx ax
|
|
|
|
|
|
|
|
/*
|
|
|
|
pat rmu !defined($1)
|
|
|
|
with ACC STACK
|
1988-07-15 13:00:43 +00:00
|
|
|
kills ALL
|
1988-03-30 13:06:41 +00:00
|
|
|
gen joehoe {label,".rmu"}
|
|
|
|
*/
|
|
|
|
|
|
|
|
pat slu leaving sli $1
|
|
|
|
pat loc slu leaving loc $1 sli $2
|
|
|
|
pat lol loc slu leaving lol $1 loc $2 sli $3
|
|
|
|
|
|
|
|
pat loc sru $1==1 && $2==2
|
|
|
|
with REG
|
|
|
|
gen shr %1,{ANYCON, 1} yields %1
|
|
|
|
|
|
|
|
pat loc sru $1==16 && $2==4
|
|
|
|
with rmorconst rmorconst yields {ANYCON,0} %2
|
|
|
|
|
|
|
|
pat sru $1==2
|
|
|
|
with SHIFT_CREG REG
|
|
|
|
gen shr %2,cl yields %2
|
|
|
|
|
|
|
|
pat sru $1==4
|
|
|
|
with CXREG REG REG
|
|
|
|
gen jcxz {label,1f}
|
|
|
|
2:
|
|
|
|
shr %3,{ANYCON, 1}
|
|
|
|
rcr %2,{ANYCON, 1}
|
|
|
|
loop {label,2b}
|
|
|
|
1: yields %3 %2
|
|
|
|
|
|
|
|
/*
|
|
|
|
pat sru !defined($1)
|
|
|
|
with ACC STACK
|
1988-07-15 13:00:43 +00:00
|
|
|
kills ALL
|
1988-03-30 13:06:41 +00:00
|
|
|
gen joehoe {label,".sru"}
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
* Group 5: Floating Point Instructions *
|
|
|
|
*******************************************************************/
|
|
|
|
|
|
|
|
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 cal ".fif4"
|
|
|
|
pat fif $1==8 leaving cal ".fif8"
|
|
|
|
pat fef $1==4
|
|
|
|
with REG REG
|
|
|
|
kills ALL
|
|
|
|
gen push %2
|
|
|
|
push %2
|
|
|
|
push %1 leaving cal ".fef4"
|
|
|
|
pat fef $1==8
|
|
|
|
with REG REG REG REG
|
|
|
|
kills ALL
|
|
|
|
gen push %4
|
|
|
|
push %4
|
|
|
|
push %3
|
|
|
|
push %2
|
|
|
|
push %1 leaving cal ".fef8"
|
|
|
|
|
|
|
|
/******************************************************************
|
|
|
|
* Group 6: Pointer Arithmetic *
|
|
|
|
******************************************************************/
|
|
|
|
|
|
|
|
pat adp $1==1
|
|
|
|
with exact Xreg_off yields {Xreg_off,%1.reg,%1.off+$1}
|
|
|
|
with exact Rreg_off yields {Rreg_off,%1.reg,%1.off+$1}
|
|
|
|
with exact ADDR_EXTERN yields {ADDR_EXTERN,%1.off+$1}
|
|
|
|
with exact ADDR_LOCAL yields {ADDR_LOCAL,%1.ind+$1}
|
|
|
|
with exact Rbpreg_off yields {Rbpreg_off,%1.reg,%1.ind+$1}
|
|
|
|
with REG
|
|
|
|
gen inc %1 yields %1
|
1988-07-19 16:49:49 +00:00
|
|
|
with ADDREG
|
|
|
|
gen killreg %1
|
|
|
|
yields {Xreg_off, %1, $1}
|
1988-03-30 13:06:41 +00:00
|
|
|
with exact RADDREG yields {Rreg_off, %1, $1}
|
|
|
|
|
|
|
|
pat adp $1==0-1
|
|
|
|
with exact Xreg_off yields {Xreg_off,%1.reg,%1.off+$1}
|
|
|
|
with exact Rreg_off yields {Rreg_off,%1.reg,%1.off+$1}
|
|
|
|
with exact ADDR_EXTERN yields {ADDR_EXTERN,%1.off+$1}
|
|
|
|
with exact ADDR_LOCAL yields {ADDR_LOCAL,%1.ind+$1}
|
|
|
|
with exact Rbpreg_off yields {Rbpreg_off,%1.reg,%1.ind+$1}
|
|
|
|
with REG
|
|
|
|
gen dec %1 yields %1
|
1988-07-19 16:49:49 +00:00
|
|
|
with ADDREG
|
|
|
|
gen killreg %1
|
|
|
|
yields {Xreg_off, %1, $1}
|
1988-03-30 13:06:41 +00:00
|
|
|
with exact RADDREG yields {Rreg_off, %1, $1}
|
|
|
|
|
|
|
|
pat adp
|
|
|
|
with exact Xreg_off yields {Xreg_off,%1.reg,%1.off+$1}
|
|
|
|
with exact Rreg_off yields {Rreg_off,%1.reg,%1.off+$1}
|
|
|
|
with exact ADDR_EXTERN yields {ADDR_EXTERN,%1.off+$1}
|
|
|
|
with exact ADDR_LOCAL yields {ADDR_LOCAL,%1.ind+$1}
|
|
|
|
with exact Rbpreg_off yields {Rbpreg_off,%1.reg,%1.ind+$1}
|
1988-07-19 16:49:49 +00:00
|
|
|
with ADDREG
|
|
|
|
gen killreg %1
|
|
|
|
yields {Xreg_off,%1,$1}
|
1988-03-30 13:06:41 +00:00
|
|
|
with exact RADDREG yields {Rreg_off, %1, $1}
|
|
|
|
with REG
|
|
|
|
gen add %1,{ANYCON,$1} yields %1
|
|
|
|
|
|
|
|
pat ads $1==2
|
|
|
|
with exact ANYCON Rreg_off
|
|
|
|
yields {Rreg_off,%2.reg,%2.off+%1.val}
|
|
|
|
with exact ANYCON Xreg_off
|
|
|
|
yields {Xreg_off,%2.reg,%2.off+%1.val}
|
|
|
|
with exact ADDR_EXTERN Rreg_off
|
|
|
|
yields {Rreg_off,%2.reg,%2.off+%1.off}
|
|
|
|
with exact ADDR_EXTERN Xreg_off
|
|
|
|
yields {Xreg_off,%2.reg,%2.off+%1.off}
|
1988-03-31 17:58:56 +00:00
|
|
|
with rmorconst Xreg_off
|
|
|
|
gen add %2.reg,%1 yields %2
|
1988-03-30 13:06:41 +00:00
|
|
|
with exact ANYCON Rbpreg_off
|
1988-03-31 17:58:56 +00:00
|
|
|
yields {Rbpreg_off,%2.reg,%2.ind+%1.val}
|
1988-03-30 13:06:41 +00:00
|
|
|
with Xreg_off rmorconst
|
1988-03-31 17:58:56 +00:00
|
|
|
gen add %1.reg,%2 yields %1
|
1988-03-30 13:06:41 +00:00
|
|
|
with exact Xreg_off ANYCON
|
|
|
|
yields {Xreg_off,%1.reg,%1.off+%2.val}
|
|
|
|
with exact Rreg_off ANYCON
|
|
|
|
yields {Rreg_off,%1.reg,%1.off+%2.val}
|
|
|
|
with exact Xreg_off ADDR_EXTERN
|
|
|
|
yields {Xreg_off,%1.reg,%1.off+%2.off}
|
|
|
|
with exact Rreg_off ADDR_EXTERN
|
|
|
|
yields {Rreg_off,%1.reg,%1.off+%2.off}
|
|
|
|
with exact Xreg_off reg_off
|
|
|
|
gen add %1.reg,%2.reg
|
|
|
|
yields {Xreg_off,%1.reg,%1.off+%2.off}
|
1988-03-31 17:58:56 +00:00
|
|
|
with exact IREG ADDR_LOCAL
|
1988-03-30 13:06:41 +00:00
|
|
|
yields {Rbpreg_off, %1, %2.ind}
|
1988-03-31 17:58:56 +00:00
|
|
|
with exact IREG ADDR_EXTERN
|
1988-03-30 13:06:41 +00:00
|
|
|
yields {Rreg_off, %1, %2.off}
|
1988-03-31 17:58:56 +00:00
|
|
|
with exact ADDR_EXTERN IREG
|
1988-03-30 13:06:41 +00:00
|
|
|
yields {Rreg_off,%2,%1.off}
|
1988-03-31 17:58:56 +00:00
|
|
|
with exact ADDR_LOCAL IREG
|
1988-03-30 13:06:41 +00:00
|
|
|
yields {Rbpreg_off,%2,%1.ind}
|
|
|
|
|
1988-03-31 17:58:56 +00:00
|
|
|
with exact rmorconst ADDR_EXTERN
|
|
|
|
uses reusing %1,ADDREG=%1
|
|
|
|
yields {Xreg_off,%a,%2.off}
|
|
|
|
with exact ADDR_EXTERN rmorconst
|
|
|
|
uses reusing %2,ADDREG=%2
|
|
|
|
yields {Xreg_off,%a,%1.off}
|
1988-03-30 13:06:41 +00:00
|
|
|
with rm ADDREG
|
|
|
|
gen add %2,%1 yields %2
|
1988-03-31 17:58:56 +00:00
|
|
|
with ADDREG rm
|
|
|
|
gen add %1,%2 yields %1
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat sbs $1==2
|
|
|
|
with exact ANYCON Xreg_off
|
|
|
|
yields {Xreg_off,%2.reg,%2.off+"-"+%1.val}
|
|
|
|
with exact ANYCON Rreg_off
|
|
|
|
yields {Rreg_off,%2.reg,%2.off+"-"+%1.val}
|
|
|
|
with exact ANYCON ADDR_LOCAL
|
|
|
|
yields {ADDR_LOCAL,%2.ind-%1.val}
|
|
|
|
with rm Xreg_off
|
|
|
|
gen sub %2.reg,%1 yields {Xreg_off,%2.reg,%2.off}
|
|
|
|
|
|
|
|
/* Should not occur
|
|
|
|
with exact reg_off ANYCON
|
|
|
|
yields {reg_off,%1.reg,%1.off-%2.val}
|
|
|
|
with ANYCON ADDR_EXTERN
|
|
|
|
yields {ADDR_EXTERN,%2.off+%1.val}
|
|
|
|
with exact ANYCON ADDR_LOCAL
|
|
|
|
yields {ADDR_LOCAL,%1.val+%2.ind}
|
|
|
|
*/
|
|
|
|
|
|
|
|
with rm REG
|
|
|
|
gen sub %2,%1 yields %2
|
|
|
|
with const ACC
|
|
|
|
gen sub %2,%1 yields %2
|
|
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
* Group 7 : Increment/Decrement Zero *
|
|
|
|
*******************************************************************/
|
|
|
|
|
|
|
|
pat inc
|
|
|
|
with REG
|
|
|
|
gen inc %1 yields %1
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat inl inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
|
|
|
gen inc {LOCAL,$1,2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat inl
|
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+2
|
|
|
|
gen inc {LOCAL, $1, 2}
|
|
|
|
|
|
|
|
pat ine
|
|
|
|
kills indirects
|
|
|
|
gen inc {EXTERN2, $1}
|
|
|
|
|
|
|
|
pat dec
|
|
|
|
with REG
|
|
|
|
gen dec %1 yields %1
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat del inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
|
|
|
gen dec {LOCAL,$1,2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat del
|
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+2
|
|
|
|
gen dec {LOCAL, $1, 2}
|
|
|
|
|
|
|
|
pat dee
|
|
|
|
kills indirects
|
|
|
|
gen dec {EXTERN2, $1}
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat zrl inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
|
|
|
gen move {ANYCON, 0}, {LOCAL,$1,2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat zrl
|
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+2
|
|
|
|
gen move {ANYCON, 0}, {LOCAL,$1,2}
|
|
|
|
|
|
|
|
pat zre
|
|
|
|
kills indirects
|
|
|
|
gen move {ANYCON, 0}, {EXTERN2, $1}
|
|
|
|
|
|
|
|
pat zrf leaving zer $1
|
|
|
|
|
|
|
|
pat zer $1==2 yields {ANYCON, 0}
|
|
|
|
pat zer $1==4 yields {ANYCON, 0} {ANYCON, 0}
|
|
|
|
pat zer $1==6 yields {ANYCON, 0} {ANYCON, 0}
|
|
|
|
{ANYCON, 0}
|
|
|
|
pat zer $1==8 yields {ANYCON, 0} {ANYCON, 0}
|
|
|
|
{ANYCON, 0} {ANYCON, 0}
|
|
|
|
|
|
|
|
pat zer defined($1)
|
|
|
|
with STACK
|
|
|
|
gen move {ANYCON, $1/2}, cx
|
|
|
|
move {ANYCON, 0}, bx
|
|
|
|
1:
|
|
|
|
push bx
|
|
|
|
loop {label,1b}
|
|
|
|
|
|
|
|
pat zer !defined($1)
|
|
|
|
with CXREG STACK
|
|
|
|
gen move {ANYCON, $1/2}, bx
|
|
|
|
sar cx,{ANYCON, 1}
|
|
|
|
1:
|
|
|
|
push bx
|
|
|
|
loop {label,1b}
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol adi stl $1==$3 && $2==2 && inreg($1)==reg_any
|
|
|
|
with rmorconst
|
|
|
|
kills regvar($1)
|
|
|
|
gen add {LOCAL,$1,2}, %1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol adi stl $1==$3 && $2==2
|
|
|
|
with regorconst
|
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+2
|
|
|
|
gen add {LOCAL, $1, 2}, %1
|
|
|
|
|
|
|
|
pat ldl adi sdl $1==$3 && $2==4
|
|
|
|
with regorconst regorconst
|
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+4
|
|
|
|
gen add {LOCAL,$1,2},%1
|
|
|
|
adc {LOCAL,$1+2,2},%2
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol loc sbi stl $1==$4 && $3==2 && inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
|
|
|
gen sub {LOCAL,$1,2},{ANYCON,$2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol loc sbi stl $1==$4 && $3==2
|
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+2
|
|
|
|
gen sub {LOCAL,$1,2},{ANYCON,$2}
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol loc sli stl $1==$4 && $2==1 && $3==2 && inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
|
|
|
gen sal {LOCAL,$1,2},{ANYCON,1}
|
|
|
|
pat lol loc sli stl $1==$4 && $2==2 && $3==2 && inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
|
|
|
gen sal {LOCAL,$1,2},{ANYCON,1}
|
|
|
|
sal {LOCAL,$1,2},{ANYCON,1}
|
|
|
|
pat lol loc sli stl $1==$4 && $3==2 && inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
1988-07-15 13:00:43 +00:00
|
|
|
uses CXREG={ANYCON,$2}
|
1988-03-30 13:06:41 +00:00
|
|
|
gen sal {LOCAL,$1,2},cl
|
|
|
|
pat lol loc sri stl $1==$4 && $2==1 && $3==2 && inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
|
|
|
gen sar {LOCAL,$1,2},{ANYCON,1}
|
|
|
|
pat lol loc sri stl $1==$4 && $2==2 && $3==2 && inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
|
|
|
gen sar {LOCAL,$1,2},{ANYCON,1}
|
|
|
|
sar {LOCAL,$1,2},{ANYCON,1}
|
|
|
|
pat lol loc sri stl $1==$4 && $3==2 && inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
1988-07-15 13:00:43 +00:00
|
|
|
uses CXREG={ANYCON,$2}
|
1988-03-30 13:06:41 +00:00
|
|
|
gen sar {LOCAL,$1,2},cl
|
|
|
|
#endif
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol ngi stl $1==$3 && $2==2 && inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
|
|
|
gen neg {LOCAL, $1, 2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol ngi stl $1==$3 && $2==2
|
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+2
|
|
|
|
gen neg {LOCAL, $1, 2}
|
|
|
|
|
1988-07-19 16:49:49 +00:00
|
|
|
pat ldl ngi sdl $1==$3 && $2==4
|
1988-03-30 13:06:41 +00:00
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+4
|
|
|
|
gen neg {LOCAL, $1, 2}
|
|
|
|
neg {LOCAL, $1+2, 2}
|
|
|
|
sbb {LOCAL, $1+2, 2}, {ANYCON, 0}
|
|
|
|
|
|
|
|
pat lol ads stl $1==$3 && $2==2 leaving lol $1 adi $2 stl $1
|
|
|
|
|
|
|
|
pat lol lol adp stl $1==$2 && $2==$4
|
|
|
|
uses ADDREG={LOCAL,$1,2} yields %a
|
|
|
|
leaving lol $2 adp $3 stl $2
|
|
|
|
|
|
|
|
pat lol inl $1==$2
|
|
|
|
uses REG={LOCAL,$1,2} yields %a
|
|
|
|
leaving inl $1
|
|
|
|
|
|
|
|
pat lol del $1==$2
|
|
|
|
uses REG={LOCAL,$1,2} yields %a
|
|
|
|
leaving del $1
|
|
|
|
|
|
|
|
pat lol adp stl $1==$3 && $2==1 leaving inl $1
|
|
|
|
pat lol adp stl $1==$3 && $2==0-1 leaving del $1
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol adp stl $1==$3 && inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
|
|
|
gen add {LOCAL,$1,2}, {ANYCON,$2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol adp stl $1==$3
|
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+2
|
|
|
|
gen add {LOCAL,$1,2}, {ANYCON,$2}
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol and stl $1==$3 && $2==2 && inreg($1)==reg_any
|
|
|
|
with rmorconst
|
|
|
|
kills regvar($1)
|
|
|
|
gen and {LOCAL,$1,2}, %1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol and stl $1==$3 && $2==2
|
|
|
|
with regorconst
|
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+2
|
|
|
|
gen and {LOCAL, $1, 2}, %1
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol ior stl $1==$3 && $2==2 && inreg($1)==reg_any
|
|
|
|
with rmorconst
|
|
|
|
kills regvar($1)
|
|
|
|
gen or {LOCAL,$1,2}, %1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol ior stl $1==$3 && $2==2
|
|
|
|
with regorconst
|
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+2
|
|
|
|
gen or {LOCAL, $1, 2}, %1
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol com stl $1==$3 && $2==2 && inreg($1)==reg_any
|
|
|
|
kills regvar($1)
|
|
|
|
gen not {LOCAL,$1,2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol com stl $1==$3 && $2==2
|
|
|
|
kills indexed, locals %ind>=$1 && %ind<$1+2
|
|
|
|
gen not {LOCAL, $1, 2}
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lil adi sil $1==$3 && $2==2 && inreg($1)==reg_any
|
|
|
|
with regorconst
|
|
|
|
kills referals
|
|
|
|
gen add {ind_reg2, regvar($1)}, %1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lil adi sil $1==$3 && $2==2
|
|
|
|
with regorconst
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL, $1, 2}
|
|
|
|
gen add {ind_reg2, %a}, %1
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lil ngi sil $1==$3 && $2==2 && inreg($1)==reg_any
|
|
|
|
kills referals
|
|
|
|
gen neg {ind_reg2, regvar($1)}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lil ngi sil $1==$3 && $2==2
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL, $1, 2}
|
|
|
|
gen neg {ind_reg2, %a}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat lil ads sil $1==$3 && $2==2 leaving lil $1 adi $2 sil $3
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lil adp sil $1==$3 && $2==1 && inreg($1)==reg_any
|
|
|
|
kills referals
|
|
|
|
gen inc {ind_reg2, regvar($1)}
|
|
|
|
|
|
|
|
pat lil adp sil $1==$3 && $2==0-1 && inreg($1)==reg_any
|
|
|
|
kills referals
|
|
|
|
gen dec {ind_reg2, regvar($1)}
|
|
|
|
|
|
|
|
pat lil adp sil $1==$3 && inreg($1)==reg_any
|
|
|
|
kills referals
|
|
|
|
gen add {ind_reg2, regvar($1)}, {ANYCON,$2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lil adp sil $1==$3
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL, $1, 2}
|
|
|
|
gen add {ind_reg2, %a}, {ANYCON,$2}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat lil adp sil $1==$3 && $2==1
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL, $1, 2}
|
|
|
|
gen inc {ind_reg2, %a}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat lil adp sil $1==$3 && $2==0-1
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL, $1, 2}
|
|
|
|
gen dec {ind_reg2, %a}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lil and sil $1==$3 && $2==2 && inreg($1)==reg_any
|
|
|
|
with regorconst
|
|
|
|
kills referals
|
|
|
|
gen and {ind_reg2, regvar($1)}, %1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lil and sil $1==$3 && $2==2
|
|
|
|
with regorconst
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL, $1, 2}
|
|
|
|
gen and {ind_reg2, %a}, %1
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lil ior sil $1==$3 && $2==2 && inreg($1)==reg_any
|
|
|
|
with regorconst
|
|
|
|
kills referals
|
|
|
|
gen or {ind_reg2, regvar($1)}, %1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lil ior sil $1==$3 && $2==2
|
|
|
|
with regorconst
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL, $1, 2}
|
|
|
|
gen or {ind_reg2, %a}, %1
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lil com sil $1==$3 && $2==2 && inreg($1)==reg_any
|
|
|
|
kills referals
|
|
|
|
gen not {ind_reg2, regvar($1)}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lil com sil $1==$3 && $2==2
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL, $1, 2}
|
|
|
|
gen not {ind_reg2, %a}
|
|
|
|
killreg %a
|
|
|
|
|
1988-07-19 16:49:49 +00:00
|
|
|
pat lol lof inc lol stf $1==$4 && $2==$5
|
|
|
|
leaving lol $1 lof $2 adp 1 lol $4 stf $5
|
|
|
|
pat lol lof dec lol stf $1==$4 && $2==$5
|
|
|
|
leaving lol $1 lof $2 adp (0-1) lol $4 stf $5
|
1988-03-30 13:06:41 +00:00
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol lof adi lol stf $1==$4 && $2==$5 && $3==2 && inreg($1)==reg_any
|
|
|
|
with regorconst
|
|
|
|
kills referals
|
|
|
|
gen add {ind_regoff2, regvar($1), $2}, %1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol lof adi lol stf $1==$4 && $2==$5 && $3==2
|
|
|
|
with regorconstnoaddr
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL,$1,2}
|
|
|
|
gen add {ind_regoff2, %a, $2}, %1
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol lof ngi lol stf $1==$4 && $2==$5 && $3==2 && inreg($1)==reg_any
|
|
|
|
kills referals
|
|
|
|
gen neg {ind_regoff2, regvar($1), $2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol lof ngi lol stf $1==$4 && $2==$5 && $3==2
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL,$1,2}
|
|
|
|
gen neg {ind_regoff2, %a, $2}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat lol lof ads lol stf $1==$4 && $2==$5 && $3==2
|
1988-07-19 16:49:49 +00:00
|
|
|
leaving lol $1 lof $2 adi $3 lol $4 stf $5
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol lof adp lol stf $1==$4 && $2==$5 && $3==1 && inreg($1)==reg_any
|
|
|
|
kills referals
|
|
|
|
gen inc {ind_regoff2, regvar($1), $2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol lof adp lol stf $1==$4 && $2==$5 && $3==1
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL,$1,2}
|
|
|
|
gen inc {ind_regoff2, %a, $2}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol lof adp lol stf $1==$4 && $2==$5 && $3==0-1 && inreg($1)==reg_any
|
|
|
|
kills referals
|
|
|
|
gen dec {ind_regoff2, regvar($1), $2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol lof adp lol stf $1==$4 && $2==$5 && $3==0-1
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL,$1,2}
|
|
|
|
gen dec {ind_regoff2, %a, $2}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==reg_any
|
|
|
|
kills referals
|
|
|
|
gen add {ind_regoff2, regvar($1), $2},{ANYCON,$3}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol lof adp lol stf $1==$4 && $2==$5
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL,$1,2}
|
|
|
|
gen add {ind_regoff2, %a, $2},{ANYCON,$3}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol lof and lol stf $1==$4 && $2==$5 && $3==2 && inreg($1)==reg_any
|
|
|
|
with regorconst
|
|
|
|
kills referals
|
|
|
|
gen and {ind_regoff2, regvar($1), $2}, %1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol lof and lol stf $1==$4 && $2==$5 && $3==2
|
|
|
|
with regorconstnoaddr
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL,$1,2}
|
|
|
|
gen and {ind_regoff2, %a, $2}, %1
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol lof ior lol stf $1==$4 && $2==$5 && $3==2 && inreg($1)==reg_any
|
|
|
|
with regorconst
|
|
|
|
kills referals
|
|
|
|
gen or {ind_regoff2, regvar($1), $2}, %1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol lof ior lol stf $1==$4 && $2==$5 && $3==2
|
|
|
|
with regorconstnoaddr
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL,$1,2}
|
|
|
|
gen or {ind_regoff2, %a, $2}, %1
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
#ifdef REGVARS
|
|
|
|
pat lol lof com lol stf $1==$4 && $2==$5 && $3==2 && inreg($1)==reg_any
|
|
|
|
kills referals
|
|
|
|
gen not {ind_regoff2, regvar($1), $2}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat lol lof com lol stf $1==$4 && $2==$5 && $3==2
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={LOCAL,$1,2}
|
|
|
|
gen not {ind_regoff2, %a, $2}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat loe adi ste $1==$3 && $2==2
|
|
|
|
with regorconst
|
|
|
|
kills indirects
|
|
|
|
gen add {EXTERN2, $1}, %1
|
|
|
|
|
|
|
|
pat lde adi sde $1==$3 && $2==4
|
|
|
|
with regorconst regorconst
|
|
|
|
kills indirects
|
|
|
|
gen add {EXTERN2, $1}, %1
|
|
|
|
adc {EXTERN2, $1+2}, %2
|
|
|
|
|
|
|
|
pat loe ngi ste $1==$3 && $2==2
|
|
|
|
kills indirects
|
|
|
|
gen neg {EXTERN2, $1}
|
|
|
|
|
|
|
|
pat lde ngi sde $1==$3 && $2==4
|
|
|
|
kills indirects
|
|
|
|
gen neg {EXTERN2, $1}
|
|
|
|
neg {EXTERN2, $1+2}
|
|
|
|
sbb {EXTERN2, $1+2}, {ANYCON, 0}
|
|
|
|
|
|
|
|
pat loe ads ste $1==$3 && $2==2
|
|
|
|
with regorconst
|
|
|
|
kills indirects
|
|
|
|
gen add {EXTERN2, $1}, %1
|
|
|
|
|
|
|
|
pat loe loe adp ste $1==$2 && $1==$4
|
|
|
|
uses ADDREG={EXTERN2,$1} yields %a
|
|
|
|
leaving loe $1 adp $3 ste $1
|
|
|
|
|
|
|
|
pat loe ine $1==$2
|
|
|
|
uses ADDREG={EXTERN2,$1} yields %a
|
|
|
|
leaving ine $1
|
|
|
|
|
|
|
|
pat loe dee $1==$2
|
|
|
|
uses ADDREG={EXTERN2,$1} yields %a
|
|
|
|
leaving dee $1
|
|
|
|
|
|
|
|
pat loe adp ste $1==$3
|
|
|
|
kills indirects
|
|
|
|
gen add {EXTERN2, $1}, {ANYCON,$2}
|
|
|
|
|
|
|
|
pat loe adp ste $1==$3 && $2==1
|
|
|
|
kills indirects
|
|
|
|
gen inc {EXTERN2, $1}
|
|
|
|
|
|
|
|
pat loe adp ste $1==$3 && $2==0-1
|
|
|
|
kills indirects
|
|
|
|
gen dec {EXTERN2, $1}
|
|
|
|
|
|
|
|
pat loe and ste $1==$3 && $2==2
|
|
|
|
with regorconst
|
|
|
|
kills indirects
|
|
|
|
gen and {EXTERN2, $1}, %1
|
|
|
|
|
|
|
|
pat loe ior ste $1==$3 && $2==2
|
|
|
|
with regorconst
|
|
|
|
kills indirects
|
|
|
|
gen or {EXTERN2, $1}, %1
|
|
|
|
|
|
|
|
pat loe com ste $1==$3 && $2==2
|
|
|
|
kills indirects
|
|
|
|
gen not {EXTERN2, $1}
|
|
|
|
|
|
|
|
pat loe lof adi loe stf $1==$4 && $2==$5 && $3==2
|
|
|
|
with regorconstnoaddr
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={EXTERN2,$1}
|
|
|
|
gen add {ind_regoff2, %a, $2}, %1
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat loe lof ngi loe stf $1==$4 && $2==$5 && $3==2
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={EXTERN2,$1}
|
|
|
|
gen neg {ind_regoff2, %a, $2}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat loe lof adp loe stf $1==$4 && $2==$5 && $3==1
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={EXTERN2,$1}
|
|
|
|
gen inc {ind_regoff2, %a, $2}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat loe lof adp loe stf $1==$4 && $2==$5 && $3==0-1
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={EXTERN2,$1}
|
|
|
|
gen dec {ind_regoff2, %a, $2}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat loe lof adp loe stf $1==$4 && $2==$5
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={EXTERN2,$1}
|
|
|
|
gen add {ind_regoff2, %a, $2}, {ANYCON, $3}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat loe lof ads loe stf $1==$4 && $2==$5 && $3==2
|
|
|
|
with regorconstnoaddr
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={EXTERN2,$1}
|
|
|
|
gen add {ind_regoff2, %a, $2}, %1
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat loe lof and loe stf $1==$4 && $2==$5 && $3==2
|
|
|
|
with regorconstnoaddr
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={EXTERN2,$1}
|
|
|
|
gen and {ind_regoff2, %a, $2}, %1
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat loe lof ior loe stf $1==$4 && $2==$5 && $3==2
|
|
|
|
with regorconstnoaddr
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={EXTERN2,$1}
|
|
|
|
gen or {ind_regoff2, %a, $2}, %1
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
pat loe lof com loe stf $1==$4 && $2==$5 && $3==2
|
|
|
|
kills referals
|
|
|
|
uses ADDREG={EXTERN2,$1}
|
|
|
|
gen not {ind_regoff2, %a, $2}
|
|
|
|
killreg %a
|
|
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
* Group 8: Convert Instructions *
|
|
|
|
*******************************************************************/
|
|
|
|
|
|
|
|
pat cii
|
|
|
|
with CXREG DXREG ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".cii"} yields %3
|
|
|
|
|
|
|
|
pat ciu leaving cuu
|
|
|
|
pat cui leaving cuu
|
|
|
|
|
|
|
|
pat cuu
|
|
|
|
with CXREG DXREG ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".cuu"} yields %3
|
|
|
|
|
|
|
|
pat loc loc cii $1==1 && $2==2
|
|
|
|
with ACC
|
|
|
|
gen cbw. yields ax
|
|
|
|
with exact rmorconst1
|
|
|
|
uses reusing %1, ACC1=%1
|
|
|
|
gen cbw. yields ax
|
|
|
|
|
|
|
|
pat loc loc cii $1==1 && $2==4
|
|
|
|
with ACC
|
|
|
|
uses DXREG
|
|
|
|
gen cbw.
|
|
|
|
cwd. yields dx ax
|
|
|
|
with exact rmorconst1
|
|
|
|
uses reusing %1, ACC1=%1, DXREG
|
|
|
|
gen cbw.
|
|
|
|
cwd. yields dx ax
|
|
|
|
|
|
|
|
pat loc loc cii $1==2 && $2==4
|
|
|
|
with ACC
|
|
|
|
uses DXREG
|
|
|
|
gen cwd. yields dx ax
|
|
|
|
|
|
|
|
pat loc loc cii $1==4 && $2==2
|
|
|
|
with a_word a_word yields %1
|
|
|
|
|
|
|
|
pat loc loc ciu leaving loc $1 loc $2 cuu
|
|
|
|
pat loc loc cui leaving loc $1 loc $2 cuu
|
|
|
|
|
|
|
|
pat loc loc cuu $1==$2
|
|
|
|
|
|
|
|
pat loc loc cuu $1==2 && $2==4
|
|
|
|
with a_word yields {ANYCON,0} %1
|
|
|
|
|
|
|
|
pat loc loc cuu $1==4 && $2==2
|
|
|
|
with a_word a_word yields %1
|
|
|
|
|
|
|
|
pat loc loc cif $1==2 && $2==4 leaving loc $1 cal ".cif4"
|
|
|
|
pat loc loc cif $1==4 && $2==4 leaving loc $1 cal ".cif4" asp 2
|
|
|
|
|
|
|
|
pat loc loc cif $1==2 && $2==8
|
|
|
|
with REG
|
|
|
|
kills ALL
|
|
|
|
gen push %1
|
|
|
|
push %1
|
|
|
|
push %1 leaving loc $1 cal ".cif8"
|
|
|
|
|
|
|
|
pat loc loc cif $1==4 && $2==8
|
|
|
|
with REG REG
|
|
|
|
kills ALL
|
|
|
|
gen push %1
|
|
|
|
push %2
|
|
|
|
push %1 leaving loc $1 cal ".cif8"
|
|
|
|
|
|
|
|
pat loc loc cuf $1==2 && $2==4 leaving loc $1 cal ".cuf4"
|
|
|
|
pat loc loc cuf $1==4 && $2==4 leaving loc $1 cal ".cuf4" asp 2
|
|
|
|
|
|
|
|
pat loc loc cuf $1==2 && $2==8
|
|
|
|
with REG
|
|
|
|
kills ALL
|
|
|
|
gen push %1
|
|
|
|
push %1
|
|
|
|
push %1 leaving loc $1 cal ".cuf8"
|
|
|
|
|
|
|
|
pat loc loc cuf $1==4 && $2==8
|
|
|
|
with REG REG
|
|
|
|
kills ALL
|
|
|
|
gen push %1
|
|
|
|
push %2
|
|
|
|
push %1 leaving loc $1 cal ".cuf8"
|
|
|
|
|
|
|
|
pat loc loc cfi $1==4 && $2==2 leaving loc $1 loc $2 cal ".cfi" asp 8 lfr 2
|
|
|
|
pat loc loc cfi $2==4 leaving loc $1 loc $2 cal ".cfi" asp $1
|
|
|
|
pat loc loc cfi $1==8 && $2==2 leaving loc $1 loc $2 cal ".cfi" asp 12 lfr 2
|
|
|
|
pat loc loc cfu $1==4 && $2==2 leaving loc $1 loc $2 cal ".cfu" asp 8 lfr 2
|
|
|
|
pat loc loc cfu $2==4 leaving loc $1 loc $2 cal ".cfu" asp $1
|
|
|
|
pat loc loc cfu $1==8 && $2==2 leaving loc $1 loc $2 cal ".cfu" asp 12 lfr 2
|
|
|
|
pat loc loc cff $1==8 && $2==4 leaving cal ".cff4" asp 4
|
|
|
|
pat loc loc cff $1==4 && $2==8
|
|
|
|
with REG REG
|
|
|
|
kills ALL
|
|
|
|
uses REG={ANYCON,0}
|
|
|
|
gen push %a
|
|
|
|
push %a
|
|
|
|
push %2
|
|
|
|
push %1 leaving cal ".cff8"
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
* Group 9 : Logical Instructions *
|
|
|
|
********************************************************************/
|
|
|
|
|
|
|
|
pat and $1==2
|
|
|
|
with EXACT REG rmorconst
|
|
|
|
gen and %1,%2 yields %1
|
|
|
|
with rmorconst REG
|
|
|
|
gen and %2,%1 yields %2
|
|
|
|
|
|
|
|
pat and $1==4
|
|
|
|
with EXACT REG REG rmorconst rmorconst
|
|
|
|
gen and %1,%3
|
|
|
|
and %2,%4 yields %2 %1
|
|
|
|
with rmorconst rmorconst REG REG
|
|
|
|
gen and %3,%1
|
|
|
|
and %4,%2 yields %4 %3
|
|
|
|
|
|
|
|
pat and defined($1)
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON,$1}
|
|
|
|
joehoe {label, ".and"}
|
|
|
|
|
|
|
|
pat and !defined($1)
|
|
|
|
with CXREG
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label, ".and"}
|
|
|
|
|
|
|
|
pat ior $1==2
|
1988-07-15 14:57:43 +00:00
|
|
|
with EXACT REG rmorconst
|
1988-03-30 13:06:41 +00:00
|
|
|
gen or %1,%2 yields %1
|
1988-07-15 14:57:43 +00:00
|
|
|
with rmorconst REG
|
1988-03-30 13:06:41 +00:00
|
|
|
gen or %2,%1 yields %2
|
|
|
|
|
|
|
|
pat ior $1==4
|
|
|
|
with EXACT REG REG rmorconst rmorconst
|
|
|
|
gen or %1,%3
|
|
|
|
or %2,%4 yields %2 %1
|
|
|
|
with rmorconst rmorconst REG REG
|
|
|
|
gen or %3,%1
|
|
|
|
or %4,%2 yields %4 %3
|
|
|
|
|
|
|
|
pat ior defined($1)
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON,$1}
|
|
|
|
joehoe {label, ".ior"}
|
|
|
|
|
|
|
|
pat ior !defined($1)
|
|
|
|
with CXREG
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label, ".ior"}
|
|
|
|
|
|
|
|
pat xor $1==2
|
|
|
|
with EXACT REG rmorconst
|
|
|
|
gen xor %1,%2 yields %1
|
|
|
|
with rmorconst REG
|
|
|
|
gen xor %2,%1 yields %2
|
|
|
|
|
|
|
|
pat xor $1==4
|
|
|
|
with EXACT REG REG rmorconst rmorconst
|
|
|
|
gen xor %1,%3
|
|
|
|
xor %2,%4 yields %2 %1
|
|
|
|
with rmorconst rmorconst REG REG
|
|
|
|
gen xor %3,%1
|
|
|
|
xor %4,%2 yields %4 %3
|
|
|
|
|
|
|
|
pat xor defined($1)
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON,$1}
|
|
|
|
joehoe {label, ".xor"}
|
|
|
|
|
|
|
|
pat xor !defined($1)
|
|
|
|
with CXREG
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label, ".xor"}
|
|
|
|
|
|
|
|
pat com $1==2
|
|
|
|
with REG
|
|
|
|
gen not %1 yields %1
|
|
|
|
|
|
|
|
pat com $1==4
|
|
|
|
with REG REG
|
|
|
|
gen not %2
|
|
|
|
not %1 yields %2 %1
|
|
|
|
|
|
|
|
pat com defined($1)
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON,$1}
|
|
|
|
joehoe {label, ".com"}
|
|
|
|
|
|
|
|
pat com !defined($1)
|
|
|
|
with CXREG
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label, ".com"}
|
|
|
|
|
|
|
|
pat loc rol $1==1 && $2==2
|
|
|
|
with REG
|
|
|
|
gen rol %1,{ANYCON,1} yields %1
|
|
|
|
|
|
|
|
pat rol $1==2
|
|
|
|
with SHIFT_CREG REG
|
|
|
|
gen rol %2,cl yields %2
|
|
|
|
|
|
|
|
pat rol $1==4
|
|
|
|
with CXREG REG REG
|
|
|
|
gen jcxz {label, 1f}
|
|
|
|
2: sal %2,{ANYCON,1}
|
|
|
|
rcl %3,{ANYCON,1}
|
|
|
|
adc %2,{ANYCON,0}
|
|
|
|
loop {label, 2b}
|
|
|
|
1:
|
|
|
|
|
|
|
|
pat loc ror $1==1 && $2==2
|
|
|
|
with REG
|
|
|
|
gen ror %1,{ANYCON,1} yields %1
|
|
|
|
|
|
|
|
pat ror $1==2
|
|
|
|
with SHIFT_CREG REG
|
|
|
|
gen ror %2,cl yields %2
|
|
|
|
|
|
|
|
pat ror $1==4
|
|
|
|
with CXREG REG REG
|
|
|
|
gen jcxz {label, 1f}
|
|
|
|
neg cx
|
|
|
|
add cx,{ANYCON,32}
|
|
|
|
2: sal %2,{ANYCON,1}
|
|
|
|
rcl %3,{ANYCON,1}
|
|
|
|
adc %2,{ANYCON,0}
|
|
|
|
loop {label, 2b}
|
|
|
|
1:
|
|
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
* Group 10 : Set Instructions *
|
|
|
|
*******************************************************************/
|
|
|
|
|
|
|
|
pat inn $1==2
|
|
|
|
with SHIFT_CREG REG
|
|
|
|
gen shr %2,cl
|
|
|
|
and %2,{ANYCON, 1} yields %2
|
|
|
|
with SHIFT_CREG ACC
|
|
|
|
gen shr %2,cl
|
|
|
|
and %2,{ANYCON, 1} yields %2
|
|
|
|
|
|
|
|
pat loc inn $1==1 && $2==2
|
|
|
|
with REG
|
|
|
|
gen shr %1,{ANYCON, 1}
|
|
|
|
and %1,{ANYCON, 1} yields %1
|
|
|
|
with ACC
|
|
|
|
gen shr %1,{ANYCON, 1}
|
|
|
|
and %1,{ANYCON, 1} yields %1
|
|
|
|
|
|
|
|
pat loc inn $1==0 && $2==2
|
|
|
|
with REG
|
|
|
|
gen and %1,{ANYCON, 1} yields %1
|
|
|
|
with ACC
|
|
|
|
gen and %1,{ANYCON, 1} yields %1
|
|
|
|
|
|
|
|
pat inn defined($1)
|
|
|
|
with ACC
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON, $1}
|
|
|
|
joehoe {label,".inn"} yields ax
|
|
|
|
|
|
|
|
pat inn !defined($1)
|
|
|
|
with CXREG ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".inn"} yields ax
|
|
|
|
|
|
|
|
pat loc inn zeq $2==2
|
|
|
|
with rm STACK
|
|
|
|
gen check %1,{ANYCON,1<<$1}
|
|
|
|
je {label,$3}
|
|
|
|
|
|
|
|
pat loc inn zne $2==2
|
|
|
|
with rm STACK
|
|
|
|
gen check %1,{ANYCON,1<<$1}
|
|
|
|
jne {label,$3}
|
|
|
|
|
|
|
|
pat set $1==2
|
|
|
|
with SHIFT_CREG
|
|
|
|
uses REG={ANYCON, 1}
|
|
|
|
gen shl %a,cl yields %a
|
|
|
|
|
|
|
|
pat set defined($1)
|
|
|
|
with ACC
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON, $1}
|
|
|
|
joehoe {label,".set"}
|
|
|
|
|
|
|
|
pat set !defined($1)
|
|
|
|
with CXREG ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".set"}
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
* Group 11 : Array Instructions *
|
|
|
|
********************************************************************/
|
|
|
|
|
|
|
|
pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)==0
|
|
|
|
leaving ads 2
|
|
|
|
|
|
|
|
pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)!=0
|
1988-07-15 13:00:43 +00:00
|
|
|
leaving adp 0-rom($1,1) ads 2
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)==0
|
1988-07-15 13:00:43 +00:00
|
|
|
with ADDREG
|
1988-03-30 13:06:41 +00:00
|
|
|
gen sal %1,{ANYCON,1} yields %1 leaving ads 2
|
|
|
|
|
|
|
|
pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)!=0
|
1988-07-15 13:00:43 +00:00
|
|
|
with ADDREG
|
|
|
|
gen sal %1,{ANYCON,1} yields %1 leaving adp 0-2*rom($1,1) ads 2
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)==0
|
1988-07-15 13:00:43 +00:00
|
|
|
with ADDREG
|
1988-03-30 13:06:41 +00:00
|
|
|
gen sal %1,{ANYCON,1}
|
|
|
|
sal %1,{ANYCON,1} yields %1 leaving ads 2
|
|
|
|
|
|
|
|
pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)!=0
|
1988-07-15 13:00:43 +00:00
|
|
|
with ADDREG
|
1988-03-30 13:06:41 +00:00
|
|
|
gen sal %1,{ANYCON,1}
|
1988-07-15 13:00:43 +00:00
|
|
|
sal %1,{ANYCON,1} yields %1 leaving adp 0-4*rom($1,1) ads 2
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat lae aar $2==2 && rom($1,1)==0
|
|
|
|
with ACC
|
|
|
|
uses DXREG,REG={ANYCON,rom($1,3)}
|
|
|
|
gen mul %b yields %1 leaving ads 2
|
|
|
|
|
|
|
|
pat lae aar $2==2 && defined(rom($1,1))
|
|
|
|
with ACC
|
|
|
|
uses DXREG,REG={ANYCON,rom($1,3)}
|
|
|
|
gen mul %b yields %1
|
1988-07-15 13:00:43 +00:00
|
|
|
leaving adp 0-rom($1,1)*rom($1,3) ads 2
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat loc sli ads $1==1 && $2==2 && $3==2
|
1988-07-15 13:00:43 +00:00
|
|
|
with ADDREG
|
1988-03-30 13:06:41 +00:00
|
|
|
gen sal %1,{ANYCON,1} yields %1 leaving ads 2
|
|
|
|
|
|
|
|
pat loc sli ads $1==2 && $2==2 && $3==2
|
1988-07-15 13:00:43 +00:00
|
|
|
with ADDREG
|
1988-03-30 13:06:41 +00:00
|
|
|
gen sal %1,{ANYCON,1}
|
|
|
|
sal %1,{ANYCON,1} yields %1 leaving ads 2
|
|
|
|
|
|
|
|
pat loc sli ads $2==2 && $3==2
|
1988-07-15 13:00:43 +00:00
|
|
|
with ADDREG
|
1988-03-30 13:06:41 +00:00
|
|
|
uses CXREG={ANYCON,$1}
|
1988-03-31 17:58:56 +00:00
|
|
|
gen sal %1,cl yields %1 leaving ads 2
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat aar $1==2
|
1988-03-31 17:58:56 +00:00
|
|
|
with AREG ACC
|
1988-03-30 13:06:41 +00:00
|
|
|
uses DXREG
|
|
|
|
gen sub %2,{ind_reg2,%1}
|
1988-03-31 17:58:56 +00:00
|
|
|
mul {ind_regoff2,%1,4} yields %2 leaving ads 2
|
|
|
|
with reg_off ACC
|
1988-03-30 13:06:41 +00:00
|
|
|
uses DXREG
|
1988-03-31 17:58:56 +00:00
|
|
|
gen sub %2,{ind_regoff2, %1.reg, %1.off}
|
|
|
|
mul {ind_regoff2, %1.reg, 4+%1.off}
|
|
|
|
yields %2 leaving ads 2
|
|
|
|
with bpreg_off ACC
|
1988-03-30 13:06:41 +00:00
|
|
|
uses DXREG
|
1988-03-31 17:58:56 +00:00
|
|
|
gen sub %2,{ind_bpregoff2, %1.reg, %1.ind}
|
|
|
|
mul {ind_bpregoff2, %1.reg, 4+%1.ind}
|
|
|
|
yields %2 leaving ads 2
|
|
|
|
with ADDR_LOCAL ACC
|
1988-03-30 13:06:41 +00:00
|
|
|
uses DXREG
|
1988-03-31 17:58:56 +00:00
|
|
|
gen sub %2,{LOCAL,%1.ind,2}
|
|
|
|
mul {LOCAL, 4+%1.ind,2} yields %2 leaving ads 2
|
|
|
|
with ADDR_EXTERN ACC
|
1988-03-30 13:06:41 +00:00
|
|
|
uses DXREG
|
|
|
|
gen sub %2,{EXTERN2,%1.off}
|
1988-03-31 17:58:56 +00:00
|
|
|
mul {EXTERN2,4+%1.off} yields %2 leaving ads 2
|
1988-03-30 13:06:41 +00:00
|
|
|
|
1988-07-15 13:00:43 +00:00
|
|
|
pat lae lar defined(rom($1,3)) leaving lae $1 aar $2 loi rom($1,3)
|
1988-03-30 13:06:41 +00:00
|
|
|
|
1988-07-15 13:00:43 +00:00
|
|
|
pat lae sar defined(rom($1,3)) leaving lae $1 aar $2 sti rom($1,3)
|
1988-03-30 13:06:41 +00:00
|
|
|
|
|
|
|
pat aar !defined($1)
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".iaar"} yields bx
|
|
|
|
|
|
|
|
pat sar $1==2
|
|
|
|
with BXREG ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".sar2"}
|
|
|
|
|
|
|
|
pat sar !defined($1)
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".isar"}
|
|
|
|
|
|
|
|
pat lar $1==2
|
|
|
|
with BXREG ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".lar2"}
|
|
|
|
|
|
|
|
pat lar !defined($1)
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".ilar"}
|
|
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
* Group 12 : Compare Instructions *
|
|
|
|
*******************************************************************/
|
|
|
|
|
|
|
|
pat cmi $1==2
|
|
|
|
with EXACT register rmorconst
|
|
|
|
uses REG={ANYCON,0}
|
|
|
|
gen cmp %1,%2
|
|
|
|
je {label,2f}
|
|
|
|
jl {label,1f}
|
|
|
|
inc %a
|
|
|
|
jmp {label,2f}
|
|
|
|
1:
|
|
|
|
dec %a
|
|
|
|
2: yields %a
|
|
|
|
with rmorconst register
|
|
|
|
uses REG={ANYCON,0}
|
1988-07-19 16:49:49 +00:00
|
|
|
gen cmp %2,%1
|
1988-03-30 13:06:41 +00:00
|
|
|
je {label,2f}
|
1988-07-19 16:49:49 +00:00
|
|
|
jg {label,1f}
|
1988-03-30 13:06:41 +00:00
|
|
|
inc %a
|
|
|
|
jmp {label,2f}
|
|
|
|
1:
|
|
|
|
dec %a
|
|
|
|
2: yields %a
|
|
|
|
|
|
|
|
pat cmi $1==4
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".cmi4"} yields ax
|
|
|
|
|
|
|
|
pat cmu $1==2 leaving cmp
|
|
|
|
|
|
|
|
pat cmu $1==4
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".cmu4"} yields ax
|
|
|
|
|
|
|
|
pat cms $1==2
|
|
|
|
with EXACT REG rmorconst
|
|
|
|
gen sub %1,%2 yields %1
|
|
|
|
with rmorconst REG
|
|
|
|
gen sub %2,%1 yields %2
|
|
|
|
|
|
|
|
pat cms $1==4
|
|
|
|
with rmorconst rmorconst REG REG
|
|
|
|
gen sub %3,%1
|
|
|
|
sbb %4,%2
|
|
|
|
or %4,%3 yields %4
|
|
|
|
with EXACT REG REG rmorconst rmorconst
|
|
|
|
gen sub %1,%3
|
|
|
|
sbb %2,%4
|
|
|
|
or %2,%1 yields %2
|
|
|
|
|
|
|
|
pat cms defined($1)
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON,$1}
|
|
|
|
joehoe {label,".cms"} yields cx
|
|
|
|
|
|
|
|
pat cms !defined($1)
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".cms"} yields cx
|
|
|
|
pat cmf $1==4
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".cmf4"} leaving asp 8 lfr 2
|
|
|
|
|
|
|
|
pat cmf $1==8
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,".cmf8"} leaving asp 16 lfr 2
|
|
|
|
|
|
|
|
pat cmp
|
|
|
|
with EXACT register rmorconst
|
|
|
|
uses REG = {ANYCON,0}
|
|
|
|
gen cmp %1,%2
|
|
|
|
je {label,2f}
|
|
|
|
jb {label,1f}
|
|
|
|
inc %a
|
|
|
|
jmp {label,2f}
|
|
|
|
1: dec %a
|
|
|
|
2: yields %a
|
|
|
|
with rmorconst register
|
|
|
|
uses REG = {ANYCON,0}
|
1988-07-19 16:49:49 +00:00
|
|
|
gen cmp %2,%1
|
1988-03-30 13:06:41 +00:00
|
|
|
je {label,2f}
|
1988-07-19 16:49:49 +00:00
|
|
|
ja {label,1f}
|
1988-03-30 13:06:41 +00:00
|
|
|
inc %a
|
|
|
|
jmp {label,2f}
|
|
|
|
1: dec %a
|
|
|
|
2: yields %a
|
|
|
|
|
|
|
|
proc txx
|
|
|
|
with rm
|
|
|
|
uses REG = {ANYCON,0}
|
|
|
|
gen test %1
|
|
|
|
jxx* {label,1f}
|
|
|
|
inc %a
|
|
|
|
1: yields %a
|
|
|
|
|
|
|
|
pat tlt call txx("jge")
|
|
|
|
pat tle call txx("jg")
|
|
|
|
pat teq call txx("jne")
|
|
|
|
pat tne call txx("je")
|
|
|
|
pat tge call txx("jl")
|
|
|
|
pat tgt call txx("jle")
|
|
|
|
|
|
|
|
proc txxior
|
|
|
|
with rm REG
|
|
|
|
gen test %1
|
|
|
|
jxx* {label,1f}
|
|
|
|
or %2,{ANYCON,1}
|
|
|
|
1: yields %2
|
|
|
|
|
|
|
|
pat tlt ior $2==2 call txxior("jge")
|
|
|
|
pat tle ior $2==2 call txxior("jg")
|
|
|
|
pat teq ior $2==2 call txxior("jne")
|
|
|
|
pat tne ior $2==2 call txxior("je")
|
|
|
|
pat tge ior $2==2 call txxior("jl")
|
|
|
|
pat tgt ior $2==2 call txxior("jle")
|
|
|
|
|
|
|
|
proc cmixxior
|
|
|
|
with regorconst rm REG
|
|
|
|
gen cmp %2,%1
|
|
|
|
jxx* {label,1f}
|
|
|
|
or %3,{ANYCON,1}
|
|
|
|
1: yields %3
|
|
|
|
|
|
|
|
pat cmi tlt ior $1==2 && $3==2 call cmixxior("jge")
|
|
|
|
pat cmi tle ior $1==2 && $3==2 call cmixxior("jg")
|
|
|
|
pat cmi teq ior $1==2 && $3==2 call cmixxior("jne")
|
|
|
|
pat cmi tne ior $1==2 && $3==2 call cmixxior("je")
|
|
|
|
pat cmi tge ior $1==2 && $3==2 call cmixxior("jl")
|
|
|
|
pat cmi tgt ior $1==2 && $3==2 call cmixxior("jle")
|
|
|
|
|
|
|
|
proc cmxtxx
|
|
|
|
with regorconst rm
|
|
|
|
uses REG = {ANYCON,0}
|
|
|
|
gen cmp %2,%1
|
|
|
|
jxx[1] {label,1f}
|
|
|
|
inc %a
|
|
|
|
1: yields %a
|
|
|
|
with EXACT rm regorconst
|
|
|
|
uses REG = {ANYCON,0}
|
|
|
|
gen cmp %1,%2
|
|
|
|
jxx[2] {label,1f}
|
|
|
|
inc %a
|
|
|
|
1: yields %a
|
|
|
|
|
|
|
|
pat cmi tlt $1==2 call cmxtxx("jge","jle")
|
|
|
|
pat cmi tle $1==2 call cmxtxx("jg","jl")
|
|
|
|
pat cmi teq $1==2 call cmxtxx("jne","jne")
|
|
|
|
pat cmi tne $1==2 call cmxtxx("je","je")
|
|
|
|
pat cmi tge $1==2 call cmxtxx("jl","jg")
|
|
|
|
pat cmi tgt $1==2 call cmxtxx("jle","jge")
|
|
|
|
pat cmp tlt call cmxtxx("jae","jbe")
|
|
|
|
pat cmp tle call cmxtxx("ja","jb")
|
|
|
|
pat cmp teq call cmxtxx("jne","jne")
|
|
|
|
pat cmp tne call cmxtxx("je","je")
|
|
|
|
pat cmp tge call cmxtxx("jb","ja")
|
|
|
|
pat cmp tgt call cmxtxx("jbe","jae")
|
|
|
|
pat cms teq $1==2 call cmxtxx("jne","jne")
|
|
|
|
pat cms tne $1==2 call cmxtxx("je","je")
|
|
|
|
|
|
|
|
proc cmxzxx example cmp zlt
|
|
|
|
with regorconst rm STACK
|
|
|
|
gen cmp %2,%1
|
|
|
|
jxx[1] {label,$2}
|
|
|
|
with EXACT rm regorconst
|
|
|
|
kills ALL
|
|
|
|
gen cmp %1,%2
|
|
|
|
jxx[2] {label,$2}
|
|
|
|
|
|
|
|
pat cmp zlt call cmxzxx("jb","ja")
|
|
|
|
pat cmp zle call cmxzxx("jbe","jae")
|
|
|
|
pat cmp zeq call cmxzxx("je","je")
|
|
|
|
pat cmp zne call cmxzxx("jne","jne")
|
|
|
|
pat cmp zge call cmxzxx("jae","jbe")
|
|
|
|
pat cmp zgt call cmxzxx("ja","jb")
|
|
|
|
pat cms zeq $1==2 call cmxzxx("je","je")
|
|
|
|
pat cms zne $1==2 call cmxzxx("jne","jne")
|
|
|
|
|
|
|
|
pat ldc cmi zlt highw($1)==0 && loww($1)==0 && $2==4
|
|
|
|
with rmorconst rmorconst yields %2 leaving zlt $3
|
|
|
|
|
|
|
|
pat ldc cmi zge highw($1)==0 && loww($1)==0 && $2==4
|
|
|
|
with rmorconst rmorconst yields %2 leaving zge $3
|
|
|
|
|
|
|
|
pat ldc cms zeq $2==4 && loww($1)==0 && highw($1)==0
|
|
|
|
with rmorconst REG STACK
|
|
|
|
gen or %2,%1
|
|
|
|
je {label,$3}
|
|
|
|
with REG rmorconst STACK
|
|
|
|
gen or %1,%2
|
|
|
|
je {label,$3}
|
|
|
|
|
|
|
|
pat ldc cms zne $2==4 && loww($1)==0 && highw($1)==0
|
|
|
|
with rmorconst REG STACK
|
|
|
|
gen or %2,%1
|
|
|
|
jne {label,$3}
|
|
|
|
with REG rmorconst STACK
|
|
|
|
gen or %1,%2
|
|
|
|
jne {label,$3}
|
|
|
|
|
|
|
|
pat ldc cms zeq $2==4
|
|
|
|
with rm rm STACK
|
|
|
|
gen cmp %1, {ANYCON, loww($1)}
|
|
|
|
jne {label,1f}
|
|
|
|
cmp %2, {ANYCON, highw($1)}
|
|
|
|
je {label,$3}
|
|
|
|
1:
|
|
|
|
|
|
|
|
pat ldc cms zne $2==4
|
|
|
|
with rm rm STACK
|
|
|
|
gen cmp %1, {ANYCON, loww($1)}
|
|
|
|
jne {label,$3}
|
|
|
|
cmp %2, {ANYCON, highw($1)}
|
|
|
|
jne {label,$3}
|
|
|
|
|
1988-07-15 13:00:43 +00:00
|
|
|
pat cms zne $1==4
|
1988-03-30 13:06:41 +00:00
|
|
|
with regorconst regorconst rm rm STACK
|
|
|
|
gen cmp %3,%1
|
|
|
|
jne {label,$2}
|
|
|
|
cmp %4,%2
|
|
|
|
jne {label,$2}
|
|
|
|
with EXACT rm rm regorconst regorconst
|
|
|
|
kills ALL
|
|
|
|
gen cmp %1,%3
|
|
|
|
jne {label,$2}
|
|
|
|
cmp %2,%4
|
|
|
|
jne {label,$2}
|
|
|
|
|
1988-07-15 13:00:43 +00:00
|
|
|
pat cms zeq $1==4
|
1988-03-30 13:06:41 +00:00
|
|
|
with regorconst regorconst rm rm STACK
|
|
|
|
gen cmp %3,%1
|
|
|
|
jne {label, 1f}
|
|
|
|
cmp %4,%2
|
|
|
|
je {label,$2}
|
|
|
|
1:
|
|
|
|
with EXACT rm rm regorconst regorconst
|
|
|
|
kills ALL
|
|
|
|
gen cmp %1,%3
|
|
|
|
jne {label,1f}
|
|
|
|
cmp %2,%4
|
|
|
|
je {label,$2}
|
|
|
|
1:
|
|
|
|
|
|
|
|
proc andzxx example and zeq
|
|
|
|
with regorconst rm STACK
|
|
|
|
gen check %2,%1
|
|
|
|
jxx* {label,$2}
|
|
|
|
with exact rm regorconst
|
|
|
|
kills ALL
|
|
|
|
gen check %1,%2
|
|
|
|
jxx* {label,$2}
|
|
|
|
|
|
|
|
pat and zeq $1==2 call andzxx("je")
|
|
|
|
pat and zne $1==2 call andzxx("jne")
|
|
|
|
|
|
|
|
proc locandzxx example loc and zeq
|
1988-07-26 13:00:30 +00:00
|
|
|
with exact rm12
|
1988-03-30 13:06:41 +00:00
|
|
|
kills ALL
|
|
|
|
gen testb %1,{ANYCON,$1}
|
|
|
|
jxx* {label,$3}
|
|
|
|
with GENREG STACK
|
|
|
|
gen testb %1.1,{ANYCON,$1}
|
|
|
|
jxx* {label,$3}
|
|
|
|
with exact IREG
|
|
|
|
kills ALL
|
1988-07-26 13:00:30 +00:00
|
|
|
gen check %1,{ANYCON,$1}
|
1988-03-30 13:06:41 +00:00
|
|
|
jxx* {label,$3}
|
|
|
|
|
|
|
|
pat loc and zeq $1<256 && $1>=0 && $2==2 call locandzxx("je")
|
|
|
|
pat loc and zne $1<256 && $1>=0 && $2==2 call locandzxx("jne")
|
|
|
|
|
|
|
|
proc locbxx example loc beq
|
|
|
|
with exact rm1
|
|
|
|
kills ALL
|
|
|
|
gen cmpb %1,{ANYCON,$1}
|
|
|
|
jxx* {label,$2}
|
|
|
|
with rm STACK
|
|
|
|
gen cmp %1,{ANYCON,$1}
|
|
|
|
jxx* {label,$2}
|
|
|
|
|
|
|
|
pat loc beq $1<256 && $1>=0 call locbxx("je")
|
|
|
|
pat loc bne $1<256 && $1>=0 call locbxx("jne")
|
|
|
|
|
|
|
|
proc loccmuzxx example loc cmu zeq
|
|
|
|
with exact rm1
|
|
|
|
kills ALL
|
|
|
|
gen cmpb %1,{ANYCON,$1}
|
|
|
|
jxx* {label,$3}
|
|
|
|
with rm STACK
|
|
|
|
gen cmp %1,{ANYCON,$1}
|
|
|
|
jxx* {label,$3}
|
|
|
|
|
|
|
|
pat loc cmu zeq $1<256 && $1>=0 && $2==2 call loccmuzxx("je")
|
|
|
|
pat loc cmu zne $1<256 && $1>=0 && $2==2 call loccmuzxx("jne")
|
|
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
* Group 13 : Branch Instructions *
|
|
|
|
*******************************************************************/
|
|
|
|
|
|
|
|
pat bra
|
|
|
|
with STACK
|
|
|
|
gen jmp {label,$1}
|
|
|
|
|
|
|
|
proc bxx example blt
|
|
|
|
with regorconst rm STACK
|
|
|
|
kills ALL
|
|
|
|
gen cmp %2,%1
|
|
|
|
jxx[1] {label,$1}
|
|
|
|
with EXACT rm regorconst
|
|
|
|
kills ALL
|
|
|
|
gen cmp %1,%2
|
|
|
|
jxx[2] {label,$1}
|
|
|
|
|
|
|
|
pat blt call bxx("jl","jg")
|
|
|
|
pat ble call bxx("jle","jge")
|
|
|
|
pat beq call bxx("je","je")
|
|
|
|
pat bne call bxx("jne","jne")
|
|
|
|
pat bge call bxx("jge","jle")
|
|
|
|
pat bgt call bxx("jg","jl")
|
|
|
|
|
|
|
|
proc zxx example zlt
|
|
|
|
with rm STACK
|
|
|
|
gen test %1
|
|
|
|
jxx* {label,$1}
|
|
|
|
|
|
|
|
pat zlt call zxx("jl")
|
|
|
|
pat zle call zxx("jle")
|
|
|
|
pat zge call zxx("jge")
|
|
|
|
pat zgt call zxx("jg")
|
|
|
|
|
|
|
|
pat zne
|
|
|
|
with rm+rm1 STACK
|
|
|
|
gen test %1
|
|
|
|
jne {label,$1}
|
|
|
|
|
|
|
|
pat zeq
|
|
|
|
with rm+rm1 STACK
|
|
|
|
gen test %1
|
|
|
|
je {label,$1}
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************
|
|
|
|
* Group 14 : Procedure-call Instructions *
|
|
|
|
*******************************************************************/
|
|
|
|
|
|
|
|
pat cal
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label,$1}
|
|
|
|
|
|
|
|
pat cai
|
|
|
|
with rm
|
|
|
|
kills ALL
|
|
|
|
gen joehoe %1
|
|
|
|
|
|
|
|
pat lfr $1==2 yields ax
|
|
|
|
|
|
|
|
pat lfr $1==4 yields dx ax
|
|
|
|
|
|
|
|
pat lfr $1==6
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label, ".lfr6"}
|
|
|
|
|
|
|
|
pat lfr $1==8
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label, ".lfr8"}
|
|
|
|
|
|
|
|
pat ret $1==0
|
|
|
|
kills ALL
|
|
|
|
gen
|
|
|
|
#ifdef REGVARS
|
|
|
|
return
|
|
|
|
#else
|
|
|
|
mov sp,bp
|
|
|
|
pop bp
|
|
|
|
ret.
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat ret $1==2
|
|
|
|
with ACC
|
|
|
|
kills ALL
|
|
|
|
gen
|
|
|
|
#ifdef REGVARS
|
|
|
|
return
|
|
|
|
#else
|
|
|
|
mov sp,bp
|
|
|
|
pop bp
|
|
|
|
ret.
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat ret $1==4
|
|
|
|
with ACC DXREG
|
|
|
|
kills ALL
|
|
|
|
gen
|
|
|
|
#ifdef REGVARS
|
|
|
|
return
|
|
|
|
#else
|
|
|
|
mov sp,bp
|
|
|
|
pop bp
|
|
|
|
ret.
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat ret $1==6
|
|
|
|
with STACK
|
|
|
|
gen joehoe {label, ".ret6"}
|
|
|
|
#ifdef REGVARS
|
|
|
|
return
|
|
|
|
#else
|
|
|
|
mov sp,bp
|
|
|
|
pop bp
|
|
|
|
ret.
|
|
|
|
#endif
|
|
|
|
|
|
|
|
pat ret $1==8
|
|
|
|
with STACK
|
|
|
|
gen joehoe {label, ".ret8"}
|
|
|
|
#ifdef REGVARS
|
|
|
|
return
|
|
|
|
#else
|
|
|
|
mov sp,bp
|
|
|
|
pop bp
|
|
|
|
ret.
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/********************************************************************
|
|
|
|
* Group 15 : Miscellaneous Instructions *
|
|
|
|
********************************************************************/
|
|
|
|
|
|
|
|
pat asp $1==2
|
|
|
|
with exact a_word
|
|
|
|
with STACK
|
|
|
|
uses BXREG /* GENREG may contain lfr area */
|
|
|
|
gen pop %a
|
|
|
|
|
|
|
|
pat asp $1==4
|
|
|
|
with exact a_word a_word
|
|
|
|
with STACK
|
|
|
|
uses BXREG /* GENREG may contain lfr area */
|
|
|
|
gen pop %a
|
|
|
|
pop %a
|
|
|
|
|
|
|
|
pat asp $1==0-2
|
|
|
|
with STACK yields bp
|
|
|
|
|
|
|
|
pat asp
|
|
|
|
with STACK
|
|
|
|
gen add sp,{ANYCON,$1}
|
|
|
|
|
|
|
|
pat ass $1==2
|
|
|
|
with rmorconst STACK
|
|
|
|
gen add sp,%1
|
|
|
|
|
|
|
|
pat ass !defined($1)
|
|
|
|
with rm rmorconst STACK
|
|
|
|
gen cmp %1,{ANYCON,2}
|
|
|
|
jne {label, ".unknown"}
|
|
|
|
add sp,%2
|
|
|
|
|
|
|
|
pat blm $1==0 leaving asp 4
|
|
|
|
|
|
|
|
pat blm $1>0
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON,$1/2}
|
|
|
|
joehoe {label, ".blm"}
|
|
|
|
|
|
|
|
pat bls $1==2
|
|
|
|
with CXREG
|
|
|
|
kills ALL
|
|
|
|
gen sar cx,{ANYCON,1}
|
|
|
|
joehoe {label, ".blm"}
|
|
|
|
|
|
|
|
pat bls !defined($1)
|
|
|
|
with rm-CXREG CXREG
|
|
|
|
kills ALL
|
|
|
|
gen cmp %1,{ANYCON,2}
|
|
|
|
jne {label, ".unknown"}
|
|
|
|
sar cx,{ANYCON,1}
|
|
|
|
joehoe {label, ".blm"}
|
|
|
|
|
|
|
|
pat csa $1==2
|
|
|
|
with BXREG ACC
|
|
|
|
kills ALL
|
|
|
|
gen jmp {label, ".csa2"}
|
|
|
|
|
|
|
|
pat csa !defined($1)
|
|
|
|
with rm-BXREG-ACC ACC
|
|
|
|
kills ALL
|
|
|
|
gen cmp %1,{ANYCON,2}
|
|
|
|
jne {label, ".unknown"}
|
|
|
|
jmp {label, ".csa2"}
|
|
|
|
|
|
|
|
pat csb $1==2
|
|
|
|
with BXREG ACC
|
|
|
|
kills ALL
|
|
|
|
gen jmp {label, ".csb2"}
|
|
|
|
|
|
|
|
pat csb !defined($1)
|
|
|
|
with rm-BXREG-ACC BXREG ACC
|
|
|
|
gen cmp %1,{ANYCON,2}
|
|
|
|
jne {label, ".unknown"}
|
|
|
|
jmp {label, ".csb2"}
|
|
|
|
|
|
|
|
pat dup $1==2
|
|
|
|
with regorconst yields %1 %1
|
|
|
|
with ACC1 yields %1 %1
|
|
|
|
|
|
|
|
pat dup $1==4
|
|
|
|
with regorconst regorconst yields %2 %1 %2 %1
|
|
|
|
|
|
|
|
pat dup
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON,$1}
|
|
|
|
joehoe {label, ".dup"}
|
|
|
|
|
|
|
|
pat dus $1==2
|
|
|
|
with CXREG
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label, ".dup"}
|
|
|
|
|
|
|
|
pat dus !defined($1)
|
|
|
|
with rm-CXREG CXREG
|
|
|
|
kills ALL
|
|
|
|
gen cmp %1,{ANYCON,2}
|
|
|
|
jne {label, ".unknown"}
|
|
|
|
joehoe {label, ".dup"}
|
|
|
|
|
|
|
|
pat exg $1==2
|
|
|
|
with a_word a_word yields %1 %2
|
|
|
|
|
|
|
|
pat exg $1==4
|
|
|
|
with a_word a_word a_word a_word yields %2 %1 %4 %3
|
|
|
|
|
|
|
|
pat exg defined($1)
|
|
|
|
kills ALL
|
|
|
|
gen mov cx,{ANYCON,$1}
|
|
|
|
joehoe {label, ".exg"}
|
|
|
|
|
|
|
|
pat exg
|
|
|
|
with CXREG
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label, ".exg"}
|
|
|
|
|
|
|
|
pat gto
|
|
|
|
kills ALL
|
|
|
|
gen mov bx,{ADDR_EXTERN,$1}
|
|
|
|
jmp {label, ".gto"}
|
|
|
|
|
|
|
|
pat fil
|
|
|
|
gen mov {EXTERN2,"hol0+4"},{ADDR_EXTERN,$1}
|
|
|
|
|
|
|
|
pat lim
|
|
|
|
uses REG
|
|
|
|
gen mov %a,{EXTERN2,".ignmask"} yields %a
|
|
|
|
|
|
|
|
pat lin
|
|
|
|
gen mov {EXTERN2,"hol0"},{ANYCON,$1}
|
|
|
|
|
|
|
|
pat lni
|
|
|
|
gen inc {EXTERN2,"hol0"}
|
|
|
|
|
|
|
|
pat lor $1==0 yields bp
|
|
|
|
|
|
|
|
pat lor $1==1
|
|
|
|
with STACK
|
|
|
|
uses REG
|
|
|
|
gen mov %a,sp yields %a
|
|
|
|
|
|
|
|
pat lor $1==2
|
|
|
|
uses REG
|
|
|
|
gen mov %a,{EXTERN2,".reghp"} yields %a
|
|
|
|
|
|
|
|
pat mon
|
|
|
|
with ACC
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label, ".mon"}
|
|
|
|
|
|
|
|
pat nop
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label, ".nop"}
|
|
|
|
|
|
|
|
pat rck $1==2
|
|
|
|
with BXREG ACC
|
1988-07-15 13:00:43 +00:00
|
|
|
kills ALL
|
1988-03-30 13:06:41 +00:00
|
|
|
gen joehoe {label, ".rck"} yields ax
|
|
|
|
|
|
|
|
pat rck !defined($1)
|
|
|
|
with rm-BXREG-ACC BXREG ACC
|
1988-07-15 13:00:43 +00:00
|
|
|
kills ALL
|
1988-03-30 13:06:41 +00:00
|
|
|
gen cmp %1,{ANYCON,2}
|
|
|
|
jne {label, ".unknown"}
|
|
|
|
joehoe {label, ".rck"} yields ax
|
|
|
|
|
|
|
|
pat rtt leaving ret 0
|
|
|
|
|
|
|
|
pat sig
|
|
|
|
with REG
|
|
|
|
gen xchg {EXTERN2,".trppc"},%1 yields %1
|
|
|
|
|
|
|
|
pat sim
|
|
|
|
with regorconst
|
|
|
|
gen mov {EXTERN2,".ignmask"},%1
|
|
|
|
|
|
|
|
pat str $1==0
|
|
|
|
with rmorconst
|
|
|
|
gen mov bp,%1
|
|
|
|
|
|
|
|
pat str $1==1
|
|
|
|
with rmorconst STACK
|
|
|
|
gen mov sp,%1
|
|
|
|
|
|
|
|
pat str $1==2
|
|
|
|
kills ALL
|
|
|
|
gen joehoe {label, ".strhp"}
|
|
|
|
|
|
|
|
pat trp
|
|
|
|
with ACC
|
|
|
|
kills ALL
|
1988-07-13 14:21:13 +00:00
|
|
|
gen joehoe {label, ".Xtrp"}
|