4b5a7fee14
backend into shape. It now generates binaries --- no idea whether they work or not.
2251 lines
48 KiB
Plaintext
2251 lines
48 KiB
Plaintext
rscid = "$Header$"
|
|
|
|
#define UNTESTED
|
|
|
|
EM_WSIZE=2
|
|
EM_PSIZE=2
|
|
EM_BSIZE=4
|
|
|
|
SL=4
|
|
|
|
FORMAT = "%d"
|
|
TIMEFACTOR = 1/300
|
|
|
|
illins = "Illegal"
|
|
|
|
PROPERTIES
|
|
|
|
GENREG /* All PDP registers */
|
|
REG /* Normal registers (allocatable) */
|
|
ODDREG /* All odd registers (allocatable) */
|
|
REGPAIR(4) /* Register pairs for division */
|
|
FLTREG(4) /* Floating point registers, single precision */
|
|
DBLREG(8) /* Same, double precision */
|
|
GENFREG(4) /* generic floating point */
|
|
GENDREG(8) /* generic floating point */
|
|
FLTREGPAIR(8) /* register pair for modf */
|
|
DBLREGPAIR(16) /* same, double precision */
|
|
LOCALBASE /* Guess what */
|
|
STACKPOINTER
|
|
PROGRAMCOUNTER
|
|
|
|
REGISTERS
|
|
|
|
r0 : GENREG,REG.
|
|
r2 : GENREG,REG regvar.
|
|
r4 : GENREG,REG regvar.
|
|
r1,r3 : GENREG,REG,ODDREG.
|
|
r01("r0")=r0+r1 : REGPAIR.
|
|
fr0("r0"),fr1("r1"),fr2("r2"),fr3("r3") : GENFREG,FLTREG.
|
|
dr0("r0")=fr0,dr1("r1")=fr1,dr2("r2")=fr2,dr3("r3")=fr3 : GENDREG,DBLREG.
|
|
fr01("r0")=fr0+fr1,fr23("r2")=fr2+fr3 : FLTREGPAIR.
|
|
dr01("r0")=dr0+dr1,dr23("r2")=dr2+dr3 : DBLREGPAIR.
|
|
lb("r5") : GENREG,LOCALBASE.
|
|
sp : GENREG,STACKPOINTER.
|
|
pc : GENREG,PROGRAMCOUNTER.
|
|
|
|
TOKENS
|
|
|
|
const2 = { INT num; } 2 "$" num .
|
|
LOCAL = { INT ind; INT size; } 2 ind "(r5)" .
|
|
ILOCAL = { INT ind; } 2 "*" ind "(r5)" .
|
|
DLOCAL = { INT ind; INT size; } 4 ind "(r5)" .
|
|
addr_local = { INT ind; } 2 .
|
|
addr_external = { ADDR off; } 2 "$" off.
|
|
|
|
regdef2 = { GENREG reg; } 2 "*" reg.
|
|
regind2 = { GENREG reg; ADDR off; } 2 off "(" reg ")" .
|
|
reginddef2 = { GENREG reg; ADDR off; } 2 "*" off "(" reg ")" .
|
|
regconst2 = { GENREG reg; ADDR off; } 2 .
|
|
relative2 = { ADDR off; } 2 off .
|
|
reldef2 = { ADDR off; } 2 "*" off.
|
|
regdef1 = { GENREG reg; } 2 "*" reg.
|
|
regind1 = { GENREG reg; ADDR off; } 2 off "(" reg ")" .
|
|
reginddef1 = { GENREG reg; ADDR off; } 2 "*" off "(" reg ")" .
|
|
relative1 = { ADDR off; } 2 off.
|
|
reldef1 = { ADDR off; } 2 "*" off.
|
|
|
|
autodec = { GENREG reg; } 2 "-(" reg ")".
|
|
autoinc = { GENREG reg; } 2 "(" reg ")+".
|
|
|
|
ftoint = { GENFREG reg; } 2 .
|
|
ftolong = { GENFREG reg; } 4 .
|
|
|
|
regind4 = { GENREG reg; ADDR off; } 4 off "(" reg ")".
|
|
reginddef4 = { GENREG reg; ADDR off; } 4 "*" off "(" reg ")".
|
|
relative4 = { ADDR off; } 4 off.
|
|
reldef4 = { ADDR off; } 4 "*" off.
|
|
regdef4 = { GENREG reg; } 4 "*" reg.
|
|
regind8 = { GENREG reg; ADDR off; } 8 off "(" reg ")".
|
|
reginddef8 = { GENREG reg; ADDR off; } 8 "*" off "(" reg ")".
|
|
relative8 = { ADDR off; } 8 off.
|
|
reldef8 = { ADDR off; } 8 "*" off.
|
|
regdef8 = { GENREG reg; } 8 "*" reg.
|
|
|
|
label = { ADDR off; } 2 off.
|
|
|
|
SETS
|
|
|
|
src2 = GENREG + regdef2 + regind2 + reginddef2 + relative2 +
|
|
reldef2 + addr_external + const2 + LOCAL + ILOCAL +
|
|
autodec + autoinc .
|
|
dst2 = src2 - ( const2 + addr_external ) .
|
|
xsrc2 = src2 + ftoint .
|
|
src1 = regdef1 + regind1 + reginddef1 + relative1 + reldef1 .
|
|
dst1 = src1 .
|
|
src1or2 = src1 + src2 .
|
|
src4 = relative4 + regdef4 + DLOCAL + regind4 .
|
|
dst4 = src4 .
|
|
long4 = src4 + REGPAIR .
|
|
longf4 = src4 + reldef4 + reginddef4 + FLTREG .
|
|
f4src = longf4 + autoinc + autodec .
|
|
f4dst = f4src .
|
|
long8 = relative8 + regdef8 + regind8 + DBLREG .
|
|
double8 = long8 + reldef8 + reginddef8 .
|
|
|
|
freg = FLTREG + DBLREG .
|
|
fsrc = FLTREG + double8 + autoinc + autodec .
|
|
fdst = fsrc .
|
|
|
|
indexed2 = regind2 + reginddef2 .
|
|
indexed4 = regind4 .
|
|
indexed8 = regind8 .
|
|
indexed = indexed2 + indexed4 + indexed8 .
|
|
regdeferred = regdef2 + regdef4 + regdef8 .
|
|
indordef = indexed + regdeferred .
|
|
|
|
locals = LOCAL + DLOCAL .
|
|
|
|
variable2 = relative2 + reldef2 .
|
|
variable4 = relative4 .
|
|
variable8 = relative8 .
|
|
variable = variable2 + variable4 + variable8 .
|
|
|
|
regs = REG + REGPAIR + FLTREG + DBLREG .
|
|
noconst2 = src2 - const2 - addr_external .
|
|
allexeptcon = ALL - ( regs + const2 + addr_local + addr_external ) .
|
|
externals = relative1 + relative2 + relative4 + relative8 .
|
|
posextern = variable + regdeferred + indexed + externals .
|
|
diradr2 = regconst2 + addr_external .
|
|
|
|
INSTRUCTIONS
|
|
|
|
/* default cost */
|
|
|
|
cost(2,450)
|
|
|
|
/* Normal instructions */
|
|
|
|
adc dst2:rw:cc .
|
|
add src2:ro,dst2:rw:cc .
|
|
ash src2:ro,REG:rw:cc .
|
|
ashc src2:ro,REGPAIR+ODDREG:rw kills :cc .
|
|
asl dst2:rw:cc .
|
|
asr dst2:rw:cc .
|
|
bxx "syntax error" label . /* generic branch used only as bxx* */
|
|
bcc label .
|
|
bcs label .
|
|
beq label .
|
|
bge label .
|
|
bgt label .
|
|
bhi label .
|
|
bhis "bcc" label .
|
|
bic src2:ro,dst2:rw:cc .
|
|
bis src2:ro,dst2:rw:cc .
|
|
bisb src1or2:ro,REG:rw kills :cc .
|
|
bit src2:ro,src2:ro kills :cc.
|
|
ble label .
|
|
blo "bcs" label .
|
|
blos label .
|
|
blt label .
|
|
bmi label .
|
|
bne label .
|
|
bpl label .
|
|
br label .
|
|
bvc label .
|
|
bvs label .
|
|
clr dst2:wo:cc .
|
|
clrb dst1:wo kills :cc .
|
|
cmp src2:ro,src2:ro kills :cc .
|
|
cmpb src1or2:ro,src1or2:ro kills :cc .
|
|
com dst2:rw:cc .
|
|
dec dst2:rw:cc .
|
|
div src2:ro,REG:rw kills :cc .
|
|
inc dst2:rw:cc .
|
|
jbr label .
|
|
jeq label .
|
|
jne label .
|
|
jxx "syntax error" label .
|
|
jmp dst2+label kills :cc r0 r1 r3.
|
|
jsr GENREG:rw,dst2+label kills :cc r0 r1 r3.
|
|
mov src2:ro,dst2:wo:cc .
|
|
movb src1or2:ro,dst1+REG:wo kills :cc .
|
|
mul src2:ro,ODDREG:rw:cc .
|
|
neg dst2:rw:cc .
|
|
rol dst2:rw:cc .
|
|
ror dst2:rw:cc .
|
|
rts GENREG:rw .
|
|
sbc dst2:rw:cc .
|
|
sob REG:rw,label .
|
|
sub src2:ro,dst2:rw:cc .
|
|
sxt dst2:wo .
|
|
tst src2:ro:cc .
|
|
xor REG:ro,dst2:rw:cc .
|
|
|
|
/* floating point instructions */
|
|
|
|
cfcc .
|
|
setf .
|
|
setd .
|
|
seti .
|
|
setl .
|
|
clrf fdst.
|
|
negf fdst .
|
|
absf fdst .
|
|
tstf fsrc .
|
|
movf fsrc,freg .
|
|
movf freg,fdst .
|
|
movif src2,freg .
|
|
movif src4,freg .
|
|
movfi freg,dst2 .
|
|
movfi freg,dst4 .
|
|
movof f4src,freg .
|
|
movfo freg,f4dst .
|
|
movie src2,freg .
|
|
movei freg,dst2 .
|
|
addf fsrc,freg .
|
|
subf fsrc,freg .
|
|
mulf fsrc,freg .
|
|
divf fsrc,freg .
|
|
cmpf fsrc,freg .
|
|
modf fsrc,FLTREGPAIR+DBLREGPAIR .
|
|
ldfps src2 .
|
|
stfps dst2 .
|
|
stst dst2 .
|
|
|
|
/* weirdo instructions */
|
|
mfpt kills r0 .
|
|
|
|
MOVES
|
|
|
|
from const2 %num==0 to dst2
|
|
gen clr %2
|
|
|
|
from src2 to dst2
|
|
gen mov %1,%2
|
|
|
|
from FLTREG to longf4-FLTREG
|
|
gen movfo %1,%2
|
|
|
|
from longf4-FLTREG to FLTREG
|
|
gen movof %1,%2
|
|
|
|
from FLTREG to FLTREG
|
|
gen movf %1,%2
|
|
|
|
from DBLREG to double8
|
|
gen movf %1,%2
|
|
|
|
from double8 to DBLREG
|
|
gen movf %1,%2
|
|
|
|
from const2 %num==0 to src1
|
|
gen clrb %2
|
|
|
|
from src1or2 to src1
|
|
gen movb %1,%2
|
|
|
|
from ftoint to dst2
|
|
gen movfi %1.reg,%2
|
|
|
|
TESTS
|
|
|
|
to test src2
|
|
gen tst %1
|
|
|
|
STACKINGRULES
|
|
|
|
from const2 %num==0 to STACK
|
|
gen clr {autodec,sp}
|
|
|
|
from src2 to STACK
|
|
gen mov %1,{autodec,sp}
|
|
|
|
from regconst2 to STACK
|
|
gen mov %1.reg,{autodec,sp}
|
|
add {addr_external, %1.off},{regdef2,sp}
|
|
|
|
from addr_local to STACK
|
|
gen mov lb,{autodec,sp}
|
|
add {const2, %1.ind},{regdef2,sp}
|
|
|
|
from DBLREG to STACK
|
|
gen movf %1,{autodec,sp}
|
|
|
|
from FLTREG to STACK
|
|
gen movfo %1,{autodec,sp}
|
|
|
|
from REGPAIR to STACK
|
|
gen mov %1.2,{autodec,sp}
|
|
mov %1.1,{autodec,sp}
|
|
|
|
from regind4 to STACK
|
|
gen mov {regind2, %1.reg, 2+%1.off},{autodec,sp}
|
|
mov {regind2, %1.reg, %1.off},{autodec,sp}
|
|
|
|
from relative4 to STACK
|
|
gen mov {relative2, 2+%1.off},{autodec,sp}
|
|
mov {relative2, %1.off},{autodec,sp}
|
|
|
|
from regdef4 to STACK
|
|
gen mov {regind2, %1.reg, 2},{autodec,sp}
|
|
mov {regdef2, %1.reg },{autodec,sp}
|
|
|
|
from regind8 to STACK
|
|
uses REG
|
|
gen move %1.reg,%a
|
|
add {addr_external, 8+%1.off},%a
|
|
mov {autodec, %a},{autodec,sp}
|
|
mov {autodec, %a},{autodec,sp}
|
|
mov {autodec, %a},{autodec,sp}
|
|
mov {autodec, %a},{autodec,sp}
|
|
|
|
from regind8 to STACK
|
|
gen mov {regind2, %1.reg, 6+%1.off},{autodec,sp}
|
|
mov {regind2, %1.reg, 4+%1.off},{autodec,sp}
|
|
mov {regind2, %1.reg, 2+%1.off},{autodec,sp}
|
|
mov {regind2, %1.reg, %1.off},{autodec,sp}
|
|
|
|
from relative8 to STACK
|
|
uses REG
|
|
gen mov {addr_external, 8+%1.off},%a
|
|
mov {autodec, %a},{autodec,sp}
|
|
mov {autodec, %a},{autodec,sp}
|
|
mov {autodec, %a},{autodec,sp}
|
|
mov {autodec, %a},{autodec,sp}
|
|
|
|
from relative8 to STACK
|
|
gen mov {relative2, 6+%1.off},{autodec,sp}
|
|
mov {relative2, 4+%1.off},{autodec,sp}
|
|
mov {relative2, 2+%1.off},{autodec,sp}
|
|
mov {relative2, %1.off},{autodec,sp}
|
|
|
|
from regdef8 to STACK
|
|
gen mov {regind2, %1.reg, 6},{autodec,sp}
|
|
mov {regind2, %1.reg, 4},{autodec,sp}
|
|
mov {regind2, %1.reg, 2},{autodec,sp}
|
|
mov {regdef2, %1.reg },{autodec,sp}
|
|
|
|
from DLOCAL to STACK
|
|
gen mov {LOCAL, 2+%1.ind, 2},{autodec,sp}
|
|
mov {LOCAL, %1.ind, 2},{autodec,sp}
|
|
|
|
from src1 to STACK
|
|
gen clr {autodec,sp}
|
|
movb %1,{regdef1,sp}
|
|
|
|
from ftoint to STACK
|
|
gen movfi %1.reg,{autodec,sp}
|
|
|
|
from ftolong to STACK
|
|
gen setl.
|
|
movfi %1.reg,{autodec,sp}
|
|
seti.
|
|
|
|
COERCIONS
|
|
|
|
from STACK
|
|
uses REG
|
|
gen mov {autoinc,sp},%a yields %a
|
|
|
|
from STACK
|
|
uses REG
|
|
gen mov {autoinc,sp},%a yields {regconst2, %a, 0}
|
|
|
|
from STACK
|
|
uses FLTREG
|
|
gen movof {autoinc,sp},%a yields %a
|
|
|
|
from STACK
|
|
uses DBLREG
|
|
gen movf {autoinc,sp},%a yields %a
|
|
|
|
from STACK
|
|
uses REGPAIR
|
|
gen mov {autoinc,sp},%a.1
|
|
mov {autoinc,sp},%a.2 yields %a
|
|
|
|
from LOCAL yields {regind2,lb,%1.ind}
|
|
|
|
from DLOCAL yields {regind4,lb,%1.ind}
|
|
|
|
from regconst2
|
|
uses reusing %1,REG=%1.reg
|
|
gen add {addr_external, %1.off},%a yields %a
|
|
|
|
from addr_local
|
|
uses REG
|
|
gen mov lb,%a
|
|
add {const2, %1.ind},%a yields %a
|
|
|
|
from REG yields {regconst2, %1, 0}
|
|
|
|
from xsrc2
|
|
uses reusing %1, REG=%1 yields %a
|
|
|
|
from xsrc2
|
|
uses reusing %1, REG=%1 yields {regconst2, %a, 0}
|
|
|
|
from longf4
|
|
uses FLTREG
|
|
gen move %1,%a yields %a
|
|
|
|
from double8
|
|
uses DBLREG
|
|
gen move %1,%a yields %a
|
|
|
|
from src1
|
|
uses REG={const2,0}
|
|
gen bisb %1,%a yields %a
|
|
|
|
from REGPAIR yields %1.2 %1.1
|
|
|
|
from regind4 yields {regind2,%1.reg,2+%1.off}
|
|
{regind2,%1.reg,%1.off}
|
|
|
|
from relative4 yields {relative2,2+%1.off}
|
|
{relative2,%1.off}
|
|
|
|
from regdef4 yields {regind2,%1.reg,2}
|
|
{regdef2,%1.reg}
|
|
|
|
from DLOCAL yields {LOCAL, %1.ind+2, 2}
|
|
{LOCAL, %1.ind, 2}
|
|
|
|
/********************************
|
|
* from double8 to long4 *
|
|
********************************/
|
|
|
|
from regind8 yields {regind4,%1.reg,4+%1.off}
|
|
{regind4,%1.reg,%1.off}
|
|
|
|
from relative8 yields {relative4,4+%1.off}
|
|
{relative4,%1.off}
|
|
|
|
from regdef8 yields {regind4,%1.reg,4}
|
|
{regdef4,%1.reg}
|
|
|
|
PATTERNS
|
|
|
|
/********************************************************
|
|
* Group 1 : load instructions. *
|
|
* *
|
|
* For most load instructions no code is generated. *
|
|
* Action : put something on the fake-stack. *
|
|
********************************************************/
|
|
|
|
pat loc yields {const2, $1}
|
|
|
|
pat ldc yields {const2, loww($1)}
|
|
{const2, highw($1)}
|
|
|
|
pat lol yields {LOCAL, $1,2}
|
|
|
|
pat loe yields {relative2, $1}
|
|
|
|
pat lil yields {ILOCAL, $1}
|
|
|
|
pat lof
|
|
with REG yields {regind2,%1,$1}
|
|
with exact regconst2 yields {regind2,%1.reg,$1+%1.off}
|
|
with exact addr_external yields {relative2,$1+%1.off}
|
|
with exact addr_local yields {LOCAL, %1.ind + $1,2}
|
|
|
|
pat lal yields {addr_local, $1}
|
|
|
|
pat lae yields {addr_external, $1}
|
|
|
|
pat lpb leaving adp SL
|
|
|
|
pat lxl $1==0 yields lb
|
|
|
|
pat lxl $1==1 yields {LOCAL ,SL,2}
|
|
|
|
pat lxl $1==2
|
|
uses REG={LOCAL, SL, 2} yields {regind2,%a, SL}
|
|
|
|
pat lxl $1==3
|
|
uses REG={LOCAL, SL, 2}
|
|
gen move {regind2,%a, SL},%a yields {regind2,%a, SL}
|
|
|
|
pat lxl $1>3
|
|
uses REG={LOCAL, SL, 2},
|
|
REG={const2,$1-1}
|
|
gen 1:
|
|
move {regind2,%a, SL},%a
|
|
sob %b,{label,1b} yields %a
|
|
|
|
pat lxa $1==0 yields {addr_local, SL}
|
|
|
|
pat lxa $1==1
|
|
uses REG={LOCAL, SL, 2 } yields {regconst2, %a, SL }
|
|
|
|
pat lxa $1==2
|
|
uses REG={LOCAL, SL, 2 }
|
|
gen move {regind2, %a, SL }, %a yields {regconst2, %a, SL }
|
|
|
|
pat lxa $1==3
|
|
uses REG={LOCAL, SL, 2 }
|
|
gen move {regind2, %a, SL }, %a
|
|
move {regind2, %a, SL }, %a yields {regconst2, %a, SL }
|
|
|
|
pat lxa $1 > 3
|
|
uses REG={LOCAL, SL, 2},
|
|
REG={const2,$1-1}
|
|
gen 1:
|
|
move {regind2,%a, SL},%a
|
|
sob %b,{label,1b} yields {regconst2, %a, SL }
|
|
|
|
pat dch leaving loi 2
|
|
|
|
pat loi $1==2
|
|
with REG yields {regdef2, %1}
|
|
with exact regconst2 yields {regind2, %1.reg, %1.off}
|
|
with exact relative2 yields {reldef2, %1.off}
|
|
with exact regind2 yields {reginddef2, %1.reg, %1.off}
|
|
with exact regdef2 yields {reginddef2, %1.reg, 0}
|
|
with exact addr_local yields {LOCAL, %1.ind,2}
|
|
with exact addr_external yields {relative2, %1.off}
|
|
with exact LOCAL yields {reginddef2, lb, %1.ind}
|
|
|
|
pat loi $1==1
|
|
with REG yields {regdef1, %1}
|
|
with exact regconst2 yields {regind1, %1.reg, %1.off}
|
|
with exact addr_external yields {relative1, %1.off}
|
|
with exact addr_local yields {regind1, lb, %1.ind}
|
|
with exact relative2 yields {reldef1, %1.off}
|
|
with exact regind2 yields {reginddef1, %1.reg, %1.off}
|
|
with exact regdef2 yields {reginddef1, %1.reg, 0}
|
|
with exact LOCAL yields {reginddef1, lb, %1.ind}
|
|
|
|
pat loi $1==4
|
|
with REG yields {regdef4, %1}
|
|
with exact regconst2 yields {regind4, %1.reg, %1.off}
|
|
with exact addr_local yields {DLOCAL,%1.ind,4}
|
|
with exact addr_external yields {relative4, %1.off}
|
|
|
|
pat loi $1==8
|
|
with REG yields {regdef8, %1}
|
|
with exact regconst2 yields {regind8, %1.reg, %1.off}
|
|
with exact addr_local yields {regind8, lb , %1.ind}
|
|
with exact addr_external yields {relative8, %1.off}
|
|
|
|
pat loi
|
|
with exact addr_local
|
|
kills ALL
|
|
uses REG={const2,$1/2}, REG
|
|
gen move lb,%b
|
|
add {const2,%1.ind+$1},%b
|
|
1:
|
|
mov {autodec,%b},{autodec,sp}
|
|
sob %a,{label,1b}
|
|
with exact addr_external
|
|
kills ALL
|
|
uses REG={const2,$1/2}, REG
|
|
gen mov {addr_external,%1.off+$1},%b
|
|
1:
|
|
mov {autodec,%b},{autodec,sp}
|
|
sob %a,{label,1b}
|
|
with REG
|
|
kills ALL
|
|
uses REG={const2,$1}
|
|
gen add %a,%1
|
|
asr %a
|
|
1:
|
|
mov {autodec,%1},{autodec,sp}
|
|
sob %a,{label,1b}
|
|
|
|
|
|
pat ldl yields {DLOCAL, $1,4}
|
|
pat lde yields {relative4, $1}
|
|
pat ldf
|
|
with regconst2 yields {regind4,%1.reg,$1+%1.off}
|
|
with exact addr_external yields {relative4, $1+%1.off}
|
|
with exact addr_local yields {DLOCAL, %1.ind+$1,4}
|
|
|
|
pat lpi yields {addr_external, $1}
|
|
|
|
/****************************************************************
|
|
* Group 2 : Store instructions. *
|
|
* *
|
|
* These instructions are likely to ruin the fake-stack. *
|
|
* We don't expect many items on the fake-stack anyway *
|
|
* because we seem to have evaluated an expression just now. *
|
|
****************************************************************/
|
|
|
|
pat stl with xsrc2
|
|
kills indordef, locals %ind <= $1 && %ind+%size > $1
|
|
gen move %1,{LOCAL,$1,2}
|
|
|
|
pat ste with xsrc2
|
|
kills posextern
|
|
gen move %1, {relative2, $1 }
|
|
|
|
pat sil with xsrc2
|
|
kills allexeptcon
|
|
gen move %1, {reginddef2,lb,$1}
|
|
|
|
pat stf
|
|
with regconst2 xsrc2
|
|
kills allexeptcon
|
|
gen move %2,{regind2,%1.reg,$1+%1.off}
|
|
with addr_external xsrc2
|
|
kills allexeptcon
|
|
gen move %2,{relative2,$1+%1.off}
|
|
|
|
pat sti $1==2
|
|
with REG xsrc2
|
|
kills allexeptcon
|
|
gen move%2,{regdef2,%1}
|
|
with regconst2 xsrc2
|
|
kills allexeptcon
|
|
gen move%2,{regind2,%1.reg,%1.off}
|
|
with addr_external xsrc2
|
|
kills allexeptcon
|
|
gen move %2,{relative2,%1.off}
|
|
with addr_local xsrc2
|
|
kills allexeptcon
|
|
gen move %2,{LOCAL, %1.ind, 2}
|
|
with relative2 xsrc2
|
|
kills allexeptcon
|
|
gen move %2,{reldef2,%1.off}
|
|
with regind2 xsrc2
|
|
kills allexeptcon
|
|
gen move %2,{reginddef2,%1.reg,%1.off}
|
|
|
|
pat sti $1==1
|
|
with REG src1or2
|
|
kills allexeptcon
|
|
gen move %2,{regdef1,%1}
|
|
with exact regconst2 src1or2
|
|
kills allexeptcon
|
|
gen move %2,{regind1,%1.reg,%1.off}
|
|
with exact addr_external src1or2
|
|
kills allexeptcon
|
|
gen move %2,{relative1,%1.off}
|
|
with exact addr_local src1or2
|
|
kills allexeptcon
|
|
gen move %2,{regind1, lb, %1.ind}
|
|
with exact relative2 src1or2
|
|
kills allexeptcon
|
|
gen move %2,{reldef1,%1.off}
|
|
with exact regind2 src1or2
|
|
kills allexeptcon
|
|
gen move %2,{reginddef1,%1.reg,%1.off}
|
|
|
|
pat sti $1==4
|
|
with exact REG FLTREG
|
|
kills allexeptcon
|
|
gen movfo %2,{regdef4,%1}
|
|
with exact regind2 FLTREG
|
|
kills allexeptcon
|
|
gen movfo %2,{reginddef4,%1.reg,%1.off}
|
|
with exact relative2 FLTREG
|
|
kills allexeptcon
|
|
gen movfo %2,{reldef4,%1.off}
|
|
with exact REG ftolong
|
|
kills allexeptcon
|
|
gen setl.
|
|
movfi %2.reg,{regdef2,%1}
|
|
seti.
|
|
with exact regind2 ftolong
|
|
kills allexeptcon
|
|
gen setl.
|
|
movfi %2.reg,{reginddef2,%1.reg,%1.off}
|
|
seti.
|
|
with exact relative2 ftolong
|
|
kills allexeptcon
|
|
gen setl.
|
|
movfi %2.reg,{reldef2,%1.off}
|
|
seti.
|
|
with exact regconst2 FLTREG
|
|
kills allexeptcon
|
|
gen movfo %2,{regind4,%1.reg,%1.off}
|
|
with exact regconst2 ftolong
|
|
kills allexeptcon
|
|
gen setl.
|
|
movfi %2.reg,{regind2,%1.reg,%1.off}
|
|
seti.
|
|
with exact addr_local FLTREG
|
|
kills allexeptcon
|
|
gen movfo %2,{DLOCAL,%1.ind,4}
|
|
with exact addr_local ftolong
|
|
kills allexeptcon
|
|
gen setl.
|
|
movfi %2.reg,{DLOCAL,%1.ind,4}
|
|
seti.
|
|
with exact addr_external FLTREG
|
|
kills allexeptcon
|
|
gen movfo %2,{relative4,%1.off}
|
|
with exact addr_external ftolong
|
|
kills allexeptcon
|
|
gen setl.
|
|
movfi %2.reg,{relative2,%1.off}
|
|
seti.
|
|
with REG src2 src2
|
|
kills allexeptcon
|
|
gen move %2,{regdef2,%1}
|
|
move %3,{regind2,%1,2}
|
|
with REG
|
|
kills ALL
|
|
gen mov {autoinc,sp},{autoinc,%1}
|
|
mov {autoinc,sp},{regdef2,%1}
|
|
|
|
pat sti $1==8
|
|
with exact REG DBLREG
|
|
kills allexeptcon
|
|
gen movf %2,{regdef8,%1}
|
|
with exact regind2 DBLREG
|
|
kills allexeptcon
|
|
gen movf %2,{reginddef8,%1.reg,%1.off}
|
|
with exact relative2 DBLREG
|
|
kills allexeptcon
|
|
gen movf %2,{reldef8,%1.off}
|
|
with exact regconst2 DBLREG
|
|
kills allexeptcon
|
|
gen movf %2,{regind8,%1.reg,%1.off}
|
|
with exact addr_local DBLREG
|
|
kills allexeptcon
|
|
gen movf %2,{regind8, lb, %1.ind}
|
|
with exact addr_external DBLREG
|
|
kills allexeptcon
|
|
gen movf %2,{relative8, %1.off}
|
|
with REG regind8
|
|
kills allexeptcon
|
|
gen mov {regind2,%2.reg,%2.off },{autoinc,%1}
|
|
mov {regind2,%2.reg,%2.off+2},{autoinc,%1}
|
|
mov {regind2,%2.reg,%2.off+4},{autoinc,%1}
|
|
mov {regind2,%2.reg,%2.off+6},{regdef2,%1}
|
|
with REG relative8
|
|
kills allexeptcon
|
|
uses REG={addr_external,%2.off}
|
|
gen mov {autoinc,%a},{autoinc,%1}
|
|
mov {autoinc,%a},{autoinc,%1}
|
|
mov {autoinc,%a},{autoinc,%1}
|
|
mov {regdef2,%a},{regdef2,%1}
|
|
with REG
|
|
kills ALL
|
|
gen mov {autoinc,sp},{autoinc,%1}
|
|
mov {autoinc,sp},{autoinc,%1}
|
|
mov {autoinc,sp},{autoinc,%1}
|
|
mov {autoinc,sp},{regdef2,%1}
|
|
|
|
pat sti
|
|
with REG
|
|
kills ALL
|
|
uses REG={const2,$1/2}
|
|
gen 1:
|
|
mov {autoinc,sp},{autoinc,%1}
|
|
sob %a,{label,1b}
|
|
|
|
pat lal sti $2>2 && $2<=8
|
|
with exact xsrc2
|
|
yields %1
|
|
leaving stl $1 lal $1+2 sti $2-2
|
|
with
|
|
yields {addr_local,$1}
|
|
leaving sti $2
|
|
|
|
pat sdl
|
|
with exact FLTREG
|
|
kills indordef, locals %ind <= $1+2 && %ind+%size > $1
|
|
gen move %1,{DLOCAL,$1,4}
|
|
with exact ftolong
|
|
kills indordef, locals %ind <= $1+2 && %ind+%size > $1
|
|
gen setl.
|
|
movfi %1.reg,{DLOCAL,$1,4}
|
|
seti.
|
|
with src2 src2
|
|
kills indordef, locals %ind <= $1+2 && %ind+%size > $1
|
|
gen move %1,{LOCAL,$1,2}
|
|
move %2,{LOCAL,$1+2,2}
|
|
|
|
pat sde
|
|
with exact FLTREG
|
|
kills posextern
|
|
gen move %1,{relative4,$1}
|
|
with exact ftolong
|
|
kills posextern
|
|
gen setl.
|
|
movfi %1.reg,{relative4,$1}
|
|
seti.
|
|
with src2 src2
|
|
kills posextern
|
|
gen move %1, {relative2, $1 }
|
|
move %2, {relative2, $1+2}
|
|
|
|
pat sdf
|
|
with exact regconst2 FLTREG
|
|
kills allexeptcon
|
|
gen move %2,{regind4,%1.reg,$1+%1.off}
|
|
with exact regconst2 ftolong
|
|
kills allexeptcon
|
|
gen setl.
|
|
movfi %2.reg,{regind4,%1.reg,$1+%1.off}
|
|
seti.
|
|
with exact addr_external FLTREG
|
|
kills allexeptcon
|
|
gen move %2,{relative4,$1+%1.off}
|
|
with exact addr_external ftolong
|
|
kills allexeptcon
|
|
gen setl.
|
|
movfi %2.reg,{relative4, $1+%1.off}
|
|
seti.
|
|
with regconst2 src2 src2
|
|
kills allexeptcon
|
|
gen move %2,{regind2,%1.reg,$1+%1.off}
|
|
move %3,{regind2,%1.reg,$1+2+%1.off}
|
|
with addr_external src2 src2
|
|
kills allexeptcon
|
|
gen move %2,{relative2,$1+%1.off}
|
|
move %3,{relative2,$1+2+%1.off}
|
|
|
|
/****************************************************************
|
|
* Group 3 : Integer arithmetic. *
|
|
* *
|
|
* Implemented (sometimes with the use of subroutines) : *
|
|
* all 2 and 4 byte arithmetic. *
|
|
****************************************************************/
|
|
|
|
pat adi $1==2
|
|
with exact REG const2 yields {regconst2,%1,%2.num}
|
|
with exact REG addr_external yields {regconst2,%1,%2.off}
|
|
with exact REG addr_local
|
|
gen add lb,%1 yields {regconst2,%1,%2.ind}
|
|
with exact REG addr_local
|
|
uses REG
|
|
gen mov lb,%a
|
|
add %1,%a yields {regconst2,%a,%2.ind}
|
|
with exact REG regconst2
|
|
gen add %2.reg,%1 yields {regconst2,%1,%2.off}
|
|
with exact src2-REG const2+addr_external+addr_local
|
|
uses reusing %1,REG=%1 yields %2 %a
|
|
leaving adi 2
|
|
with exact regconst2 const2 yields {regconst2,%1.reg,%2.num+%1.off}
|
|
with exact regconst2 addr_external yields {regconst2,%1.reg,%2.off+%1.off}
|
|
with exact regconst2 addr_local
|
|
gen add lb,%1.reg yields {regconst2,%1.reg,%2.ind+%1.off}
|
|
with exact regconst2 regconst2
|
|
gen add %2.reg,%1.reg yields {regconst2,%1.reg,%2.off+%1.off}
|
|
with exact regconst2 noconst2
|
|
gen add %2,%1.reg yields %1
|
|
with exact REG noconst2
|
|
gen add %2,%1 yields %1
|
|
with exact src2 regconst2
|
|
gen add %1,%2.reg yields %2
|
|
with exact regconst2 src2
|
|
gen add %2,%1.reg yields %1
|
|
with src2 REG
|
|
gen add %1,%2 yields %2
|
|
|
|
pat adi $1==4
|
|
with REG REG src2 src2
|
|
gen add %4,%2
|
|
adc %1
|
|
add %3,%1 yields %2 %1
|
|
with REG REG src2 STACK
|
|
gen add {autoinc,sp},%2
|
|
adc %1
|
|
add %3,%1 yields %2 %1
|
|
with REG REG STACK
|
|
gen add {autoinc,sp},%1
|
|
add {autoinc,sp},%2
|
|
adc %1 yields %2 %1
|
|
with src2 src2 REG REG
|
|
gen add %2,%4
|
|
adc %3
|
|
add %1,%3 yields %4 %3
|
|
|
|
pat sbi $1==2
|
|
with src2 REG
|
|
gen sub %1,%2 yields %2
|
|
with exact REG src2-REG
|
|
gen sub %2,%1
|
|
neg %1 yields %1
|
|
|
|
pat sbi $1==4
|
|
with src2-REG src2-REG REG REG
|
|
gen sub %2,%4
|
|
sbc %3
|
|
sub %1,%3 yields %4 %3
|
|
with src2 src2 STACK
|
|
gen sub %2,{regind2,sp,2}
|
|
sbc {regdef2,sp}
|
|
sub %1,{regdef2,sp}
|
|
|
|
pat mli $1==2
|
|
with ODDREG src2
|
|
gen mul %2,%1 yields %1
|
|
with src2 ODDREG
|
|
gen mul %1,%2 yields %2
|
|
|
|
pat mli $1==4
|
|
kills ALL
|
|
gen jsr pc,{label, "mli4~"} yields r1 r0
|
|
|
|
pat dvi $1==2
|
|
with src2 src2
|
|
uses reusing %2,REGPAIR
|
|
gen mov %2,%a.2
|
|
sxt %a.1
|
|
div %1,%a.1 yields %a.1
|
|
with src2 src2 STACK
|
|
gen mov %1,{autodec,sp}
|
|
mov %2,r1
|
|
sxt r0
|
|
div {autoinc,sp},r0 yields r0
|
|
|
|
pat dvi $1==4
|
|
kills ALL
|
|
gen jsr pc,{label, "dvi4~"} yields r1 r0
|
|
|
|
pat rmi $1==2
|
|
with src2 src2
|
|
uses reusing %2,REGPAIR
|
|
gen mov %2,%a.2
|
|
sxt %a.1
|
|
div %1,%a.1 yields %a.2
|
|
with src2 src2 STACK
|
|
gen mov %1,{autodec,sp}
|
|
mov %2,r1
|
|
sxt r0
|
|
div {autoinc,sp},r0 yields r1
|
|
|
|
pat rmi $1==4
|
|
kills ALL
|
|
gen jsr pc,{label, "rmi4~"} yields r1 r0
|
|
|
|
pat ngi $1==2
|
|
with REG
|
|
gen neg %1 yields %1
|
|
|
|
pat ngi $1==4
|
|
with REG REG
|
|
gen neg %1
|
|
neg %2
|
|
sbc %1 yields %2 %1
|
|
|
|
pat loc sli $1==1 && $2==2
|
|
with REG
|
|
gen asl %1 yields %1
|
|
|
|
pat sli $1==2
|
|
with src2 REG
|
|
gen ash %1,%2 yields %2
|
|
|
|
pat sli $1==4
|
|
with src2 REGPAIR
|
|
gen ashc %1,%2 yields %2
|
|
|
|
pat loc sri $1==1 && $2==2
|
|
with REG
|
|
gen asr %1 yields %1
|
|
|
|
pat loc sri $2==2
|
|
with REG
|
|
gen ash {const2,0-$1},%1 yields %1
|
|
|
|
pat sri $1==2
|
|
with REG REG
|
|
gen neg %1
|
|
ash %1,%2 yields %2
|
|
|
|
pat loc sri $2==4
|
|
with REGPAIR
|
|
gen ashc {const2,0-$1},%1 yields %1
|
|
|
|
pat sri $1==4
|
|
with REG REGPAIR
|
|
gen neg %1
|
|
ashc %1,%2 yields %2
|
|
|
|
/************************************************
|
|
* Group 4 : unsigned arithmetic *
|
|
* *
|
|
* adu = adi *
|
|
* sbu = sbi *
|
|
* slu = sli *
|
|
* *
|
|
* Supported : 2- and 4 byte arithmetic. *
|
|
************************************************/
|
|
|
|
pat adu leaving adi $1
|
|
pat sbu leaving sbi $1
|
|
pat mlu $1==2 leaving mli 2
|
|
|
|
pat mlu $1==4
|
|
kills ALL
|
|
gen jsr pc,{label, "mlu4~"} yields r1 r0
|
|
|
|
pat dvu $1==2
|
|
kills ALL
|
|
gen jsr pc,{label, "dvu2~"} yields r0
|
|
|
|
pat dvu $1==4
|
|
kills ALL
|
|
gen jsr pc,{label, "dvu4~"} yields r1 r0
|
|
|
|
pat rmu $1==2
|
|
kills ALL
|
|
gen jsr pc,{label, "rmu2~"} yields r1
|
|
|
|
pat rmu $1==4
|
|
kills ALL
|
|
gen jsr pc,{label, "rmu4~"} yields r1 r0
|
|
|
|
pat slu leaving sli $1
|
|
|
|
pat sru $1==2
|
|
with REG xsrc2
|
|
uses reusing %2,REGPAIR
|
|
gen move %2,%a.2
|
|
move {const2,0},%a.1
|
|
neg %1
|
|
ashc %1,%a yields %a.2
|
|
|
|
pat loc sru $2==2
|
|
with xsrc2
|
|
uses reusing %1,REGPAIR
|
|
gen move %1,%a.2
|
|
move {const2,0},%a.1
|
|
ashc {const2,0-$1},%a yields %a.2
|
|
|
|
pat sru $1==4
|
|
kills ALL
|
|
gen move {const2,$1},r0
|
|
jsr pc,{label, "sru~"}
|
|
|
|
/************************************************
|
|
* Group 5 : Floating point arithmetic *
|
|
* *
|
|
* Supported : 4- and 8 byte arithmetic. *
|
|
************************************************/
|
|
|
|
pat adf $1==4
|
|
with FLTREG FLTREG
|
|
gen addf %1,%2 yields %2
|
|
with FLTREG FLTREG
|
|
gen addf %2,%1 yields %1
|
|
|
|
pat adf $1==8
|
|
with double8 DBLREG
|
|
gen addf %1,%2 yields %2
|
|
with DBLREG double8
|
|
gen addf %2,%1 yields %1
|
|
|
|
pat sbf $1==4
|
|
with FLTREG FLTREG
|
|
gen subf %1,%2 yields %2
|
|
|
|
pat sbf $1==8
|
|
with double8 DBLREG
|
|
gen subf %1,%2 yields %2
|
|
|
|
pat mlf $1==4
|
|
with FLTREG FLTREG
|
|
gen mulf %1,%2 yields %2
|
|
with FLTREG FLTREG
|
|
gen mulf %2,%1 yields %1
|
|
|
|
pat mlf $1==8
|
|
with double8 DBLREG
|
|
gen mulf %1,%2 yields %2
|
|
with DBLREG double8
|
|
gen mulf %2,%1 yields %1
|
|
|
|
pat dvf $1==4
|
|
with FLTREG FLTREG
|
|
gen divf %1,%2 yields %2
|
|
|
|
pat dvf $1==8
|
|
with double8 DBLREG
|
|
gen divf %1,%2 yields %2
|
|
|
|
pat ngf $1==4
|
|
with FLTREG
|
|
gen negf %1 yields %1
|
|
|
|
pat ngf $1==8
|
|
with DBLREG
|
|
gen negf %1 yields %1
|
|
|
|
pat fif $1==4
|
|
with longf4 FLTREG
|
|
uses FLTREGPAIR
|
|
gen move %1,%a.1
|
|
modf %2,%a yields %a.1 %a.2
|
|
|
|
pat fif $1==8
|
|
with double8 double8
|
|
uses DBLREGPAIR
|
|
gen move %1,%a.1
|
|
modf %2,%a yields %a.1 %a.2
|
|
|
|
pat fef $1==4
|
|
with FLTREG
|
|
uses REG
|
|
gen movei %1,%a
|
|
movie {const2,0},%1 yields %1 %a
|
|
|
|
pat fef $1==8
|
|
with DBLREG
|
|
uses REG
|
|
gen movei %1,%a
|
|
movie {const2,0},%1 yields %1 %a
|
|
|
|
/****************************************
|
|
* Group 6 : pointer arithmetic. *
|
|
* *
|
|
* Pointers have size 2 bytes. *
|
|
****************************************/
|
|
|
|
pat adp
|
|
with REG yields {regconst2, %1, $1}
|
|
with exact regconst2 yields {regconst2, %1.reg, $1+%1.off}
|
|
with exact addr_external yields {addr_external, $1+%1.off}
|
|
with exact addr_local yields {addr_local,%1.ind+$1}
|
|
|
|
pat ads $1==2 leaving adi 2
|
|
pat sbs $1==2 leaving sbi $1
|
|
|
|
/****************************************
|
|
* Group 7 : increment/decrement/zero *
|
|
****************************************/
|
|
|
|
pat inc
|
|
with REG
|
|
gen inc %1 yields %1
|
|
|
|
pat inl
|
|
kills indordef, locals %ind <= $1 && %ind+%size > $1
|
|
gen inc {LOCAL,$1,2}
|
|
|
|
pat ine
|
|
kills posextern
|
|
gen inc {relative2, $1}
|
|
|
|
pat dec
|
|
with REG
|
|
gen dec %1 yields %1
|
|
|
|
pat del
|
|
kills indordef, locals %ind <= $1 && %ind+%size > $1
|
|
gen dec {LOCAL, $1, 2}
|
|
|
|
pat dee
|
|
kills posextern
|
|
gen dec {relative2, $1}
|
|
|
|
pat lol loc sbi stl $1==$4 && $3==2
|
|
kills indordef, locals %ind <= $1 && %ind+%size > $1
|
|
gen sub {const2,$2},{LOCAL,$1,2}
|
|
|
|
pat lol ngi stl $1==$3 && $2==2
|
|
kills indordef, locals %ind <= $1 && %ind+%size > $1
|
|
gen neg {LOCAL, $1, 2}
|
|
|
|
pat lil ngi sil $1==$3 && $2==2
|
|
kills allexeptcon
|
|
gen neg {ILOCAL, $1}
|
|
|
|
pat lil inc sil $1==$3
|
|
kills allexeptcon
|
|
gen inc {ILOCAL, $1}
|
|
|
|
pat lol adi stl $2==2 && $1==$3
|
|
with src2
|
|
kills indordef, locals %ind <= $1 && %ind+%size > $1
|
|
gen add %1,{LOCAL, $1, 2}
|
|
|
|
pat lol adp stl $1==$3 && $2==1
|
|
kills indordef, locals %ind <= $1 && %ind+%size > $1
|
|
gen inc {LOCAL, $1, 2}
|
|
|
|
pat lol adp stl $1==$3
|
|
kills indordef, locals %ind <= $1 && %ind+%size > $1
|
|
gen add {const2, $2},{LOCAL, $1, 2}
|
|
|
|
pat loe adi ste $2==2 && $1==$3
|
|
with src2
|
|
kills posextern
|
|
gen add %1,{relative2, $1}
|
|
|
|
pat loe adp ste $1==$3
|
|
kills posextern
|
|
gen add {const2, $2},{relative2, $1}
|
|
|
|
pat lol ior stl $2==2 && $1==$3
|
|
with src2
|
|
kills indordef, locals %ind <= $1 && %ind+%size > $1
|
|
gen bis %1,{LOCAL, $1, 2}
|
|
|
|
pat loe ior ste $2==2 && $1==$3
|
|
with src2
|
|
kills posextern
|
|
gen bis %1,{relative2, $1}
|
|
|
|
pat lol and stl $2==2 && $1==$3
|
|
with REG
|
|
kills indordef, locals %ind <= $1 && %ind+%size > $1
|
|
gen com %1
|
|
bic %1,{LOCAL, $1, 2}
|
|
|
|
pat loe and ste $2==2 && $1==$3
|
|
with REG
|
|
kills posextern
|
|
gen com %1
|
|
bic %1,{relative2, $1}
|
|
|
|
pat loc lol and stl $3==2 && $2==$4
|
|
kills indordef, locals %ind <= $2 && %ind+%size > $2
|
|
gen bic {const2, ~$1},{LOCAL, $2, 2}
|
|
|
|
pat loc loe and ste $3==2 && $2==$4
|
|
kills posextern
|
|
gen bic {const2, ~$1},{relative2, $2}
|
|
|
|
pat zrl
|
|
kills indordef, locals %ind <= $1 && %ind+%size > $1
|
|
gen clr {LOCAL, $1, 2}
|
|
|
|
pat zre
|
|
kills posextern
|
|
gen clr {relative2, $1}
|
|
|
|
pat zrf $1==4
|
|
uses FLTREG
|
|
gen clrf %a yields %a
|
|
|
|
pat zrf $1==8
|
|
uses DBLREG
|
|
gen clrf %a yields %a
|
|
|
|
pat zer $1==2 yields {const2, 0}
|
|
pat zer $1==4 yields {const2,0} {const2,0}
|
|
pat zer $1==6 yields {const2,0} {const2,0} {const2,0}
|
|
pat zer $1==8 yields {const2,0} {const2,0}
|
|
{const2,0} {const2,0}
|
|
pat zer defined($1)
|
|
with STACK
|
|
gen move {const2,$1/2},r0
|
|
1:
|
|
clr {autodec,sp}
|
|
sob r0,{label, 1b}
|
|
|
|
/****************************************
|
|
* Group 8 : Convert instructions *
|
|
****************************************/
|
|
|
|
pat cii
|
|
kills ALL
|
|
gen jsr pc,{label, "cii~"}
|
|
|
|
pat cfi leaving cfu
|
|
pat ciu leaving cuu
|
|
pat cui leaving cuu
|
|
|
|
pat cfu
|
|
kills ALL
|
|
gen jsr pc,{label, "cfi~"}
|
|
|
|
pat cif
|
|
kills ALL
|
|
gen jsr pc,{label, "cif~"}
|
|
|
|
pat cuf
|
|
kills ALL
|
|
gen jsr pc,{label, "cuf~"}
|
|
|
|
pat cff
|
|
kills ALL
|
|
gen jsr pc,{label, "cff~"}
|
|
|
|
pat cuu
|
|
kills ALL
|
|
gen jsr pc,{label, "cuu~"}
|
|
|
|
pat loc loc cii $1==1 && $2==2
|
|
with src1or2
|
|
uses reusing %1,REG
|
|
gen movb %1,%a yields %a
|
|
|
|
pat loc loc cii $1==1 && $2==4
|
|
with src1or2
|
|
uses reusing %1,REG,REG
|
|
gen movb %1,%a
|
|
sxt %b yields %a %b
|
|
|
|
pat loc loc cii $1==2 && $2==4
|
|
with src2
|
|
uses reusing %1,REG,REG
|
|
gen move %1,%a
|
|
test %a
|
|
sxt %b yields %a %b
|
|
|
|
pat loc loc loc cii $1>=0 && $2==2 && $3==4 leaving loc $1 loc 0
|
|
|
|
pat loc loc loc cii $1< 0 && $2==2 && $3==4 leaving loc $1 loc 0-1
|
|
|
|
pat loc loc cii $1==4 && $2==2
|
|
with src2
|
|
|
|
pat loc loc cuu $1==2 && $2==4 leaving loc 0
|
|
|
|
pat loc loc cuu $1==4 && $2==2
|
|
with src2
|
|
|
|
pat loc loc cfu $1==4
|
|
with FLTREG yields {ftolong,%1}
|
|
leaving loc 4 loc $2 cuu
|
|
|
|
pat loc loc cfu $1==8
|
|
with DBLREG yields {ftolong,%1.1}
|
|
leaving loc 4 loc $2 cuu
|
|
|
|
pat loc loc cfi $1==4 && $2==2
|
|
with FLTREG yields {ftoint,%1}
|
|
|
|
pat loc loc cfi $1==4 && $2==4
|
|
with FLTREG yields {ftolong,%1}
|
|
|
|
pat loc loc cfi $1==8 && $2==2
|
|
with DBLREG yields {ftoint,%1.1}
|
|
|
|
pat loc loc cfi $1==8 && $2==4
|
|
with DBLREG yields {ftolong,%1.1}
|
|
|
|
pat loc loc cif $1==2 && $2==4
|
|
with src2
|
|
uses FLTREG
|
|
gen movif %1,%a yields %a
|
|
|
|
pat loc loc cif $1==2 && $2==8
|
|
with src2
|
|
uses DBLREG
|
|
gen movif %1,%a yields %a
|
|
|
|
pat loc loc cif $1==4 && $2==4
|
|
with exact long4-REGPAIR
|
|
uses FLTREG
|
|
gen setl.
|
|
movif %1,%a
|
|
seti. yields %a
|
|
with STACK
|
|
uses FLTREG
|
|
gen setl.
|
|
movif {autoinc,sp},%a
|
|
seti. yields %a
|
|
|
|
pat loc loc cif $1==4 && $2==8
|
|
with exact long4-REGPAIR
|
|
uses DBLREG
|
|
gen setl.
|
|
movif %1,%a
|
|
seti. yields %a
|
|
with STACK
|
|
uses DBLREG
|
|
gen setl.
|
|
movif {autoinc,sp},%a
|
|
seti. yields %a
|
|
|
|
pat loc loc cuf $1==2 && $2==4
|
|
with STACK
|
|
uses FLTREG
|
|
gen clr {autodec,sp}
|
|
setl.
|
|
movif {autoinc,sp},%a
|
|
seti. yields %a
|
|
|
|
pat loc loc cuf $1==2 && $2==8
|
|
with STACK
|
|
uses DBLREG
|
|
gen clr {autodec,sp}
|
|
setl.
|
|
movif {autoinc,sp},%a
|
|
seti. yields %a
|
|
|
|
pat loc loc cuf $1==4 leaving loc $1 loc $2 cif
|
|
|
|
pat loc loc cff $1==4 && $2==8
|
|
with longf4 - FLTREG
|
|
uses DBLREG
|
|
gen movof %1,%a yields %a
|
|
with FLTREG
|
|
uses DBLREG
|
|
gen move %1,%a.1 yields %a
|
|
|
|
pat loc loc cff $1==8 && $2==4
|
|
with DBLREG yields %1.1
|
|
|
|
/****************************************
|
|
* Group 9 : Logical instructions *
|
|
****************************************/
|
|
|
|
pat and $1==2
|
|
with const2 REG
|
|
gen bic {const2,~%1.num},%2 yields %2
|
|
with REG const2
|
|
gen bic {const2,~%2.num},%1 yields %1
|
|
with REG REG
|
|
gen com %1
|
|
bic %1,%2 yields %2
|
|
|
|
pat and defined($1)
|
|
kills ALL
|
|
gen move {const2,$1}, r0
|
|
jsr pc,{label, "and~"}
|
|
|
|
pat ior $1==2
|
|
with REG src2
|
|
gen bis %2,%1 yields %1
|
|
with src2 REG
|
|
gen bis %1,%2 yields %2
|
|
|
|
pat ior $1==8
|
|
with exact src2 src2 src2 src2 STACK
|
|
gen bis %1,{regdef2,sp}
|
|
bis %2,{regind2,sp,2}
|
|
bis %3,{regind2,sp,4}
|
|
bis %4,{regind2,sp,6}
|
|
with STACK
|
|
uses REG={const2,$1}
|
|
gen add sp,%a
|
|
bis {autoinc,sp},{autoinc,%a}
|
|
bis {autoinc,sp},{autoinc,%a}
|
|
bis {autoinc,sp},{autoinc,%a}
|
|
bis {autoinc,sp},{autoinc,%a}
|
|
|
|
pat ior defined($1)
|
|
with STACK
|
|
uses REG={const2,$1},REG={const2,$1/2}
|
|
gen add sp,%a
|
|
1:
|
|
bis {autoinc,sp},{autoinc,%a}
|
|
sob %b,{label,1b}
|
|
|
|
pat xor $1==2
|
|
with REG REG
|
|
gen xor %1,%2 yields %2
|
|
with REG REG
|
|
gen xor %2,%1 yields %1
|
|
|
|
pat xor defined($1)
|
|
kills ALL
|
|
gen move {const2,$1},r0
|
|
jsr pc,{label, "xor~"}
|
|
|
|
pat com $1==2
|
|
with REG
|
|
gen com %1 yields %1
|
|
|
|
pat com defined($1)
|
|
with STACK
|
|
uses REG={const2,$1/2},REG
|
|
gen mov sp,%b
|
|
1:
|
|
com {autoinc,%b}
|
|
sob %a,{label,1b}
|
|
|
|
pat rol $1==2
|
|
with const2 ODDREG
|
|
gen ashc {const2,%1.num-16},%2 yields %2
|
|
with REG ODDREG
|
|
gen sub {const2,16},%1
|
|
ashc %1,%2 yields %2
|
|
|
|
pat rol defined($1)
|
|
kills ALL
|
|
gen move {const2,$1},r0
|
|
jsr pc,{label, "rol~"}
|
|
|
|
pat ror $1==2
|
|
with const2 ODDREG
|
|
gen ashc {const2,0-%1.num},%2 yields %2
|
|
with REG ODDREG
|
|
gen neg %1
|
|
ashc %1,%2 yields %2
|
|
|
|
pat ror defined($1)
|
|
kills ALL
|
|
gen move {const2,$1},r0
|
|
jsr pc,{label, "ror~"}
|
|
|
|
pat com and $1==2 && $2==2
|
|
with src2 REG
|
|
gen bic %1,%2 yields %2
|
|
|
|
pat com and $1==$2
|
|
with STACK
|
|
uses REG={const2,$1},REG
|
|
gen mov sp,%b
|
|
add %a,%b
|
|
asr %a
|
|
1:
|
|
bic {autoinc,sp},{autoinc,%b}
|
|
sob %a,{label,1b}
|
|
|
|
/********************************
|
|
* Group 10 : Set instructions *
|
|
********************************/
|
|
|
|
pat inn $1==2
|
|
with REG REG
|
|
gen neg %1
|
|
ash %1,%2
|
|
bic {const2,0177776},%2 yields %2
|
|
|
|
pat loc inn $2==2 && $1==0
|
|
with REG
|
|
gen bic {const2,0177776},%1 yields %1
|
|
|
|
pat loc inn $2==2 && $1==1
|
|
with REG
|
|
gen asr %1
|
|
bic {const2,0177776},%1 yields %1
|
|
|
|
pat loc inn $2==2
|
|
with REG
|
|
gen ash {const2,0-$1},%1
|
|
bic {const2,0177776},%1 yields %1
|
|
|
|
pat loc inn zeq $2==2 yields {const2, 1<<$1}
|
|
leaving and 2 zeq $3
|
|
|
|
pat inn zeq $1==2
|
|
with src2
|
|
uses REG={const2,1}
|
|
gen ash %1,%a yields %a
|
|
leaving and 2 zeq $2
|
|
|
|
pat loc inn zne $2==2 yields {const2, 1<<$1}
|
|
leaving and 2 zne $3
|
|
|
|
pat inn zne $1==2
|
|
with src2
|
|
uses REG={const2,1}
|
|
gen ash %1,%a yields %a
|
|
leaving and 2 zne $2
|
|
|
|
pat inn defined($1)
|
|
with src2
|
|
kills ALL
|
|
gen move %1,r1
|
|
move {const2,$1},r0
|
|
jsr pc,{label, "inn~"} yields r0
|
|
|
|
pat set $1==2
|
|
with REG
|
|
uses REG={const2,1}
|
|
gen ash %1,%a yields %a
|
|
|
|
pat set defined($1)
|
|
with src2
|
|
kills ALL
|
|
gen move %1,r1
|
|
move {const2,$1},r0
|
|
jsr pc,{label, "set~"}
|
|
|
|
/****************************************
|
|
* Group 11 : Array instructions *
|
|
****************************************/
|
|
|
|
pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)==0 leaving adi 2
|
|
pat lae aar $2==2 && rom($1,3)==1 && rom($1,1)!=0 leaving adi 2 adp 0-rom($1,1)
|
|
|
|
pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)==0
|
|
with REG
|
|
gen asl %1 yields %1 leaving adi 2
|
|
|
|
pat lae aar $2==2 && rom($1,3)==2 && rom($1,1)!=0
|
|
with REG
|
|
gen asl %1 yields {regconst2,%1,(0-2)*rom($1,1)}
|
|
leaving adi 2
|
|
|
|
pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)==0
|
|
with REG
|
|
gen ash {const2,2},%1 yields %1 leaving adi 2
|
|
|
|
pat lae aar $2==2 && rom($1,3)==4 && rom($1,1)!=0
|
|
with REG
|
|
gen ash {const2,2},%1 yields {regconst2,%1,(0-4)*rom($1,1)}
|
|
leaving adi 2
|
|
|
|
pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)==0
|
|
with REG
|
|
gen ash {const2,3},%1 yields %1
|
|
leaving adi 2
|
|
|
|
pat lae aar $2==2 && rom($1,3)==8 && rom($1,1)!=0
|
|
with REG
|
|
gen ash {const2,3},%1 yields {regconst2,%1,(0-8)*rom($1,1)}
|
|
leaving adi 2
|
|
|
|
pat lae aar $2==2 && rom($1,1)==0
|
|
with ODDREG
|
|
gen mul {const2,rom($1,3)},%1 yields %1 leaving adi 2
|
|
|
|
pat lae aar $2==2 && defined(rom($1,1))
|
|
with ODDREG
|
|
gen mul {const2,rom($1,3)},%1 yields {regconst2,%1,(0-rom($1,3))*rom($1,1)}
|
|
leaving adi 2
|
|
|
|
pat aar $1==2
|
|
kills ALL
|
|
gen mov {autoinc,sp},r0
|
|
mov {autoinc,sp},r1
|
|
jsr pc,{label, "aar~"}
|
|
|
|
pat lae sar defined(rom($1,3)) leaving lae $1 aar $2 sti rom($1,3)
|
|
pat lae lar defined(rom($1,3)) leaving lae $1 aar $2 loi rom($1,3)
|
|
pat sar $1==2
|
|
kills ALL
|
|
gen mov {autoinc,sp},r0
|
|
mov {autoinc,sp},r1
|
|
jsr pc,{label, "sar~"}
|
|
|
|
pat lar $1==2
|
|
kills ALL
|
|
gen mov {autoinc,sp},r0
|
|
mov {autoinc,sp},r1
|
|
jsr pc,{label, "lar~"}
|
|
|
|
#ifdef UNTESTED
|
|
pat aar !defined($1)
|
|
kills ALL
|
|
gen jsr pc,{label, "iaar~"}
|
|
|
|
pat sar !defined($1)
|
|
kills ALL
|
|
gen jsr pc,{label, "isar~"}
|
|
|
|
pat lar !defined($1)
|
|
kills ALL
|
|
gen jsr pc,{label, "ilar~"}
|
|
#endif
|
|
|
|
/****************************************
|
|
* group 12 : Compare instructions *
|
|
****************************************/
|
|
|
|
pat cmi $1==2
|
|
with src2 src2
|
|
uses REG = {const2,0}
|
|
gen cmp %1,%2
|
|
beq {label,2f}
|
|
bgt {label,1f}
|
|
inc %a
|
|
br {label,2f}
|
|
1:
|
|
dec %a
|
|
2: yields %a
|
|
|
|
pat cmi $1==4
|
|
kills ALL
|
|
gen jsr pc,{label, "cmi4~"} yields r0
|
|
|
|
pat cmf defined($1)
|
|
kills ALL
|
|
gen move {const2,$1},r0
|
|
jsr pc,{label, "cmf~"} yields r0
|
|
|
|
pat cmu $1==2 leaving cmp
|
|
|
|
pat cmu $1==4
|
|
kills ALL
|
|
gen jsr pc,{label, "cmu4~"} yields r0
|
|
|
|
pat cmu defined($1)
|
|
kills ALL
|
|
gen move {const2,$1},r0
|
|
jsr pc,{label, "cmu~"} yields r0
|
|
|
|
pat cms $1==2 leaving cmi $1
|
|
|
|
pat cms defined($1)
|
|
kills ALL
|
|
gen move {const2,$1},r0
|
|
jsr pc,{label, "cms~"} yields r0
|
|
|
|
pat cms !defined($1)
|
|
with src2
|
|
kills ALL
|
|
gen move %1,r0
|
|
jsr pc,{label, "cms~"} yields r0
|
|
|
|
pat cmp
|
|
with src2 src2
|
|
uses REG = {const2,0}
|
|
gen cmp %1,%2
|
|
beq {label,2f}
|
|
bhi {label,1f}
|
|
inc %a
|
|
br {label,2f}
|
|
1:
|
|
dec %a
|
|
2: yields %a
|
|
|
|
proc txxand
|
|
with src2 REG
|
|
gen test %1
|
|
bxx* {label,1f}
|
|
clr %2
|
|
1: yields %2
|
|
|
|
proc txxior
|
|
with src2 REG
|
|
gen test %1
|
|
bxx* {label,1f}
|
|
bis {const2,1},%2
|
|
1: yields %2
|
|
|
|
proc txx
|
|
with src2
|
|
uses REG={const2,0}
|
|
gen test %1
|
|
bxx* {label,1f}
|
|
inc %a
|
|
1: yields %a
|
|
|
|
pat tlt and $2==2 call txxand("blt")
|
|
pat tle and $2==2 call txxand("ble")
|
|
pat teq and $2==2 call txxand("beq")
|
|
pat tne and $2==2 call txxand("bne")
|
|
pat tgt and $2==2 call txxand("bgt")
|
|
pat tge and $2==2 call txxand("bge")
|
|
|
|
pat tlt ior $2==2 call txxior("bge")
|
|
pat tle ior $2==2 call txxior("bgt")
|
|
pat teq ior $2==2 call txxior("bne")
|
|
pat tne ior $2==2 call txxior("beq")
|
|
pat tgt ior $2==2 call txxior("ble")
|
|
pat tge ior $2==2 call txxior("blt")
|
|
|
|
pat tlt call txx("bge")
|
|
pat tle call txx("bgt")
|
|
pat teq call txx("bne")
|
|
pat tne call txx("beq")
|
|
pat tgt call txx("ble")
|
|
pat tge call txx("blt")
|
|
|
|
proc andtxx
|
|
with src2 src2
|
|
uses REG={const2,0}
|
|
gen bit %1,%2
|
|
bxx* {label,1f}
|
|
inc %a
|
|
1: yields %a
|
|
|
|
pat and tne $1==2 call andtxx("beq")
|
|
pat and teq $1==2 call andtxx("bne")
|
|
|
|
proc cmitxxand
|
|
with src2 src2 REG
|
|
gen cmp %2,%1
|
|
bxx* {label,1f}
|
|
clr %3
|
|
1: yields %3
|
|
|
|
proc cmitxxior
|
|
with src2 src2 REG
|
|
gen cmp %2,%1
|
|
bxx* {label,1f}
|
|
bis {const2,1},%3
|
|
1: yields %3
|
|
|
|
proc cmitxx
|
|
with src2 src2
|
|
uses REG={const2,0}
|
|
gen cmp %2,%1
|
|
bxx* {label,1f}
|
|
inc %a
|
|
1: yields %a
|
|
|
|
pat cmi tlt and $1==2 && $3==2 call cmitxxand("blt")
|
|
pat cmi tle and $1==2 && $3==2 call cmitxxand("ble")
|
|
pat cmi teq and $1==2 && $3==2 call cmitxxand("beq")
|
|
pat cmi tne and $1==2 && $3==2 call cmitxxand("bne")
|
|
pat cmi tgt and $1==2 && $3==2 call cmitxxand("bgt")
|
|
pat cmi tge and $1==2 && $3==2 call cmitxxand("bge")
|
|
|
|
pat cmi tlt ior $1==2 && $3==2 call cmitxxior("bge")
|
|
pat cmi tle ior $1==2 && $3==2 call cmitxxior("bgt")
|
|
pat cmi teq ior $1==2 && $3==2 call cmitxxior("bne")
|
|
pat cmi tne ior $1==2 && $3==2 call cmitxxior("beq")
|
|
pat cmi tgt ior $1==2 && $3==2 call cmitxxior("ble")
|
|
pat cmi tge ior $1==2 && $3==2 call cmitxxior("blt")
|
|
|
|
pat cmi tlt $1==2 call cmitxx("bge")
|
|
pat cmi tle $1==2 call cmitxx("bgt")
|
|
pat cmi teq $1==2 call cmitxx("bne")
|
|
pat cmi tne $1==2 call cmitxx("beq")
|
|
pat cmi tgt $1==2 call cmitxx("ble")
|
|
pat cmi tge $1==2 call cmitxx("blt")
|
|
|
|
pat loc cmi teq and $1>=0 && $1<=127 && $2==2 && $4==2
|
|
with exact src1 REG
|
|
gen cmpb %1,{const2,$1}
|
|
beq {label,1f}
|
|
clr %2
|
|
1: yields %2
|
|
with yields {const2, $1}
|
|
leaving cmi 2 teq and 2
|
|
|
|
pat loc cmi teq ior $1>=0 && $1<=127 && $2==2 && $4==2
|
|
with exact src1 REG
|
|
gen cmpb %1,{const2,$1}
|
|
bne {label,1f}
|
|
bis {const2,1},%2
|
|
1: yields %2
|
|
with yields {const2, $1}
|
|
leaving cmi 2 teq ior 2
|
|
|
|
pat loc cmi teq $1>=0 && $1<=127 && $2==2
|
|
with exact src1
|
|
uses REG={const2,0}
|
|
gen cmpb %1,{const2,$1}
|
|
bne {label,1f}
|
|
inc %a
|
|
1: yields %a
|
|
with yields {const2, $1}
|
|
leaving cmi 2 teq
|
|
|
|
pat loc cmi tne and $1>=0 && $1<=127 && $2==2 && $4==2
|
|
with exact src1 REG
|
|
gen cmpb %1,{const2,$1}
|
|
bne {label,1f}
|
|
clr %2
|
|
1: yields %2
|
|
with yields {const2, $1}
|
|
leaving cmi 2 tne and 2
|
|
|
|
pat loc cmi tne ior $1>=0 && $1<=127 && $2==2 && $4==2
|
|
with exact src1 REG
|
|
gen cmpb %1,{const2,$1}
|
|
beq {label,1f}
|
|
bis {const2,1},%2
|
|
1: yields %2
|
|
with yields {const2, $1}
|
|
leaving cmi 2 tne ior 2
|
|
|
|
pat loc cmi tne $1>=0 && $1<=127 && $2==2
|
|
with exact src1
|
|
uses REG={const2,0}
|
|
gen cmpb %1,{const2,$1}
|
|
beq {label,1f}
|
|
inc %a
|
|
1: yields %a
|
|
with yields {const2, $1}
|
|
leaving cmi 2 tne
|
|
|
|
proc cmptxx
|
|
with src2 src2
|
|
uses REG={const2,0}
|
|
gen cmp %2,%1
|
|
bxx* {label,1f}
|
|
inc %a
|
|
1: yields %a
|
|
|
|
pat cmp tlt call cmptxx("bhis")
|
|
pat cmp tle call cmptxx("bhi")
|
|
pat cmp teq call cmptxx("bne")
|
|
pat cmp tne call cmptxx("beq")
|
|
pat cmp tgt call cmptxx("blos")
|
|
pat cmp tge call cmptxx("blo")
|
|
|
|
proc cmf4txx
|
|
with FLTREG FLTREG
|
|
uses REG={const2,0}
|
|
gen cmpf %2,%1
|
|
cfcc.
|
|
bxx* {label,1f}
|
|
inc %a
|
|
1: yields %a
|
|
|
|
pat cmf tlt $1==4 call cmf4txx("bge")
|
|
pat cmf tle $1==4 call cmf4txx("bgt")
|
|
pat cmf teq $1==4 call cmf4txx("bne")
|
|
pat cmf tne $1==4 call cmf4txx("beq")
|
|
pat cmf tgt $1==4 call cmf4txx("ble")
|
|
pat cmf tge $1==4 call cmf4txx("blt")
|
|
|
|
proc cmf8txx
|
|
with DBLREG double8
|
|
uses REG={const2,0}
|
|
gen cmpf %2,%1
|
|
cfcc.
|
|
bxx[1] {label,1f}
|
|
inc %a
|
|
1: yields %a
|
|
with double8 DBLREG
|
|
uses REG={const2,0}
|
|
gen cmpf %1,%2
|
|
cfcc.
|
|
bxx[2] {label,1f}
|
|
inc %a
|
|
1: yields %a
|
|
|
|
pat cmf tlt $1==8 call cmf8txx("bge","ble")
|
|
pat cmf tle $1==8 call cmf8txx("bgt","blt")
|
|
pat cmf teq $1==8 call cmf8txx("bne","bne")
|
|
pat cmf tne $1==8 call cmf8txx("beq","beq")
|
|
pat cmf tgt $1==8 call cmf8txx("ble","bge")
|
|
pat cmf tge $1==8 call cmf8txx("blt","bgt")
|
|
|
|
/****************************************
|
|
* Group 13 : Branch instructions *
|
|
****************************************/
|
|
|
|
pat bra
|
|
with STACK
|
|
gen jbr {label, $1}
|
|
|
|
proc bxx example beq
|
|
with src2 src2 STACK
|
|
gen cmp %2,%1
|
|
jxx* {label, $1}
|
|
pat blt call bxx("jlt")
|
|
pat ble call bxx("jle")
|
|
pat beq call bxx("jeq")
|
|
pat bne call bxx("jne")
|
|
pat bgt call bxx("jgt")
|
|
pat bge call bxx("jge")
|
|
|
|
pat loc beq $1>=0 && $1<=127
|
|
with exact src1 STACK
|
|
gen cmpb %1,{const2,$1}
|
|
jeq {label, $2}
|
|
with yields {const2, $1}
|
|
leaving beq $2
|
|
|
|
pat loc bne $1>=0 && $1<=127
|
|
with exact src1 STACK
|
|
gen cmpb %1,{const2,$1}
|
|
jne {label, $2}
|
|
with yields {const2, $1}
|
|
leaving bne $2
|
|
|
|
proc zxx example zeq
|
|
with src2 STACK
|
|
gen test %1
|
|
jxx* {label, $1}
|
|
|
|
pat zlt call zxx("jlt")
|
|
pat zle call zxx("jle")
|
|
pat zeq call zxx("jeq")
|
|
pat zne call zxx("jne")
|
|
pat zgt call zxx("jgt")
|
|
pat zge call zxx("jge")
|
|
|
|
proc cmpzxx example cmp zeq
|
|
with src2 src2 STACK
|
|
gen cmp %2,%1
|
|
jxx* {label, $2}
|
|
|
|
pat cmp zlt call cmpzxx("jlo")
|
|
pat cmp zle call cmpzxx("jlos")
|
|
pat cmp zeq call cmpzxx("jeq")
|
|
pat cmp zne call cmpzxx("jne")
|
|
pat cmp zgt call cmpzxx("jhi")
|
|
pat cmp zge call cmpzxx("jhis")
|
|
|
|
proc cmf4zxx example cmf zeq
|
|
with FLTREG FLTREG STACK
|
|
gen cmpf %2,%1
|
|
cfcc.
|
|
jxx* {label, $2}
|
|
|
|
pat cmf zlt $1==4 call cmf4zxx("jlt")
|
|
pat cmf zle $1==4 call cmf4zxx("jle")
|
|
pat cmf zeq $1==4 call cmf4zxx("jeq")
|
|
pat cmf zne $1==4 call cmf4zxx("jne")
|
|
pat cmf zgt $1==4 call cmf4zxx("jgt")
|
|
pat cmf zge $1==4 call cmf4zxx("jge")
|
|
|
|
proc cmf8zxx example cmf zeq
|
|
with DBLREG double8 STACK
|
|
gen cmpf %2,%1
|
|
cfcc.
|
|
jxx[1] {label, $2}
|
|
with double8 DBLREG STACK
|
|
gen cmpf %1,%2
|
|
cfcc.
|
|
jxx[2] {label, $2}
|
|
|
|
pat cmf zlt $1==8 call cmf8zxx("jlt","jgt")
|
|
pat cmf zle $1==8 call cmf8zxx("jle","jge")
|
|
pat cmf zeq $1==8 call cmf8zxx("jeq","jeq")
|
|
pat cmf zne $1==8 call cmf8zxx("jne","jne")
|
|
pat cmf zgt $1==8 call cmf8zxx("jgt","jlt")
|
|
pat cmf zge $1==8 call cmf8zxx("jge","jle")
|
|
|
|
proc andzen example and zeq
|
|
with src2 src2 STACK
|
|
gen bit %1,%2
|
|
jxx* {label, $2}
|
|
|
|
pat and zeq $1==2 call andzen("jeq")
|
|
pat and zne $1==2 call andzen("jne")
|
|
|
|
/************************************************
|
|
* group 14 : Procedure call instructions *
|
|
************************************************/
|
|
|
|
pat cal
|
|
kills ALL
|
|
gen jsr pc,{label, $1}
|
|
|
|
pat cai
|
|
with REG
|
|
kills ALL
|
|
gen jsr pc,{regdef2,%1}
|
|
|
|
pat lfr $1==2 yields r0
|
|
pat lfr $1==4 yields r1 r0
|
|
pat lfr $1==8 yields {relative8,"retar"}
|
|
pat lfr
|
|
kills ALL
|
|
gen move {const2,$1},r0
|
|
jsr pc,{label, "lfr~"}
|
|
|
|
pat lfr ret $1==$2 leaving ret 0
|
|
|
|
|
|
pat ret $1==0
|
|
with STACK
|
|
gen mov lb,sp
|
|
mov {autoinc, sp},lb
|
|
rts pc
|
|
|
|
pat ret $1==2
|
|
with src2 STACK
|
|
gen move %1,r0
|
|
mov lb,sp
|
|
mov {autoinc, sp},lb
|
|
rts pc
|
|
|
|
pat ret $1==4
|
|
with STACK
|
|
gen mov {autoinc,sp},r0
|
|
mov {autoinc,sp},r1
|
|
mov lb,sp
|
|
mov {autoinc, sp},lb
|
|
rts pc
|
|
|
|
pat ret $1==8 yields {addr_external, "retar"}
|
|
leaving sti 8 ret 0
|
|
|
|
pat ret
|
|
kills ALL
|
|
gen move {const2,$1},r0
|
|
jmp {label,"ret~"}
|
|
|
|
/************************************************
|
|
* Group 15 : Miscellaneous instructions *
|
|
************************************************/
|
|
|
|
pat asp $1==2
|
|
with STACK
|
|
gen tst {autoinc,sp}
|
|
|
|
pat asp $1==4
|
|
with STACK
|
|
gen cmp {autoinc,sp},{autoinc,sp}
|
|
|
|
pat asp $1==0-2
|
|
with STACK
|
|
gen tst {autodec,sp}
|
|
|
|
pat asp
|
|
with STACK
|
|
gen add {const2,$1},sp
|
|
|
|
pat ass $1==2
|
|
with STACK
|
|
gen add {autoinc,sp},sp
|
|
|
|
pat blm $1==4
|
|
with REG REG
|
|
gen mov {autoinc,%2},{autoinc,%1}
|
|
mov {regdef2,%2},{regdef2,%1}
|
|
|
|
pat blm $1==6
|
|
with REG REG
|
|
gen mov {autoinc,%2},{autoinc,%1}
|
|
mov {autoinc,%2},{autoinc,%1}
|
|
mov {regdef2,%2},{regdef2,%1}
|
|
|
|
pat blm $1==8
|
|
with REG REG
|
|
gen mov {autoinc,%2},{autoinc,%1}
|
|
mov {autoinc,%2},{autoinc,%1}
|
|
mov {autoinc,%2},{autoinc,%1}
|
|
mov {regdef2,%2},{regdef2,%1}
|
|
|
|
pat blm
|
|
with REG REG
|
|
uses REG={const2,$1/2}
|
|
gen 1:
|
|
mov {autoinc,%2},{autoinc,%1}
|
|
sob %a,{label,1b}
|
|
|
|
pat bls $1==2
|
|
with REG REG REG
|
|
gen
|
|
asr %1
|
|
beq {label,1f}
|
|
2:
|
|
mov {autoinc,%3},{autoinc,%2}
|
|
sob %1,{label,2b}
|
|
1:
|
|
|
|
pat lae csa $2==2
|
|
with src2
|
|
kills ALL
|
|
gen move %1,r1
|
|
move {addr_external,$1},r0
|
|
jmp {label, "csa~"}
|
|
|
|
pat csa $1==2
|
|
kills ALL
|
|
gen mov {autoinc,sp},r0
|
|
mov {autoinc,sp},r1
|
|
jmp {label, "csa~"}
|
|
|
|
pat lae csb $2==2
|
|
with src2
|
|
kills ALL
|
|
gen move %1,r1
|
|
move {addr_external,$1},r0
|
|
jmp {label, "csb~"}
|
|
|
|
pat csb $1==2
|
|
kills ALL
|
|
gen mov {autoinc,sp},r0
|
|
mov {autoinc,sp},r1
|
|
jmp {label, "csb~"}
|
|
|
|
pat dup $1==2
|
|
with REG yields %1 %1
|
|
|
|
pat dup $1==4
|
|
with exact long4 yields %1 %1
|
|
with src2 src2 yields %2 %1 %2 %1
|
|
|
|
pat dup $1==8
|
|
with exact long8 yields %1 %1
|
|
with STACK
|
|
kills ALL
|
|
gen move {const2, $1}, r0
|
|
jsr pc,{label, "dup~"}
|
|
|
|
pat dup
|
|
kills ALL
|
|
gen move {const2, $1}, r0
|
|
jsr pc,{label, "dup~"}
|
|
|
|
pat dus $1==2
|
|
with src2
|
|
kills ALL
|
|
gen move %1,r0
|
|
jsr pc,{label, "dup~"}
|
|
|
|
pat gto
|
|
kills ALL
|
|
gen mov {addr_external, $1},{autodec,sp}
|
|
jmp {label, "gto~"}
|
|
|
|
pat fil
|
|
gen mov {addr_external, $1},{relative2, "hol0"+4}
|
|
|
|
pat lim yields { relative2, "trpim~"}
|
|
|
|
pat lin
|
|
gen mov {const2,$1},{relative2, "hol0"}
|
|
|
|
pat lni
|
|
gen inc {relative2, "hol0"}
|
|
|
|
pat lor $1==0 yields lb
|
|
|
|
pat lor $1==1
|
|
with STACK
|
|
uses REG
|
|
gen mov sp,%a yields %a
|
|
|
|
pat lor $1==2 yields {relative2,"reghp~"}
|
|
|
|
pat mon
|
|
kills ALL
|
|
gen jsr pc,{label, "mon~"}
|
|
|
|
pat nop
|
|
kills ALL
|
|
#ifdef DEBUG
|
|
gen jsr pc,{label, "nop~"}
|
|
#endif
|
|
|
|
pat rck $1==2
|
|
with src2
|
|
|
|
pat rtt leaving ret 0
|
|
|
|
pat sig
|
|
with src2
|
|
uses REG
|
|
gen move {relative2,"trppc~"},%a
|
|
mov %1,{relative2,"trppc~"} yields %a
|
|
|
|
pat sim
|
|
kills ALL
|
|
gen jsr pc,{label, "sim~"}
|
|
|
|
pat str $1==0
|
|
with src2
|
|
kills ALL
|
|
gen mov %1,lb
|
|
|
|
pat str $1==1
|
|
with src2
|
|
kills ALL
|
|
gen mov %1,sp
|
|
|
|
pat str $1==2
|
|
kills ALL
|
|
gen jsr pc,{label, "strhp~"}
|
|
|
|
pat trp
|
|
kills ALL
|
|
gen jsr pc,{label, "trp~"}
|
|
|
|
pat exg $1==2
|
|
with src2 src2 yields %1 %2
|
|
|
|
pat exg defined($1)
|
|
kills ALL
|
|
gen move {const2,$1},r0
|
|
jsr pc,{label, "exg~"}
|
|
|
|
pat lol lal sti $1==$2 && $3==1 /* throw away funny C-proc-prolog */
|
|
|
|
pat los
|
|
gen jmp {label, illins}
|
|
|
|
pat sts
|
|
gen jmp {label, illins}
|
|
|
|
pat inn
|
|
gen jmp {label, illins}
|
|
|
|
pat set
|
|
gen jmp {label, illins}
|