2861 lines
88 KiB
Plaintext
2861 lines
88 KiB
Plaintext
"$Header$"
|
|
/********************************************************
|
|
* Back end tables for pdp 11 *
|
|
* Authors : Ceriel J.H. Jacobs,Hans van Staveren *
|
|
* *
|
|
* wordsize = 2 bytes, pointersize = 2 bytes. *
|
|
* *
|
|
* Register r5 is used for the LB, the stack pointer *
|
|
* is used for SP. Also some global variables are used: *
|
|
* - reghp~ : the heap pointer *
|
|
* - trpim~ : trap ignore mask *
|
|
* - trppc~ : address of user defined trap handler *
|
|
* - retar : function return area for size>4 *
|
|
* *
|
|
* Timing is based on the timing information available *
|
|
* for the 11/45. Hardware floating point processor is *
|
|
* assumed. *
|
|
********************************************************/
|
|
|
|
/*
|
|
* (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
|
*
|
|
* This product is part of the Amsterdam Compiler Kit.
|
|
*
|
|
* Permission to use, sell, duplicate or disclose this software must be
|
|
* obtained in writing. Requests for such permissions may be sent to
|
|
*
|
|
* Dr. Andrew S. Tanenbaum
|
|
* Wiskundig Seminarium
|
|
* Vrije Universiteit
|
|
* Postbox 7161
|
|
* 1007 MC Amsterdam
|
|
* The Netherlands
|
|
*
|
|
*/
|
|
|
|
/* #define REGPATCH \* save all registers in link block */
|
|
/* #define UNTESTED \* include untested rules */
|
|
|
|
#ifdef REGPATCH
|
|
#define SL 8
|
|
#define SSL "010"
|
|
#else REGPATCH
|
|
#define SL 4
|
|
#define SSL "4"
|
|
#endif REGPATCH
|
|
|
|
#define NC nocoercions:
|
|
|
|
/* options */
|
|
/* #define DORCK \* rck is expanded instead of thrown away */
|
|
#define REGVARS /* use register variables */
|
|
|
|
EM_WSIZE=2
|
|
EM_PSIZE=2
|
|
EM_BSIZE=SL
|
|
|
|
TIMEFACTOR= 1/30
|
|
|
|
REGISTERS:
|
|
r0 = ("r0", 2), REG.
|
|
r1 = ("r1", 2), REG, ODD_REG.
|
|
#ifdef REGVARS
|
|
r2 = ("r2", 2) regvar, RREG.
|
|
#else
|
|
/* r2 = ("r2", 2), REG. */
|
|
#endif
|
|
r3 = ("r3", 2), REG, ODD_REG.
|
|
#ifdef REGVARS
|
|
r4 = ("r4", 2) regvar, RREG.
|
|
#else
|
|
/* r4 = ("r4", 2), REG. */
|
|
#endif
|
|
lb = ("r5", 2), localbase.
|
|
r01 = ("r0", 4, r0, r1), REG_PAIR.
|
|
#ifndef REGVARS
|
|
/* r23 = ("r2", 4, r2, r3), REG_PAIR. */
|
|
#endif
|
|
fr0 = ("fr0", 4), FLT_REG.
|
|
fr1 = ("fr1", 4), FLT_REG.
|
|
fr2 = ("fr2", 4), FLT_REG.
|
|
fr3 = ("fr3", 4), FLT_REG.
|
|
fr01 = ("fr0", 8, fr0, fr1), FLT_REG_PAIR.
|
|
fr23 = ("fr2", 8, fr2, fr3), FLT_REG_PAIR.
|
|
dr0 = ("fr0", 8, fr0), DBL_REG.
|
|
dr1 = ("fr1", 8, fr1), DBL_REG.
|
|
dr2 = ("fr2", 8, fr2), DBL_REG.
|
|
dr3 = ("fr3", 8, fr3), DBL_REG.
|
|
dr01 = ("fr0", 16, dr0, dr1), DBL_REG_PAIR.
|
|
dr23 = ("fr2", 16, dr2, dr3), DBL_REG_PAIR.
|
|
|
|
TOKENS:
|
|
|
|
/********************************
|
|
* Types on the EM-machine *
|
|
********************************/
|
|
|
|
CONST2 = {INT num;} 2 cost=(2,30) "$%[num]"
|
|
LOCAL2 = {INT ind,size;} 2 cost=(2,60) "%[ind](r5)"
|
|
LOCAL4 = {INT ind,size;} 4 cost=(2,120) "%[ind](r5)"
|
|
ADDR_LOCAL = {INT ind;} 2
|
|
ADDR_EXTERNAL = {STRING ind;} 2 cost=(2,30) "$%[ind]"
|
|
|
|
/********************************************************
|
|
* Now mostly addressing modes of target machine *
|
|
********************************************************/
|
|
|
|
regdef2 = {REGISTER reg;} 2 cost=(0,30) "(%[reg])"
|
|
regind2 = {REGISTER reg; STRING ind;} 2 cost=(2,60) "%[ind](%[reg])"
|
|
reginddef2 = {REGISTER reg; STRING ind;} 2 cost=(2,105) "*%[ind](%[reg])"
|
|
regconst2 = {REGISTER reg; STRING ind;} 2
|
|
/********************************************************
|
|
* This means : add "reg" and "ind" to get address. *
|
|
* Not really addressable on the PDP 11 *
|
|
********************************************************/
|
|
relative2 = {STRING ind;} 2 cost=(2,60) "%[ind]"
|
|
reldef2 = {STRING ind;} 2 cost=(2,105) "*%[ind]"
|
|
regdef1 = {REGISTER reg;} 2 cost=(0,30) "(%[reg])"
|
|
regind1 = {REGISTER reg; STRING ind;} 2 cost=(2,60) "%[ind](%[reg])"
|
|
reginddef1 = {REGISTER reg; STRING ind;} 2 cost=(2,105) "*%[ind](%[reg])"
|
|
relative1 = {STRING ind;} 2 cost=(2,60) "%[ind]"
|
|
reldef1 = {STRING ind;} 2 cost=(2,105) "*%[ind]"
|
|
|
|
/************************************************************************
|
|
* fto* are floats converted to *, conversion is delayed to be combined *
|
|
* with store. *
|
|
************************************************************************/
|
|
|
|
ftoint = {REGISTER reg;} 2
|
|
ftolong = {REGISTER reg;} 4
|
|
|
|
/************************************************************************
|
|
* ...4 and ...8 are only addressable by the floating point processor. *
|
|
************************************************************************/
|
|
|
|
regind4 = {REGISTER reg; STRING ind; } 4 cost=(2,363) "%[ind](%[reg])"
|
|
relative4 = {STRING ind; } 4 cost=(2,363) "%[ind]"
|
|
regdef4 = {REGISTER reg;} 4 cost=(2,324) "(%[reg])"
|
|
regdef8 = {REGISTER reg;} 8 cost=(2,522) "(%[reg])"
|
|
relative8 = {STRING ind; } 8 cost=(2,561) "%[ind]"
|
|
regind8 = {REGISTER reg; STRING ind;} 8 cost=(2,561) "%[ind](%[reg])"
|
|
|
|
TOKENEXPRESSIONS:
|
|
SCR_REG = REG * SCRATCH
|
|
SCR_FLT_REG = FLT_REG * SCRATCH
|
|
SCR_DBL_REG = DBL_REG * SCRATCH
|
|
SCR_ODD_REG = ODD_REG * SCRATCH
|
|
SCR_REG_PAIR = REG_PAIR * SCRATCH
|
|
all= ALL
|
|
source2 = RREG + REG + regdef2 + regind2 + reginddef2 + localbase +
|
|
relative2 + reldef2 + ADDR_EXTERNAL + CONST2 + LOCAL2
|
|
xsource2 = source2 + ftoint
|
|
source1 = regdef1 + regind1 + reginddef1 + relative1 +
|
|
reldef1
|
|
source1or2 = source1 + source2
|
|
long4 = relative4 + regdef4 + LOCAL4 + regind4 + REG_PAIR
|
|
longf4 = long4 + FLT_REG - REG_PAIR
|
|
double8 = relative8 + regdef8 + regind8 + DBL_REG
|
|
indexed2 = regind2 + reginddef2
|
|
indexed4 = regind4
|
|
indexed8 = regind8
|
|
indexed = indexed2 + indexed4 + indexed8
|
|
regdeferred = regdef2 + regdef4 + regdef8
|
|
indordef = indexed + regdeferred
|
|
locals = LOCAL2 + LOCAL4
|
|
variable2 = relative2 + reldef2
|
|
variable4 = relative4
|
|
variable8 = relative8
|
|
variable = variable2 + variable4 + variable8
|
|
dadres2 = relative2 + RREG + REG + regind2
|
|
regs = RREG + REG + REG_PAIR + FLT_REG + FLT_REG_PAIR +
|
|
DBL_REG + DBL_REG_PAIR
|
|
noconst2 = source2 - 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
|
|
|
|
#ifdef REGVARS
|
|
register = RREG + REG
|
|
#define INDSTORE remove(allexeptcon-locals) remove(locals, inreg(%[ind])==0)
|
|
#else
|
|
register = REG
|
|
#define INDSTORE remove(allexeptcon)
|
|
#endif
|
|
|
|
CODE:
|
|
|
|
/********************************************************
|
|
* Group 1 : load instructions. *
|
|
* *
|
|
* For most load instructions no code is generated. *
|
|
* Action : put something on the fake-stack. *
|
|
********************************************************/
|
|
|
|
loc | | | {CONST2, $1} | |
|
|
ldc | | | {CONST2, loww(1)} {CONST2, highw(1)} | |
|
|
#ifdef REGVARS
|
|
lol inreg($1)==2| | | regvar($1) | |
|
|
#endif
|
|
lol | | | {LOCAL2, $1,2} | |
|
|
loe | | | {relative2, $1} | |
|
|
#ifdef REGVARS
|
|
lil inreg($1)==2| | | {regdef2, regvar($1)} | |
|
|
#endif
|
|
lil | | | {reginddef2, lb, tostring($1)} | |
|
|
lof | register | | {regind2,%[1],tostring($1)} | |
|
|
... | NC regconst2 |
|
|
| {regind2,%[1.reg],tostring($1)+"+"+%[1.ind]} | |
|
|
... | NC ADDR_EXTERNAL |
|
|
| {relative2,tostring($1)+"+"+%[1.ind]} | |
|
|
... | NC ADDR_LOCAL | | {LOCAL2, %[1.ind] + $1,2} | |
|
|
#ifdef REGVARS
|
|
lol lof inreg($1)!=2 | |
|
|
allocate(REG={LOCAL2, $1,2})
|
|
| {regind2,%[a],tostring($2)} | |
|
|
#endif
|
|
lal | | | {ADDR_LOCAL, $1} | |
|
|
lae | | | {ADDR_EXTERNAL, $1} | |
|
|
lpb | | | | adp SL |
|
|
lxl $1==0 | | | lb | |
|
|
lxl $1==1 | | | {LOCAL2 ,SL,2} | |
|
|
lxl $1==2 | | allocate(REG={LOCAL2, SL, 2})
|
|
| {regind2,%[a], SSL} | |
|
|
lxl $1==3 | | allocate(REG={LOCAL2, SL, 2})
|
|
move({regind2,%[a], SSL},%[a])
|
|
| {regind2,%[a], SSL} | |
|
|
lxl $1>3 | | allocate(REG={LOCAL2, SL, 2}, REG={CONST2,$1-1})
|
|
"1:"
|
|
move({regind2,%[a], SSL},%[a])
|
|
"sob %[b],1b"
|
|
setcc(%[a]) erase(%[a]) erase(%[b])
|
|
| %[a] | |
|
|
lxa $1==0 | | | {ADDR_LOCAL, SL} | |
|
|
lxa $1==1 | | allocate(REG={LOCAL2, SL, 2 })
|
|
| {regconst2, %[a], SSL } | |
|
|
lxa $1==2 | | allocate(REG={LOCAL2, SL, 2 })
|
|
move({regind2, %[a], SSL }, %[a])
|
|
| {regconst2, %[a], SSL } | |
|
|
lxa $1==3 | | allocate(REG={LOCAL2, SL, 2 })
|
|
move({regind2, %[a], SSL }, %[a])
|
|
move({regind2, %[a], SSL }, %[a])
|
|
| {regconst2, %[a], SSL } | |
|
|
lxa $1 > 3 | | allocate(REG={LOCAL2, SL, 2}, REG={CONST2,$1-1})
|
|
"1:"
|
|
move({regind2,%[a], SSL},%[a])
|
|
"sob %[b],1b"
|
|
setcc(%[a]) erase(%[a]) erase(%[b])
|
|
| {regconst2, %[a], SSL } | |
|
|
dch | | | | loi 2 |
|
|
loi $1==2 | register | | {regdef2, %[1]} | |
|
|
... | NC regconst2 | | {regind2, %[1.reg], %[1.ind]} | |
|
|
... | NC relative2 | | {reldef2, %[1.ind]} | |
|
|
... | NC regind2 | | {reginddef2, %[1.reg], %[1.ind]} | |
|
|
... | NC regdef2 | | {reginddef2, %[1.reg], "0"}| |
|
|
... | NC ADDR_LOCAL | | {LOCAL2, %[1.ind],2} | |
|
|
... | NC ADDR_EXTERNAL | | {relative2, %[1.ind]} | |
|
|
... | NC LOCAL2 |
|
|
|{reginddef2, lb, tostring(%[1.ind])}| |
|
|
loi $1==1 | register | | {regdef1, %[1]} | |
|
|
... | NC regconst2 | | {regind1, %[1.reg], %[1.ind]} | |
|
|
... | NC ADDR_EXTERNAL | | {relative1, %[1.ind]} | |
|
|
... | NC ADDR_LOCAL| |{regind1, lb, tostring(%[1.ind])} | |
|
|
... | NC relative2 | | {reldef1, %[1.ind]} | |
|
|
... | NC regind2 | | {reginddef1, %[1.reg], %[1.ind]} | |
|
|
... | NC regdef2 | | {reginddef1, %[1.reg], "0"}| |
|
|
... | NC LOCAL2 | |{reginddef1, lb, tostring(%[1.ind])} | |
|
|
loi $1==4 | register | | {regdef4, %[1]} | |
|
|
... | NC regconst2 | | {regind4, %[1.reg], %[1.ind]} | |
|
|
... | NC ADDR_LOCAL | | {LOCAL4,%[1.ind],4} | |
|
|
... | NC ADDR_EXTERNAL | | {relative4, %[1.ind]} | |
|
|
loi $1==8 | register | | {regdef8, %[1]} | |
|
|
... | NC regconst2 | | {regind8, %[1.reg], %[1.ind]} | |
|
|
... | NC ADDR_LOCAL |
|
|
| {regind8, lb , tostring(%[1.ind])} | |
|
|
... | NC ADDR_EXTERNAL | | {relative8, %[1.ind]} | |
|
|
loi | NC ADDR_LOCAL |
|
|
remove(all)
|
|
allocate(REG={CONST2,$1/2},REG)
|
|
move(lb,%[b])
|
|
"add $$%(%[1.ind]+$1%),%[b]"
|
|
"1:\tmov -(%[b]),-(sp)"
|
|
"sob %[a],1b"
|
|
erase(%[a]) erase(%[b]) | | |
|
|
... | NC ADDR_EXTERNAL |
|
|
remove(all)
|
|
allocate(REG={CONST2,$1/2},REG)
|
|
"mov $$%[1.ind]+$1,%[b]"
|
|
"1:\tmov -(%[b]),-(sp)"
|
|
"sob %[a],1b"
|
|
erase(%[a]) erase(%[b]) | | |
|
|
... | SCR_REG |
|
|
remove(all)
|
|
allocate(REG={CONST2,$1})
|
|
"add %[a],%[1]"
|
|
"asr %[a]"
|
|
"1:\tmov -(%[1]),-(sp)"
|
|
"sob %[a],1b"
|
|
erase(%[1]) erase(%[a]) | | |
|
|
los $1==2 | |
|
|
remove(all)
|
|
"mov (sp)+,r0"
|
|
"mov (sp)+,r1"
|
|
"jsr pc,los2~" | | |
|
|
#ifdef UNTESTED
|
|
los !defined($1)| source2 |
|
|
remove(all)
|
|
"cmp %[1],$$2"
|
|
"beq 1f;jmp unknown~;1:"
|
|
"mov (sp)+,r0"
|
|
"mov (sp)+,r1"
|
|
"jsr pc,los2~" | | |
|
|
#endif
|
|
|
|
ldl | | | {LOCAL4, $1,4} | |
|
|
lde | | | {relative4, $1} | |
|
|
ldf | regconst2 |
|
|
| {regind4,%[1.reg], tostring($1)+"+"+%[1.ind]} | |
|
|
... | NC ADDR_EXTERNAL |
|
|
| {relative4, tostring($1)+"+"+%[1.ind]} | |
|
|
... | NC ADDR_LOCAL | | {LOCAL4, %[1.ind]+$1,4} | |
|
|
lpi | | | {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. *
|
|
****************************************************************/
|
|
|
|
#ifdef REGVARS
|
|
stl inreg($1)==2| xsource2 |
|
|
remove(regvar($1))
|
|
move(%[1],regvar($1)) | | |
|
|
#endif
|
|
stl | xsource2 |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
move(%[1],{LOCAL2,$1,2}) | | |
|
|
ste | xsource2 |
|
|
remove(posextern)
|
|
move(%[1], {relative2, $1 }) | | |
|
|
#ifdef REGVARS
|
|
sil inreg($1)==2| xsource2 |
|
|
INDSTORE
|
|
move(%[1], {regdef2,regvar($1)}) | | |
|
|
#endif
|
|
sil | xsource2 |
|
|
INDSTORE
|
|
move(%[1], {reginddef2,lb,tostring($1)}) | | |
|
|
stf | regconst2 xsource2 |
|
|
INDSTORE
|
|
move(%[2],{regind2,%[1.reg],tostring($1)+"+"+%[1.ind]}) | | |
|
|
... | ADDR_EXTERNAL xsource2 |
|
|
INDSTORE
|
|
move(%[2],{relative2,tostring($1)+"+"+%[1.ind]})| | |
|
|
#ifdef REGVARS
|
|
lol stf inreg($1)!=2 | xsource2 |
|
|
INDSTORE
|
|
allocate(REG={LOCAL2, $1,2})
|
|
move(%[1],{regind2,%[a],tostring($2)}) | | |
|
|
lae lol ads sti $3==2 && inreg($2)==2 | |
|
|
| {regconst2, regvar($2), $1} | sti $4 |
|
|
lae lol ads loi $3==2 && inreg($2)==2 | |
|
|
| {regconst2, regvar($2), $1} | loi $4 |
|
|
#endif
|
|
sti $1==2 | register xsource2 |
|
|
INDSTORE
|
|
move(%[2],{regdef2,%[1]}) | | |
|
|
... | regconst2 xsource2 |
|
|
INDSTORE
|
|
move(%[2],{regind2,%[1.reg],%[1.ind]}) | | |
|
|
... | ADDR_EXTERNAL xsource2 |
|
|
INDSTORE
|
|
move(%[2],{relative2,%[1.ind]}) | | |
|
|
... | ADDR_LOCAL xsource2 |
|
|
INDSTORE
|
|
move(%[2],{LOCAL2, %[1.ind], 2}) | | |
|
|
... | relative2 xsource2 |
|
|
INDSTORE
|
|
move(%[2],{reldef2,%[1.ind]}) | | |
|
|
... | regind2 xsource2 |
|
|
INDSTORE
|
|
move(%[2],{reginddef2,%[1.reg],%[1.ind]}) | | |
|
|
sti $1==1 | register source1or2 |
|
|
INDSTORE
|
|
move(%[2],{regdef1,%[1]}) | | |
|
|
... | regconst2 source1or2 |
|
|
INDSTORE
|
|
move(%[2],{regind1,%[1.reg],%[1.ind]}) | | |
|
|
... | ADDR_EXTERNAL source1or2 |
|
|
INDSTORE
|
|
move(%[2],{relative1,%[1.ind]}) | | |
|
|
... | ADDR_LOCAL source1or2 |
|
|
INDSTORE
|
|
move(%[2],{regind1, lb, tostring(%[1.ind])}) | | |
|
|
... | relative2 source1or2 |
|
|
INDSTORE
|
|
move(%[2],{reldef1,%[1.ind]}) | | |
|
|
... | regind2 source1or2 |
|
|
INDSTORE
|
|
move(%[2],{reginddef1,%[1.reg],%[1.ind]}) | | |
|
|
sti $1==4 | NC dadres2 FLT_REG |
|
|
INDSTORE
|
|
"movfo %[2],*%[1]"
|
|
samecc | | |
|
|
... | NC dadres2 ftolong |
|
|
INDSTORE
|
|
"setl\nmovfi %[2.reg],*%[1]\nseti"
|
|
samecc | | |
|
|
... | NC regconst2 FLT_REG |
|
|
INDSTORE
|
|
"movfo %[2],%[1.ind](%[1.reg])"
|
|
samecc | | |
|
|
... | NC regconst2 ftolong |
|
|
INDSTORE
|
|
"setl\nmovfi %[2.reg],%[1.ind](%[1.reg])\nseti"
|
|
samecc | | |
|
|
... | NC ADDR_LOCAL FLT_REG |
|
|
INDSTORE
|
|
"movfo %[2],%[1.ind](r5)"
|
|
samecc | | |
|
|
... | NC ADDR_LOCAL ftolong |
|
|
INDSTORE
|
|
"setl\nmovfi %[2.reg],%[1.ind](r5)\nseti"
|
|
samecc | | |
|
|
... | NC ADDR_EXTERNAL FLT_REG |
|
|
INDSTORE
|
|
"movfo %[2],%[1.ind]"
|
|
samecc | | |
|
|
... | NC ADDR_EXTERNAL ftolong |
|
|
INDSTORE
|
|
"setl\nmovfi %[2.reg],%[1.ind]\nseti"
|
|
samecc | | |
|
|
... | register source2 source2 |
|
|
INDSTORE
|
|
move(%[2],{regdef2,%[1]})
|
|
move(%[3],{regind2,%[1],"2"}) | | |
|
|
... | SCR_REG STACK |
|
|
"mov (sp)+,(%[1])+"
|
|
"mov (sp)+,(%[1])"
|
|
erase(%[1]) | | | (4,204)
|
|
sti $1==8 | NC dadres2 DBL_REG |
|
|
INDSTORE
|
|
"movf %[2],*%[1]"
|
|
samecc | | |
|
|
... | NC regconst2 DBL_REG |
|
|
INDSTORE
|
|
"movf %[2],%[1.ind](%[1.reg])"
|
|
samecc | | |
|
|
... | NC ADDR_LOCAL DBL_REG |
|
|
INDSTORE
|
|
"movf %[2],%[1.ind](r5)"
|
|
samecc | | |
|
|
... | NC ADDR_EXTERNAL DBL_REG |
|
|
INDSTORE
|
|
"movf %[2],%[1.ind]"
|
|
samecc | | |
|
|
... | SCR_REG regdef8 |
|
|
INDSTORE
|
|
"mov (%[2.reg]),(%[1])+"
|
|
"mov 2(%[2.reg]),(%[1])+"
|
|
"mov 4(%[2.reg]),(%[1])+"
|
|
"mov 6(%[2.reg]),(%[1])"
|
|
erase(%[1]) | | |
|
|
... | SCR_REG regind8 |
|
|
INDSTORE
|
|
"mov %[2.ind](%[2.reg]),(%[1])+"
|
|
"mov 2+%[2.ind](%[2.reg]),(%[1])+"
|
|
"mov 4+%[2.ind](%[2.reg]),(%[1])+"
|
|
"mov 6+%[2.ind](%[2.reg]),(%[1])"
|
|
erase(%[1]) | | |
|
|
... | SCR_REG relative8 |
|
|
INDSTORE
|
|
allocate(REG={ADDR_EXTERNAL,%[2.ind]})
|
|
"mov (%[a])+,(%[1])+"
|
|
"mov (%[a])+,(%[1])+"
|
|
"mov (%[a])+,(%[1])+"
|
|
"mov (%[a]),(%[1])"
|
|
erase(%[1]) erase(%[a]) | | |
|
|
... | SCR_REG |
|
|
remove(all)
|
|
"mov (sp)+,(%[1])+"
|
|
"mov (sp)+,(%[1])+"
|
|
"mov (sp)+,(%[1])+"
|
|
"mov (sp)+,(%[1])"
|
|
erase(%[1]) | | | (8,408)
|
|
sti | SCR_REG |
|
|
remove(all)
|
|
allocate(REG={CONST2,$1/2})
|
|
"1:\tmov (sp)+,(%[1])+"
|
|
"sob %[a],1b"
|
|
erase(%[1]) erase(%[a]) | | | (8,150+$1*82)
|
|
lal sti $2>2 && $2<=8 | NC xsource2 | | %[1] | stl $1 lal $1+2 sti $2-2 |
|
|
... | | | {ADDR_LOCAL,$1} | sti $2 |
|
|
sts $1==2 | |
|
|
remove(all)
|
|
"mov (sp)+,r0"
|
|
"mov (sp)+,r1"
|
|
"jsr pc,sto2~"
|
|
erase(r01) | | |
|
|
sdl | NC FLT_REG |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1+2 && %[ind]+%[size] > $1)
|
|
move(%[1],{LOCAL4,$1,4}) | | |
|
|
... | NC ftolong |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1+2 && %[ind]+%[size] > $1)
|
|
"setl\nmovfi %[1.reg],$1(r5)\nseti"
|
|
samecc | | |
|
|
... | source2 source2 |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1+2 && %[ind]+%[size] > $1)
|
|
move(%[1],{LOCAL2,$1,2})
|
|
move(%[2],{LOCAL2,$1+2,2}) | | |
|
|
sde | NC FLT_REG |
|
|
remove(posextern)
|
|
move(%[1],{relative4,$1}) | | |
|
|
... | NC ftolong |
|
|
remove(posextern)
|
|
"setl\nmovfi %[1.reg],$1\nseti"
|
|
samecc | | |
|
|
... | source2 source2 |
|
|
remove(posextern)
|
|
move(%[1], {relative2, $1 })
|
|
move(%[2], {relative2, $1+"+2" }) | | |
|
|
sdf | NC regconst2 FLT_REG |
|
|
INDSTORE
|
|
move(%[2],{regind4,%[1.reg],tostring($1)+"+"+%[1.ind]}) | | |
|
|
... | NC regconst2 ftolong |
|
|
INDSTORE
|
|
"setl\nmovfi %[2.reg],$1+%[1.ind](%[1.reg])\nseti"
|
|
samecc | | |
|
|
... | NC ADDR_EXTERNAL FLT_REG |
|
|
INDSTORE
|
|
move(%[2],{relative4,tostring($1)+"+"+%[1.ind]})| | |
|
|
... | NC ADDR_EXTERNAL ftolong |
|
|
INDSTORE
|
|
"setl\nmovfi %[2.reg],$1+%[1.ind]\nseti"
|
|
samecc | | |
|
|
... | regconst2 source2 source2 |
|
|
INDSTORE
|
|
move(%[2],{regind2,%[1.reg],tostring($1)+"+"+%[1.ind]})
|
|
move(%[3],{regind2,%[1.reg],tostring($1+2)+"+"+%[1.ind]}) | | |
|
|
... | ADDR_EXTERNAL source2 source2 |
|
|
INDSTORE
|
|
move(%[2],{relative2,tostring($1)+"+"+%[1.ind]})
|
|
move(%[3],{relative2,tostring($1+2)+"+"+%[1.ind]}) | | |
|
|
|
|
/****************************************************************
|
|
* Group 3 : Integer arithmetic. *
|
|
* *
|
|
* Implemented (sometimes with the use of subroutines) : *
|
|
* all 2 and 4 byte arithmetic. *
|
|
****************************************************************/
|
|
|
|
adi $1==2 | NC SCR_REG CONST2 | | {regconst2,%[1],tostring(%[2.num])} | |
|
|
... | NC SCR_REG ADDR_EXTERNAL | | {regconst2,%[1],%[2.ind]} | |
|
|
... | NC SCR_REG ADDR_LOCAL |
|
|
"add r5,%[1]" erase(%[1]) |
|
|
{regconst2,%[1],tostring(%[2.ind])} | | (2,45)
|
|
... | NC register ADDR_LOCAL |
|
|
allocate(REG)
|
|
"mov r5,%[a]"
|
|
"add %[1],%[a]"
|
|
erase(%[a]) | {regconst2,%[a],tostring(%[2.ind])} | | (4,90)
|
|
... | NC SCR_REG regconst2 |
|
|
"add %[2.reg],%[1]" erase(%[1]) |
|
|
{regconst2,%[1],%[2.ind]} | | (2,45)
|
|
... | NC CONST2+ADDR_EXTERNAL+ADDR_LOCAL+regconst2 SCR_REG |
|
|
| %[1] %[2] | adi 2 |
|
|
... | NC source2-register CONST2+ADDR_EXTERNAL+ADDR_LOCAL |
|
|
allocate(%[1],REG=%[1]) | %[2] %[a] | adi 2 |
|
|
... | NC source1 CONST2+ADDR_EXTERNAL+ADDR_LOCAL |
|
|
allocate(REG={CONST2, 0})
|
|
"bisb %[1],%[a]"
|
|
erase(%[a]) | %[2] %[a] | adi 2 |
|
|
... | NC regconst2 CONST2 | |
|
|
{regconst2,%[1.reg],
|
|
tostring(%[2.num])+"+"+%[1.ind]} | |
|
|
... | NC regconst2 ADDR_EXTERNAL | |
|
|
{regconst2,%[1.reg],
|
|
%[2.ind]+"+"+%[1.ind]} | |
|
|
... | NC regconst2 ADDR_LOCAL |
|
|
"add r5,%[1.reg]" erase(%[1.reg]) |
|
|
{regconst2,%[1.reg],
|
|
tostring(%[2.ind])+"+"+%[1.ind]} | | (2,45)
|
|
... | NC regconst2 regconst2 |
|
|
"add %[2.reg],%[1.reg]" erase(%[1.reg]) |
|
|
{regconst2,%[1.reg],%[2.ind]+"+"+%[1.ind]} | | (2,45)
|
|
... | NC regconst2 noconst2 |
|
|
"add %[2],%[1.reg]" erase(%[1.reg]) | %[1] | | (2,45)+%[2]
|
|
... | NC SCR_REG noconst2 |
|
|
"add %[2],%[1]"
|
|
setcc(%[1]) erase(%[1]) | %[1] | | (2,45)+%[2]
|
|
... | NC source2 regconst2 |
|
|
"add %[1],%[2.reg]"
|
|
erase(%[2.reg]) | %[2] | | (2,45)+%[1]
|
|
... | NC regconst2 source2 |
|
|
"add %[2],%[1.reg]"
|
|
erase(%[1.reg]) | %[1] | | (2,45)+%[2]
|
|
... | source2 SCR_REG |
|
|
"add %[1],%[2]"
|
|
setcc(%[2]) erase(%[2]) | %[2] | | (2,45)+%[1]
|
|
|
|
ldc adi $2==4 && highw(1)==0 | SCR_REG SCR_REG |
|
|
"add $$%(loww(1)%),%[2]"
|
|
"adc %[1]"
|
|
erase(%[1]) erase(%[2]) | %[2] %[1] | |
|
|
ldc adi $2==4 | SCR_REG SCR_REG |
|
|
"add $$%(loww(1)%),%[2]"
|
|
"adc %[1]"
|
|
"add $$%(highw(1)%),%[1]"
|
|
erase(%[1]) erase(%[2]) | %[2] %[1] | |
|
|
adi $1==4 | SCR_REG SCR_REG source2 source2 |
|
|
"add %[4],%[2]"
|
|
"adc %[1]"
|
|
"add %[3],%[1]"
|
|
setcc(%[1]) erase(%[1]) erase(%[2])
|
|
| %[2] %[1] | | (6,120)+%[4]+%[3]
|
|
... | SCR_REG SCR_REG source2 STACK |
|
|
"add (sp)+,%[2]"
|
|
"adc %[1]"
|
|
"add %[3],%[1]"
|
|
setcc(%[1]) erase(%[1]) erase(%[2])
|
|
| %[2] %[1] | | (6,190)+%[3]
|
|
... | SCR_REG SCR_REG STACK |
|
|
"add (sp)+,%[1]"
|
|
"add (sp)+,%[2]"
|
|
"adc %[1]"
|
|
setcc(%[1]) erase(%[1]) erase(%[2])
|
|
| %[2] %[1] | | (6,280)
|
|
... | source2 source2 SCR_REG SCR_REG |
|
|
"add %[2],%[4]"
|
|
"adc %[3]"
|
|
"add %[1],%[3]"
|
|
setcc(%[3]) erase(%[3]) erase(%[4])
|
|
| %[4] %[3] | | (6,120)+%[1]+%[2]
|
|
#ifdef UNTESTED
|
|
adi !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,adi~" | | |
|
|
#endif
|
|
loc sbi $2==2 | | | | loc 0-$1 adi 2 |
|
|
sbi $1==2 | source2 SCR_REG |
|
|
"sub %[1],%[2]"
|
|
setcc(%[2]) erase(%[2]) | %[2] | | (2,45)+%[1]
|
|
... | NC SCR_REG source2-register |
|
|
"sub %[2],%[1]"
|
|
"neg %[1]"
|
|
setcc(%[1]) erase(%[1]) | %[1] | | (4,75)+%[2]
|
|
ldc sbi $2==4 && highw(1)==0 | SCR_REG SCR_REG |
|
|
"sub $$%(loww(1)%),%[2]"
|
|
"sbc %[1]"
|
|
erase(%[1]) erase(%[2]) | %[2] %[1] | |
|
|
ldc sbi $2==4 | SCR_REG SCR_REG |
|
|
"sub $$%(loww(1)%),%[2]"
|
|
"sbc %[1]"
|
|
"sub $$%(highw(1)%),%[1]"
|
|
erase(%[1]) erase(%[2]) | %[2] %[1] | |
|
|
sbi $1==4 | source2-register source2-register SCR_REG SCR_REG |
|
|
"sub %[2],%[4]"
|
|
"sbc %[3]"
|
|
"sub %[1],%[3]"
|
|
setcc(%[3]) erase(%[3]) erase(%[4])
|
|
| %[4] %[3] | | (6,120)+%[1]+%[2]
|
|
... | source2 source2 STACK |
|
|
"sub %[2],2(sp)"
|
|
"sbc (sp)"
|
|
"sub %[1],(sp)" | | | (10,280)+%[1]+%[2]
|
|
#ifdef UNTESTED
|
|
sbi !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,sbi~" | | |
|
|
#endif
|
|
mli $1==2 | SCR_ODD_REG source2 |
|
|
"mul %[2],%[1]"
|
|
setcc(%[1]) erase(%[1]) | %[1] | |(2,330)+%[2]
|
|
... | source2 SCR_ODD_REG |
|
|
"mul %[1],%[2]"
|
|
setcc(%[2]) erase(%[2]) | %[2] | |(2,330)+%[1]
|
|
mli $1==4 | | remove(all)
|
|
"jsr pc,mli4~"
|
|
| r1 r0 | |
|
|
#ifdef UNTESTED
|
|
mli !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,mli~" | | |
|
|
#endif
|
|
dvi $1==2 | source2 source2 |
|
|
allocate(%[2],REG_PAIR)
|
|
"mov %[2],%[a.2]"
|
|
"sxt %[a.1]"
|
|
"div %[1],%[a.1]" | %[a.1] | |
|
|
... | source2 source2 |
|
|
INDSTORE
|
|
"mov %[1],-(sp)"
|
|
"mov %[2],r1"
|
|
"sxt r0"
|
|
"div (sp)+,r0" | r0 | |(100,1000)
|
|
dvi $1==4 | | remove(all)
|
|
"jsr pc,dvi4~" | r1 r0 | |
|
|
#ifdef UNTESTED
|
|
dvi !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,dvi~" | | |
|
|
#endif
|
|
rmi $1==2 | source2 source2 |
|
|
allocate(%[2],REG_PAIR)
|
|
"mov %[2],%[a.2]"
|
|
"sxt %[a.1]"
|
|
"div %[1],%[a.1]" | %[a.2] | |
|
|
... | source2 source2 |
|
|
INDSTORE
|
|
"mov %[1],-(sp)"
|
|
"mov %[2],r1"
|
|
"sxt r0"
|
|
"div (sp)+,r0" | r1 | |(100,1000)
|
|
rmi $1==4 | | remove(all)
|
|
"jsr pc,rmi4~" | r1 r0 | |
|
|
#ifdef UNTESTED
|
|
rmi !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,rmi~" | | |
|
|
#endif
|
|
ngi $1==2 | SCR_REG |
|
|
"neg %[1]"
|
|
setcc(%[1]) erase(%[1]) | %[1] | | (2,75)
|
|
ngi $1==4 | SCR_REG SCR_REG |
|
|
"neg %[1]"
|
|
"neg %[2]"
|
|
"sbc %[1]"
|
|
setcc(%[1]) erase(%[1]) erase(%[2])
|
|
| %[2] %[1] | | (6,180)
|
|
#ifdef UNTESTED
|
|
ngi !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,ngi~" | | |
|
|
#endif
|
|
loc sli $1==1 && $2==2 | SCR_REG |
|
|
"asl %[1]"
|
|
setcc(%[1]) erase(%[1]) | %[1]| |
|
|
sli $1==2 | source2 SCR_REG |
|
|
"ash %[1],%[2]"
|
|
setcc(%[2]) erase(%[2]) | %[2] | |
|
|
sli $1==4 | source2 SCR_REG_PAIR |
|
|
"ashc %[1],%[2]"
|
|
setcc(%[2]) erase(%[2]) | %[2] | |
|
|
#ifdef UNTESTED
|
|
sli !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,sli~" | | |
|
|
#endif
|
|
loc sri $1==1 && $2==2 | SCR_REG |
|
|
"asr %[1]"
|
|
setcc(%[1]) erase(%[1]) | %[1]| |
|
|
loc sri $2==2 | SCR_REG |
|
|
"ash $$%(0-$1%),%[1]"
|
|
setcc(%[1]) erase(%[1]) | %[1]| |
|
|
sri $1==2 | SCR_REG SCR_REG |
|
|
"neg %[1]"
|
|
"ash %[1], %[2]"
|
|
setcc(%[2]) erase(%[1]) erase(%[2]) | %[2] | |
|
|
loc sri $2==4 | SCR_REG_PAIR |
|
|
"ashc $$%(0-$1%),%[1]"
|
|
setcc(%[1]) erase(%[1]) | %[1] | |
|
|
sri $1==4 | SCR_REG SCR_REG_PAIR |
|
|
"neg %[1]"
|
|
"ashc %[1],%[2]"
|
|
setcc(%[2]) erase(%[1]) erase(%[2]) | %[2] | |
|
|
#ifdef UNTESTED
|
|
sri !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,sri~" | | |
|
|
#endif
|
|
|
|
/************************************************
|
|
* Group 4 : unsigned arithmetic *
|
|
* *
|
|
* adu = adi *
|
|
* sbu = sbi *
|
|
* slu = sli *
|
|
* *
|
|
* Supported : 2- and 4 byte arithmetic. *
|
|
************************************************/
|
|
|
|
adu | | | | adi $1 |
|
|
sbu | | | | sbi $1 |
|
|
mlu $1==2 | | | | mli $1 |
|
|
mlu $1==4 | | remove(all)
|
|
"jsr pc,mlu4~" | r1 r0 | |
|
|
#ifdef UNTESTED
|
|
mlu !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,mlu~" | | |
|
|
#endif
|
|
loc dvu $1>0 && $1<=32767 && $2==2 | source2 |
|
|
allocate(%[1],REG_PAIR)
|
|
move(%[1],%[a.2])
|
|
"clr %[a.1]"
|
|
"div $$$1,%[a.1]" | %[a.1] | |
|
|
dvu $1==2 | | remove(all)
|
|
"jsr pc,dvu2~" | r0 | |
|
|
dvu $1==4 | | remove(all)
|
|
"jsr pc,dvu4~" | r1 r0 | |
|
|
#ifdef UNTESTED
|
|
dvu !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,dvu~" | | |
|
|
#endif
|
|
loc rmu $1>0 && $1<=32767 && $2==2 | source2 |
|
|
allocate(%[1],REG_PAIR)
|
|
move(%[1],%[a.2])
|
|
"clr %[a.1]"
|
|
"div $$$1,%[a.1]" | %[a.2] | |
|
|
rmu $1==2 | | remove(all)
|
|
"jsr pc,rmu2~" | r1 | |
|
|
rmu $1==4 | | remove(all)
|
|
"jsr pc,rmu4~" | r1 r0 | |
|
|
#ifdef UNTESTED
|
|
rmu !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,rmu~" | | |
|
|
#endif
|
|
slu | | | | sli $1 |
|
|
loc slu | | | | loc $1 sli $2 |
|
|
sru $1==2 | source2 xsource2 |
|
|
allocate(%[1],%[2],REG=%[1],REG_PAIR)
|
|
move(%[2],%[b.2])
|
|
move({CONST2,0},%[b.1])
|
|
"neg %[a]"
|
|
"ashc %[a],%[b]"
|
|
erase(%[b]) | %[b.2] | |
|
|
loc sru $2==2 | xsource2 |
|
|
allocate(%[1],REG_PAIR)
|
|
move(%[1],%[a.2])
|
|
move({CONST2,0},%[a.1])
|
|
"ashc $$%(0-$1%),%[a]"
|
|
erase(%[a]) | %[a.2] | |
|
|
sru $1==4 | | remove(all)
|
|
move({CONST2,$1},r0)
|
|
"jsr pc,sru~"
|
|
erase(r0) | | |
|
|
#ifdef UNTESTED
|
|
sru !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,sru~" | | |
|
|
#endif
|
|
|
|
/************************************************
|
|
* Group 5 : Floating point arithmetic *
|
|
* *
|
|
* Supported : 4- and 8 byte arithmetic. *
|
|
************************************************/
|
|
|
|
adf $1==4 | FLT_REG SCR_FLT_REG |
|
|
"addf %[1],%[2]"
|
|
samecc erase(%[2]) | %[2] | | (2,500)+%[1]
|
|
... | SCR_FLT_REG FLT_REG |
|
|
"addf %[2],%[1]"
|
|
samecc erase(%[1]) | %[1] | | (2,500)+%[2]
|
|
adf $1==8 | double8 SCR_DBL_REG |
|
|
"addf %[1],%[2]"
|
|
samecc erase(%[2]) | %[2] | | (2,600)+%[1]
|
|
... | SCR_DBL_REG double8 |
|
|
"addf %[2],%[1]"
|
|
samecc erase(%[1]) | %[1] | | (2,600)+%[2]
|
|
#ifdef UNTESTED
|
|
adf !defined($1)| source2 |
|
|
remove(ALL)
|
|
move(%[1],r0)
|
|
"jsr pc,adf~" | | |
|
|
#endif
|
|
sbf $1==4 | FLT_REG SCR_FLT_REG |
|
|
"subf %[1],%[2]"
|
|
samecc erase(%[2]) | %[2] | | (2,500)+%[1]
|
|
sbf $1==8 | double8 SCR_DBL_REG |
|
|
"subf %[1],%[2]"
|
|
samecc erase(%[2]) | %[2] | | (2,600)+%[1]
|
|
#ifdef UNTESTED
|
|
sbf !defined($1)| source2 |
|
|
remove(ALL)
|
|
move(%[1],r0)
|
|
"jsr pc,sbf~" | | |
|
|
#endif
|
|
mlf $1==4 | FLT_REG SCR_FLT_REG |
|
|
"mulf %[1],%[2]"
|
|
samecc erase(%[2]) | %[2] | | (2,700)+%[1]
|
|
... | SCR_FLT_REG FLT_REG |
|
|
"mulf %[2],%[1]"
|
|
samecc erase(%[1]) | %[1] | | (2,700)+%[2]
|
|
mlf $1==8 | double8 SCR_DBL_REG |
|
|
"mulf %[1],%[2]"
|
|
samecc erase(%[2]) | %[2] | | (2,1000)+%[1]
|
|
... | SCR_DBL_REG double8 |
|
|
"mulf %[2],%[1]"
|
|
samecc erase(%[1]) | %[1] | | (2,1000)+%[2]
|
|
#ifdef UNTESTED
|
|
mlf !defined($1)| source2 |
|
|
remove(ALL)
|
|
move(%[1],r0)
|
|
"jsr pc,mlf~" | | |
|
|
#endif
|
|
dvf $1==4 | FLT_REG SCR_FLT_REG |
|
|
"divf %[1],%[2]"
|
|
samecc erase(%[2]) | %[2] | | (2,800)+%[1]
|
|
dvf $1==8 | double8 SCR_DBL_REG |
|
|
"divf %[1],%[2]"
|
|
samecc erase(%[2]) | %[2] | | (2,1200)+%[1]
|
|
#ifdef UNTESTED
|
|
dvf !defined($1)| source2 |
|
|
remove(ALL)
|
|
move(%[1],r0)
|
|
"jsr pc,dvf~" | | |
|
|
#endif
|
|
ngf $1==4 | SCR_FLT_REG |
|
|
"negf %[1]"
|
|
samecc erase(%[1]) | %[1] | |(2,270)
|
|
ngf $1==8 | SCR_DBL_REG |
|
|
"negf %[1]"
|
|
samecc erase(%[1]) | %[1] | |(2,270)
|
|
#ifdef UNTESTED
|
|
ngf !defined($1)| source2 |
|
|
remove(ALL)
|
|
move(%[1],r0)
|
|
"jsr pc,ngf~" | | |
|
|
#endif
|
|
fif $1==4 | longf4 FLT_REG |
|
|
allocate(FLT_REG_PAIR)
|
|
move(%[1],%[a.1])
|
|
"modf %[2],%[a]"
|
|
samecc erase(%[a.1]) | %[a.1] %[a.2] | | (2,750)+%[2]
|
|
fif $1==8 | double8 double8 |
|
|
allocate(DBL_REG_PAIR)
|
|
move(%[1],%[a.1])
|
|
"modf %[2],%[a]"
|
|
samecc erase(%[a.1]) | %[a.1] %[a.2] | | (2,1500)+%[2]
|
|
#ifdef UNTESTED
|
|
fif !defined($1)| source2 |
|
|
remove(ALL)
|
|
move(%[1],r0)
|
|
"jsr pc,fif~" | | |
|
|
#endif
|
|
fef $1==4 | FLT_REG |
|
|
allocate(REG)
|
|
"movei %[1],%[a]"
|
|
"movie $$0,%[1]"
|
|
samecc
|
|
erase(%[1]) |%[1] %[a] | | (4,500)
|
|
fef $1==8 | DBL_REG |
|
|
allocate(REG)
|
|
"movei %[1],%[a]"
|
|
"movie $$0,%[1]"
|
|
samecc
|
|
erase(%[1]) |%[1] %[a] | | (4,500)
|
|
#ifdef UNTESTED
|
|
fef !defined($1)| source2 |
|
|
remove(ALL)
|
|
move(%[1],r0)
|
|
"jsr pc,fef~" | | |
|
|
#endif
|
|
|
|
/****************************************
|
|
* Group 6 : pointer arithmetic. *
|
|
* *
|
|
* Pointers have size 2 bytes. *
|
|
****************************************/
|
|
|
|
adp | SCR_REG | | {regconst2, %[1], tostring($1)} | |
|
|
... | NC regconst2 | | {regconst2, %[1.reg], tostring($1)+"+"+%[1.ind]} | |
|
|
... | NC ADDR_EXTERNAL | | {ADDR_EXTERNAL, tostring($1)+"+"+%[1.ind]} | |
|
|
... | NC ADDR_LOCAL | | {ADDR_LOCAL,%[1.ind]+$1} | |
|
|
ads $1==2 | | | | adi $1 |
|
|
sbs $1==2 | | | | sbi $1 |
|
|
|
|
/****************************************
|
|
* Group 7 : increment/decrement/zero *
|
|
****************************************/
|
|
|
|
inc | SCR_REG |
|
|
"inc %[1]"
|
|
setcc(%[1]) erase(%[1]) | %[1] | |
|
|
#ifdef REGVARS
|
|
inl inreg($1)==2| | remove(regvar($1))
|
|
"inc %(regvar($1)%)"
|
|
erase(regvar($1)) | | |
|
|
#endif
|
|
inl | | remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"inc $1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
ldl ldc adi sdl $1==$4 && $3==4 && highw(2)==0 | |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"add $$%(loww(2)%),2+$1(r5)"
|
|
"adc $1(r5)" | | |
|
|
ldl ldc adi sdl $1==$4 && $3==4 | |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"add $$%(loww(2)%),2+$1(r5)"
|
|
"adc $1(r5)"
|
|
"add $$%(highw(2)%),$1(r5)" | | |
|
|
ine | | remove(posextern)
|
|
"inc $1"
|
|
setcc({relative2,$1}) | | |
|
|
lde ldc adi sde $1==$4 && $3==4 && highw(2)==0 | |
|
|
remove(posextern)
|
|
"add $$%(loww(2)%),2+$1"
|
|
"adc $1" | | |
|
|
lde ldc adi sde $1==$4 && $3==4 | |
|
|
remove(posextern)
|
|
"add $$%(loww(2)%),2+$1"
|
|
"adc $1"
|
|
"add $$%(highw(2)%),$1" | | |
|
|
dec | SCR_REG |
|
|
"dec %[1]"
|
|
setcc(%[1]) erase(%[1]) | %[1] | |
|
|
#ifdef REGVARS
|
|
del inreg($1)==2| | remove(regvar($1))
|
|
"dec %(regvar($1)%)"
|
|
erase(regvar($1)) | | |
|
|
#endif
|
|
del | | remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"dec $1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
dee | | remove(posextern)
|
|
"dec $1"
|
|
setcc({relative2,$1}) | | | (4,90)
|
|
|
|
#ifdef REGVARS
|
|
lol loc sbi stl $1==$4 && $3==2 && inreg($1)==2 | |
|
|
remove(regvar($1))
|
|
"sub $$$2,%(regvar($1)%)"
|
|
erase(regvar($1)) | | |
|
|
lol ngi stl $1==$3 && $2==2 && inreg($1)==2 | |
|
|
remove(regvar($1))
|
|
"neg %(regvar($1)%)"
|
|
erase(regvar($1)) | | |
|
|
lil ngi sil $1==$3 && $2==2 && inreg($1)==2 | |
|
|
INDSTORE
|
|
"neg *%(regvar($1)%)" | | |
|
|
lil inc sil $1==$3 && inreg($1)==2 | | INDSTORE
|
|
"inc *%(regvar($1)%)"
|
|
setcc({regdef2, regvar($1)}) | | |
|
|
lil dec sil $1==$3 && inreg($1)==2 | | INDSTORE
|
|
"dec *%(regvar($1)%)"
|
|
setcc({regdef2, regvar($1)}) | | |
|
|
lol adi stl $2==2 && $1==$3 && inreg($1)==2 | source2 |
|
|
remove(regvar($1))
|
|
"add %[1],%(regvar($1)%)"
|
|
erase(regvar($1)) | | |
|
|
lol lol adp stl loi $1==$2 && $2==$4 && inreg($1)==2 && $3==1 && $5==1 | |
|
|
allocate(REG={CONST2, 0})
|
|
remove(regvar($1))
|
|
"bisb (%(regvar($1)%))+,%[a]"
|
|
erase(%[a]) | %[a] | |
|
|
lol lol adp stl loi loc loc cii $1==$2 && $2==$4 && inreg($1)==2 && $3==1 && $5==1 && $6==1 && $7==2 | |
|
|
allocate(REG)
|
|
remove(regvar($1))
|
|
"movb (%(regvar($1)%))+,%[a]"
|
|
erase(%[a]) | %[a] | |
|
|
lol lol adp stl loi $1==$2 && $2==$4 && inreg($1)==2 && $3==2 && $5==2 | |
|
|
allocate(REG)
|
|
remove(regvar($1))
|
|
"mov (%(regvar($1)%))+,%[a]" | %[a] | |
|
|
lol sti lol adp stl $1==$3 && $3==$5 && inreg($1)==2 && $2==1 && $4==1 | source1or2|
|
|
remove(regvar($1))
|
|
"movb %[1],(%(regvar($1)%))+" | | |
|
|
sil lol adp stl $1==$2 && $2==$4 && inreg($1)==2 && $3==2 | source2 |
|
|
remove(regvar($1))
|
|
"mov %[1],(%(regvar($1)%))+" | | |
|
|
lol lol adp stl $1==$2 && $2==$4 && inreg($1)==2 | |
|
|
allocate(REG=regvar($1)) | %[a]
|
|
| lol $2 adp $3 stl $2 |
|
|
lol lol adp stl $1==$2 && $2==$4 | |
|
|
allocate(REG={LOCAL2, $1, 2}) | %[a]
|
|
| lol $2 adp $3 stl $2 |
|
|
lol inl $1==$2 && inreg($1)==2 | |
|
|
allocate(REG=regvar($1)) | %[a]
|
|
| inl $2 |
|
|
lol inl $1==$2 | |
|
|
allocate(REG={LOCAL2, $1, 2}) | %[a]
|
|
| inl $2 |
|
|
lol del $1==$2 && inreg($1)==2 | |
|
|
allocate(REG=regvar($1)) | %[a]
|
|
| del $2 |
|
|
lol del $1==$2 | |
|
|
allocate(REG={LOCAL2, $1, 2}) | %[a]
|
|
| del $2 |
|
|
lol adp stl $1==$3 && $2==1 && inreg($1)==2 | |
|
|
remove(regvar($1))
|
|
"inc %(regvar($1)%)"
|
|
erase(regvar($1)) | | |
|
|
lol adp stl $1==$3 && $2==0-1 && inreg($1)==2 | |
|
|
remove(regvar($1))
|
|
"dec %(regvar($1)%)"
|
|
erase(regvar($1)) | | |
|
|
lol adp stl $1==$3 && inreg($1)==2 | |
|
|
remove(regvar($1))
|
|
"add $$$2,%(regvar($1)%)"
|
|
erase(regvar($1)) | | |
|
|
lil lil adp sil $2==$4 && inreg($1)==2 | |
|
|
allocate(REG={regdef2, regvar($1)})
|
|
| %[a] | lil $2 adp $3 sil $2 |
|
|
lil adp sil $1==$3 && $2==1 && inreg($1)==2 | |
|
|
INDSTORE
|
|
"inc *%(regvar($1)%)" | | |
|
|
lil adp sil $1==$3 && $2==0-1 && inreg($1)==2 | |
|
|
INDSTORE
|
|
"dec *%(regvar($1)%)" | | |
|
|
lil adp sil $1==$3 && inreg($1)==2 | |
|
|
INDSTORE
|
|
"add $$$2,*%(regvar($1)%)" | | |
|
|
lol lof inc lol stf $1==$4 && $2==$5 && inreg($1)==2 | |
|
|
INDSTORE
|
|
"inc $2(%(regvar($1)%))"
|
|
setcc({regind2, regvar($1), tostring($2)}) | | |
|
|
lol lof dec lol stf $1==$4 && $2==$5 && inreg($1)==2 | |
|
|
INDSTORE
|
|
"dec $2(%(regvar($1)%))"
|
|
setcc({regind2, regvar($1), tostring($2)}) | | |
|
|
lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==2 && $3==1 | |
|
|
INDSTORE
|
|
"inc $2(%(regvar($1)%))"
|
|
setcc({regind2, regvar($1), tostring($2)}) | | |
|
|
lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==2 && $3==0-1 | |
|
|
INDSTORE
|
|
"dec $2(%(regvar($1)%))"
|
|
setcc({regind2, regvar($1), tostring($2)}) | | |
|
|
lol lof adp lol stf $1==$4 && $2==$5 && inreg($1)==2 | |
|
|
INDSTORE
|
|
"add $3,$2(%(regvar($1)%))"
|
|
setcc({regind2, regvar($1), tostring($2)}) | | |
|
|
#endif
|
|
lol loc sbi stl $1==$4 && $3==2 | |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"sub $$$2,$1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
lol ngi stl $1==$3 && $2==2 | |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"neg $1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
lil ngi sil $1==$3 && $2==2 | | INDSTORE
|
|
"neg *$1(r5)" | | |
|
|
lil inc sil $1==$3 | | INDSTORE
|
|
"inc *$1(r5)"
|
|
setcc({reginddef2, lb, tostring($1)}) | | |
|
|
lil dec sil $1==$3 | | INDSTORE
|
|
"dec *$1(r5)"
|
|
setcc({reginddef2, lb, tostring($1)}) | | |
|
|
lol adi stl $2==2 && $1==$3 | source2 |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"add %[1],$1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
lol adp stl $1==$3 && $2==1 | |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"inc $1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
lol adp stl $1==$3 && $2==0-1 | |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"dec $1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
lol adp stl $1==$3 | |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"add $$$2,$1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
lil lil adp sil $2==$4 | |
|
|
allocate(REG={reginddef2, lb, tostring($1)})
|
|
| %[a] | lil $2 adp $3 sil $2 |
|
|
lil adp sil $1==$3 && $2==1 | |
|
|
INDSTORE
|
|
"inc *$1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
lil adp sil $1==$3 && $2==0-1 | |
|
|
INDSTORE
|
|
"dec *$1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
lil adp sil $1==$3 | |
|
|
INDSTORE
|
|
"add $$$2,*$1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
loe adi ste $2==2 && $1==$3 | source2 |
|
|
remove(posextern)
|
|
"add %[1],$1"
|
|
setcc({relative2,$1}) | | |
|
|
loe adp ste $1==$3 && $2==1 | |
|
|
remove(posextern)
|
|
"inc $1"
|
|
setcc({relative2,$1}) | | |
|
|
loe adp ste $1==$3 && $2==0-1 | |
|
|
remove(posextern)
|
|
"dec $1"
|
|
setcc({relative2,$1}) | | |
|
|
loe adp ste $1==$3 | |
|
|
remove(posextern)
|
|
"add $$$2,$1"
|
|
setcc({relative2,$1}) | | |
|
|
loe loi loe loi adp loe sti $3==$6 && $2==2 && $4==2 && $7==2 | |
|
|
allocate(REG={reldef2, $1})
|
|
| %[a] | loe $3 loi $4 adp $5 loe $6 sti $7 |
|
|
loe loi adp loe sti $1==$4 && $2==2 && $5==2 && $3==1 | |
|
|
INDSTORE
|
|
"inc *$1"
|
|
setcc({reldef2,$1}) | | |
|
|
loe loi adp loe sti $1==$4 && $2==2 && $5==2 && $3==0-1 | |
|
|
INDSTORE
|
|
"dec *$1"
|
|
setcc({reldef2,$1}) | | |
|
|
loe loi adp loe sti $1==$4 && $2==2 && $5==2 | |
|
|
INDSTORE
|
|
"add $$$3,*$1"
|
|
setcc({reldef2,$1}) | | |
|
|
lol lof inc lol stf $1==$4 && $2==$5 | |
|
|
INDSTORE
|
|
allocate(REG={LOCAL2, $1, 2})
|
|
"inc $2(%[a])"
|
|
setcc({regind2, %[a], tostring($2)}) | | |
|
|
lol lof dec lol stf $1==$4 && $2==$5 | |
|
|
INDSTORE
|
|
allocate(REG={LOCAL2, $1, 2})
|
|
"dec $2(%[a])"
|
|
setcc({regind2, %[a], tostring($2)}) | | |
|
|
lol lof adp lol stf $1==$4 && $2==$5 && $3==1 | |
|
|
INDSTORE
|
|
allocate(REG={LOCAL2, $1, 2})
|
|
"inc $2(%[a])"
|
|
setcc({regind2, %[a], tostring($2)}) | | |
|
|
lol lof adp lol stf $1==$4 && $2==$5 && $3==0-1 | |
|
|
INDSTORE
|
|
allocate(REG={LOCAL2, $1, 2})
|
|
"dec $2(%[a])"
|
|
setcc({regind2, %[a], tostring($2)}) | | |
|
|
lol lof adp lol stf $1==$4 && $2==$5 | |
|
|
INDSTORE
|
|
allocate(REG={LOCAL2, $1, 2})
|
|
"add $3,$2(%[a])"
|
|
setcc({regind2, %[a], tostring($2)}) | | |
|
|
loe lof inc loe stf $1==$4 && $2==$5 | |
|
|
INDSTORE
|
|
allocate(REG={relative2, $1})
|
|
"inc $2(%[a])"
|
|
setcc({regind2, %[a], tostring($2)}) | | |
|
|
loe lof dec loe stf $1==$4 && $2==$5 | |
|
|
INDSTORE
|
|
allocate(REG={relative2, $1})
|
|
"dec $2(%[a])"
|
|
setcc({regind2, %[a], tostring($2)}) | | |
|
|
loe lof adp loe stf $1==$4 && $2==$5 && $3==1 | |
|
|
INDSTORE
|
|
allocate(REG={relative2, $1})
|
|
"inc $2(%[a])"
|
|
setcc({regind2, %[a], tostring($2)}) | | |
|
|
loe lof adp loe stf $1==$4 && $2==$5 && $3==0-1 | |
|
|
INDSTORE
|
|
allocate(REG={relative2, $1})
|
|
"dec $2(%[a])"
|
|
setcc({regind2, %[a], tostring($2)}) | | |
|
|
loe lof adp loe stf $1==$4 && $2==$5 | |
|
|
INDSTORE
|
|
allocate(REG={relative2, $1})
|
|
"add $3,$2(%[a])"
|
|
setcc({regind2, %[a], tostring($2)}) | | |
|
|
loe ine $1==$2 | |
|
|
allocate(REG={relative2, $1}) | %[a]
|
|
| ine $2 |
|
|
loe dee $1==$2 | |
|
|
allocate(REG={relative2, $1}) | %[a]
|
|
| dee $2 |
|
|
loe loe adp ste $1==$2 && $2==$4 | |
|
|
allocate(REG={relative2, $1}) | %[a]
|
|
| loe $2 adp $3 ste $2 |
|
|
#ifdef REGVARS
|
|
lol ior stl $2==2 && $1==$3 && inreg($1)==2 | source2 |
|
|
remove(regvar($1))
|
|
"bis %[1],%(regvar($1)%)"
|
|
erase(regvar($1)) | | |
|
|
#endif
|
|
lol ior stl $2==2 && $1==$3 | source2 |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"bis %[1],$1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
loe ior ste $2==2 && $1==$3 | source2 |
|
|
remove(posextern)
|
|
"bis %[1],$1"
|
|
setcc({relative2,$1}) | | |
|
|
#ifdef REGVARS
|
|
lol and stl $2==2 && $1==$3 && inreg($1)==2 | SCR_REG |
|
|
remove(regvar($1))
|
|
"com %[1]"
|
|
"bic %[1],%(regvar($1)%)"
|
|
erase(%[1])
|
|
erase(regvar($1)) | | |
|
|
#endif
|
|
lol and stl $2==2 && $1==$3 | SCR_REG |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"com %[1]"
|
|
"bic %[1],$1(r5)"
|
|
erase(%[1])
|
|
setcc({LOCAL2,$1,2}) | | |
|
|
loe and ste $2==2 && $1==$3 | SCR_REG |
|
|
remove(posextern)
|
|
"com %[1]"
|
|
"bic %[1],$1"
|
|
erase(%[1])
|
|
setcc({relative2,$1}) | | |
|
|
#ifdef REGVARS
|
|
loc lol and stl $3==2 && $2==$4 && inreg($2)==2 | |
|
|
remove(regvar($2))
|
|
"bic $$%(~$1%),%(regvar($2)%)"
|
|
erase(regvar($2)) | | |
|
|
#endif
|
|
loc lol and stl $3==2 && $2==$4 | |
|
|
remove(indordef)
|
|
remove(locals, %[ind] <= $2 && %[ind]+%[size] > $2)
|
|
"bic $$%(~$1%),$2(r5)"
|
|
setcc({LOCAL2,$2,2}) | | |
|
|
loc loe and ste $3==2 && $2==$4 | |
|
|
remove(posextern)
|
|
"bic $$%(~$1%),$2"
|
|
setcc({relative2,$2}) | | |
|
|
#ifdef REGVARS
|
|
zrl inreg($1)==2| | remove(regvar($1))
|
|
"clr %(regvar($1)%)"
|
|
erase(regvar($1)) | | | (4,90)
|
|
#endif
|
|
zrl | | remove(indordef)
|
|
remove(locals, %[ind] <= $1 && %[ind]+%[size] > $1)
|
|
"clr $1(r5)"
|
|
setcc({LOCAL2,$1,2}) | | | (4,90)
|
|
zre | | remove(posextern)
|
|
"clr $1"
|
|
setcc({relative2,$1}) | | | (4,90)
|
|
zrf $1==4 | | allocate(FLT_REG)
|
|
"clrf %[a]" | %[a] | | (2,220)
|
|
zrf $1==8 | | allocate(DBL_REG)
|
|
"clrf %[a]" | %[a] | | (2,240)
|
|
zrf !defined($1)| | | | zer |
|
|
zrf defined($1) | | | | zer $1 |
|
|
zer $1==2 | | | {CONST2, 0} | |
|
|
zer $1==4 | | | {CONST2,0} {CONST2,0} | |
|
|
zer $1==6 | | | {CONST2,0} {CONST2,0}
|
|
{CONST2,0} | |
|
|
zer $1==8 | | | {CONST2,0} {CONST2,0}
|
|
{CONST2, 0} {CONST2,0} | |
|
|
zer defined($1) | | remove(all)
|
|
move({CONST2,$1/2},r0)
|
|
"1:\tclr -(sp)"
|
|
"sob r0,1b"
|
|
erase(r0) | | |(8,150+$1*37)
|
|
zer !defined($1)| SCR_REG |
|
|
remove(all)
|
|
"asr %[1]"
|
|
"1:\tclr -(sp)"
|
|
"sob %[1],1b"
|
|
erase(%[1]) | | |
|
|
|
|
/****************************************
|
|
* Group 8 : Convert instructions *
|
|
****************************************/
|
|
|
|
#ifdef UNTESTED
|
|
cii | | remove(all)
|
|
"jsr pc,cii~" | | |
|
|
cfi | | | | cfu |
|
|
cfu | | remove(ALL)
|
|
"jsr pc,cfi~" | | |
|
|
cif | | remove(ALL)
|
|
"jsr pc,cif~" | | |
|
|
cuf | | remove(ALL)
|
|
"jsr pc,cuf~" | | |
|
|
cff | | remove(ALL)
|
|
"jsr pc,cff~" | | |
|
|
ciu | | | | cuu |
|
|
cui | | | | cuu |
|
|
cuu | | remove(all)
|
|
"jsr pc,cuu~" | | |
|
|
#endif
|
|
|
|
loc loc cii $1==1 && $2==2 | source1or2 |
|
|
allocate(%[1],REG)
|
|
"movb %[1],%[a]"
|
|
/* movb does sign extend if dest is register */
|
|
| %[a] | |
|
|
loc loc cii $1==1 && $2==4 | source1or2 |
|
|
allocate(%[1],REG,REG)
|
|
"movb %[1],%[a]"
|
|
"sxt %[b]"
|
|
| %[a] %[b] | |
|
|
loc loc cii $1==2 && $2==4 | source2 |
|
|
allocate(%[1],REG,REG)
|
|
move(%[1],%[a])
|
|
test(%[a])
|
|
"sxt %[b]"
|
|
| %[a] %[b] | |
|
|
loc loc loc cii $1>=0 && $2==2 && $3==4 | | | | loc $1 loc 0 |
|
|
loc loc loc cii $1< 0 && $2==2 && $3==4 | | | | loc $1 loc 0-1 |
|
|
loc loc cii $1==4 && $2==2 | source2 source2 | | %[2] | |
|
|
loc loc ciu | | | | loc $1 loc $2 cuu |
|
|
loc loc cui | | | | loc $1 loc $2 cuu |
|
|
loc loc cuu $1==2 && $2==4 | | | {CONST2,0} | |
|
|
loc loc cuu $1==4 && $2==2 | source2 | | | |
|
|
loc loc cuu $1==$2 | | | | |
|
|
loc loc cfu $1==4 | FLT_REG | | {ftolong,%[1]} | loc 4 loc $2 cuu |
|
|
loc loc cfu $1==8 | DBL_REG | | {ftolong,%[1]} | loc 4 loc $2 cuu |
|
|
loc loc cfi $1==4 && $2==2 | FLT_REG | | {ftoint,%[1]} | |
|
|
loc loc cfi $1==4 && $2==4 | FLT_REG | | {ftolong,%[1]} | |
|
|
loc loc cfi $1==8 && $2==2 | DBL_REG | | {ftoint,%[1]} | |
|
|
loc loc cfi $1==8 && $2==4 | DBL_REG | | {ftolong,%[1]} | |
|
|
loc loc cif $1==2 && $2==4 | source2 |
|
|
allocate(FLT_REG)
|
|
"movif %[1],%[a]"
|
|
samecc
|
|
| %[a] | |
|
|
loc loc cif $1==2 && $2==8 | source2 |
|
|
allocate(DBL_REG)
|
|
"movif %[1],%[a]"
|
|
samecc
|
|
| %[a] | |
|
|
loc loc cif $1==4 && $2==4 | NC long4-REG_PAIR |
|
|
allocate(FLT_REG)
|
|
"setl"
|
|
"movif %[1],%[a]"
|
|
"seti"
|
|
samecc
|
|
| %[a] | |
|
|
... | | remove(all)
|
|
allocate(FLT_REG)
|
|
"setl"
|
|
"movif (sp)+,%[a]"
|
|
"seti"
|
|
samecc
|
|
| %[a] | |
|
|
loc loc cif $1==4 && $2==8 | NC long4-REG_PAIR |
|
|
allocate(DBL_REG)
|
|
"setl"
|
|
"movif %[1],%[a]"
|
|
"seti"
|
|
samecc
|
|
| %[a] | |
|
|
... | | remove(all)
|
|
allocate(DBL_REG)
|
|
"setl"
|
|
"movif (sp)+,%[a]"
|
|
"seti"
|
|
samecc
|
|
| %[a] | |
|
|
loc loc cuf $1==2 && $2==4 | |
|
|
remove(all)
|
|
allocate(FLT_REG)
|
|
"clr -(sp)"
|
|
"setl"
|
|
"movif (sp)+,%[a]"
|
|
"seti"
|
|
| %[a] | |
|
|
loc loc cuf $1==2 && $2==8 | |
|
|
remove(all)
|
|
allocate(DBL_REG)
|
|
"clr -(sp)"
|
|
"setl"
|
|
"movif (sp)+,%[a]"
|
|
"seti"
|
|
| %[a] | |
|
|
loc loc cuf $1==4 && ($2==8 || $2==4) | | | | loc $1 loc $2 cif |
|
|
loc loc cff $1==4 && $2==8 | longf4 - FLT_REG |
|
|
allocate(DBL_REG)
|
|
"movof %[1],%[a]"
|
|
samecc
|
|
| %[a] | |
|
|
... | FLT_REG |
|
|
allocate(DBL_REG)
|
|
move(%[1],%[a.1])
|
|
samecc | %[a] | |
|
|
loc loc cff $1==8 && $2==4 | DBL_REG | | %[1.1] | |
|
|
|
|
/****************************************
|
|
* Group 9 : Logical instructions *
|
|
****************************************/
|
|
|
|
and $1==2 | CONST2 SCR_REG |
|
|
"bic $$%(~%[1.num]%),%[2]"
|
|
setcc(%[2])
|
|
erase(%[2]) | %[2] | | (4,75)
|
|
... | SCR_REG CONST2 |
|
|
"bic $$%(~%[2.num]%),%[1]"
|
|
setcc(%[1])
|
|
erase(%[1]) | %[1] | | (4,75)
|
|
... | SCR_REG SCR_REG |
|
|
"com %[1]"
|
|
"bic %[1],%[2]"
|
|
setcc(%[2])
|
|
erase(%[1]) erase(%[2]) | %[2] | | (4,60)
|
|
ldc and $2==4 && highw(1)==0 | source2 SCR_REG |
|
|
"bic $$%(~loww(1)%),%[2]"
|
|
erase(%[2]) | %[2] {CONST2, 0} | |
|
|
ldc and $2==4 && highw(1)==0-1 | source2 SCR_REG |
|
|
"bic $$%(~loww(1)%),%[2]"
|
|
erase(%[2]) | %[2] %[1] | |
|
|
ldc and $2==4 | SCR_REG SCR_REG |
|
|
"bic $$%(~highw(1)%),%[1]"
|
|
"bic $$%(~loww(1)%),%[2]"
|
|
erase(%[1]) erase(%[2]) | %[2] %[1] | |
|
|
and defined($1) | | remove(all)
|
|
move({CONST2,$1}, r0)
|
|
"jsr pc,and~"
|
|
erase(r0) | | |
|
|
and !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,and~"
|
|
erase(r0) | | |
|
|
ior $1==2 | SCR_REG source2 |
|
|
"bis %[2],%[1]"
|
|
setcc(%[1])
|
|
erase(%[1]) | %[1] | | (2,45)+%[2]
|
|
... | source2 SCR_REG |
|
|
"bis %[1],%[2]"
|
|
setcc(%[2])
|
|
erase(%[2]) | %[2] | | (2,45)+%[1]
|
|
ldc ior $2==4 && highw(1)==0 | source2 SCR_REG |
|
|
"bis $$%(loww(1)%),%[2]"
|
|
erase(%[2]) | %[2] %[1] | |
|
|
ldc ior $2==4 && highw(1)==0-1 | source2 SCR_REG |
|
|
"bis $$%(loww(1)%),%[2]"
|
|
erase(%[2]) | {CONST2, 0-1} %[1] | |
|
|
ldc ior $2==4 | SCR_REG SCR_REG |
|
|
"bis $$%(highw(1)%),%[1]"
|
|
"bis $$%(loww(1)%),%[2]"
|
|
erase(%[1]) erase(%[2]) | %[2] %[1] | |
|
|
ior $1==8 | NC source2 source2 source2 source2 |
|
|
remove(all)
|
|
"bis %[1],(sp)"
|
|
"bis %[2],2(sp)"
|
|
"bis %[3],4(sp)"
|
|
"bis %[4],6(sp)" | | |
|
|
... | | remove(all)
|
|
allocate(REG={CONST2,$1})
|
|
"add sp,%[a]"
|
|
"bis (sp)+,(%[a])+"
|
|
"bis (sp)+,(%[a])+"
|
|
"bis (sp)+,(%[a])+"
|
|
"bis (sp)+,(%[a])+"
|
|
erase(%[a]) | | |
|
|
ior defined($1) | | remove(all)
|
|
allocate(REG={CONST2,$1},REG={CONST2,$1/2})
|
|
"add sp,%[a]"
|
|
"1:\tbis (sp)+,(%[a])+"
|
|
"sob %[b],1b"
|
|
erase(%[a]) erase(%[b]) | | | (12,210+$1*97)
|
|
ior !defined($1)| SCR_REG |
|
|
remove(all)
|
|
allocate(REG=%[1])
|
|
"asr %[1]"
|
|
"add sp,%[a]"
|
|
"1:\tbis (sp)+,(%[a])+"
|
|
"sob %[1],1b"
|
|
erase(%[1]) erase(%[a]) | | |
|
|
xor $1==2 | register SCR_REG |
|
|
"xor %[1],%[2]"
|
|
setcc(%[2])
|
|
erase(%[2]) | %[2] | | (2,30)
|
|
... | SCR_REG register |
|
|
"xor %[2],%[1]"
|
|
setcc(%[1])
|
|
erase(%[1]) | %[1] | | (2,30)
|
|
xor defined($1) | | remove(all)
|
|
move({CONST2,$1},r0)
|
|
"jsr pc,xor~"
|
|
erase(r0) | | |
|
|
xor !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,xor~"
|
|
erase(r0) | | |
|
|
com $1==2 | SCR_REG |
|
|
"com %[1]"
|
|
setcc(%[1])
|
|
erase(%[1]) | %[1] | | (2,30)
|
|
com defined($1) | | remove(all)
|
|
allocate(REG={CONST2,$1/2},REG)
|
|
"mov sp,%[b]"
|
|
"1:\tcom (%[b])+"
|
|
"sob %[a],1b"
|
|
erase(%[a]) | | | (10,180+$1*82)
|
|
com !defined($1)| SCR_REG |
|
|
remove(all)
|
|
allocate(REG)
|
|
"asr %[1]"
|
|
"mov sp,%[a]"
|
|
"1:\tcom (%[a])+"
|
|
"sob %[1],1b"
|
|
erase(%[1]) | | |
|
|
rol $1==2 | CONST2 SCR_ODD_REG |
|
|
"ashc $$%(%[1.num]-16%),%[2]"
|
|
setcc(%[2])
|
|
erase(%[2]) | %[2] | |
|
|
... | SCR_REG SCR_ODD_REG |
|
|
"sub $$%(16%),%[1]"
|
|
"ashc %[1],%[2]"
|
|
setcc(%[2])
|
|
erase(%[1]) erase(%[2]) | %[2] | |
|
|
rol defined($1) | | remove(all)
|
|
move({CONST2,$1},r0)
|
|
"jsr pc,rol~"
|
|
erase(r0) | | |
|
|
#ifdef UNTESTED
|
|
rol !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,rol~"
|
|
erase(r0) | | |
|
|
#endif
|
|
ror $1==2 | CONST2 SCR_ODD_REG |
|
|
"ashc $$%(0-%[1.num]%),%[2]"
|
|
setcc(%[2])
|
|
erase(%[2]) | %[2] | |
|
|
... | SCR_REG SCR_ODD_REG |
|
|
"neg %[1]"
|
|
"ashc %[1],%[2]"
|
|
setcc(%[2]) erase(%[1]) erase(%[2]) | %[2] | |
|
|
ror defined($1) | | remove(all)
|
|
move({CONST2,$1},r0)
|
|
"jsr pc,ror~"
|
|
erase(r0) | | |
|
|
#ifdef UNTESTED
|
|
ror !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,ror~"
|
|
erase(r0) | | |
|
|
#endif
|
|
com and $1==2 && $2==2 | source2 SCR_REG |
|
|
"bic %[1],%[2]"
|
|
setcc(%[2])
|
|
erase(%[2]) | %[2] | | (2,45)+%[1]
|
|
com and $1==$2 | | remove(all)
|
|
allocate(REG={CONST2,$1},REG)
|
|
"mov sp,%[b]"
|
|
"add %[a],%[b]"
|
|
"asr %[a]"
|
|
"1:\tbic (sp)+,(%[b])+"
|
|
"sob %[a],1b"
|
|
erase(%[a]) | | | (12,210+$1*97)
|
|
|
|
/********************************
|
|
* Group 10 : Set instructions *
|
|
********************************/
|
|
|
|
inn $1==2 | SCR_REG SCR_REG |
|
|
"neg %[1]"
|
|
"ash %[1],%[2]"
|
|
"bic $$0177776,%[2]"
|
|
erase(%[1]) erase(%[2]) | %[2] | |
|
|
loc inn $2==2 && $1==0 | SCR_REG |
|
|
"bic $$0177776,%[1]"
|
|
erase(%[1]) | %[1] | |
|
|
loc inn $2==2 && $1==1 | SCR_REG |
|
|
"asr %[1]"
|
|
"bic $$0177776,%[1]"
|
|
erase(%[1]) | %[1] | |
|
|
loc inn $2==2 | SCR_REG |
|
|
"ash $$%(0-$1%),%[1]"
|
|
"bic $$0177776,%[1]"
|
|
erase(%[1]) | %[1] | |
|
|
|
|
loc inn zeq $2==2 | | | {CONST2, 1<<$1} | and 2 zeq $3 |
|
|
inn zeq $1==2 | source2 |
|
|
allocate(REG={CONST2,1})
|
|
"ash %[1],%[a]" | %[a] | and 2 zeq $2 |
|
|
loc inn zne $2==2 | | | {CONST2, 1<<$1} | and 2 zne $3 |
|
|
inn zne $1==2 | source2 |
|
|
allocate(REG={CONST2,1})
|
|
"ash %[1],%[a]" | %[a] | and 2 zne $2 |
|
|
inn defined($1) | source2 |
|
|
remove(all)
|
|
move(%[1],r1)
|
|
move({CONST2,$1},r0)
|
|
"jsr pc,inn~"
|
|
erase(r01) | r0 | |
|
|
#ifdef UNTESTED
|
|
inn !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"mov (sp)+,r1"
|
|
"jsr pc,inn~"
|
|
erase(r01) | r0 | |
|
|
#endif
|
|
set $1==2 | register |
|
|
allocate(REG={CONST2,1})
|
|
"ash %[1],%[a]"
|
|
erase(%[a]) | %[a] | |
|
|
set defined($1) | source2 |
|
|
remove(all)
|
|
move(%[1],r1)
|
|
move({CONST2,$1},r0)
|
|
"jsr pc,set~"
|
|
erase(r01) | | |
|
|
set !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"mov (sp)+,r1"
|
|
"jsr pc,set~"
|
|
erase(r01) | | |
|
|
|
|
/****************************************
|
|
* Group 11 : Array instructions *
|
|
****************************************/
|
|
|
|
lae aar $2==2 && rom(1,3)==1 && rom(1,1)==0 | | | | adi 2 |
|
|
lae aar $2==2 && rom(1,3)==1 && rom(1,1)!=0 | | | | adi 2 adp 0-rom(1,1) |
|
|
|
|
lae aar $2==2 && rom(1,3)==2 && rom(1,1)==0 | SCR_REG |
|
|
"asl %[1]"
|
|
erase(%[1]) | %[1] | adi 2 |
|
|
lae aar $2==2 && rom(1,3)==2 && rom(1,1)!=0 | SCR_REG |
|
|
"asl %[1]"
|
|
erase(%[1]) |
|
|
{regconst2,%[1],tostring((0-2)*rom(1,1))} |
|
|
adi 2 |
|
|
lae aar $2==2 && rom(1,3)==4 && rom(1,1)==0 | SCR_REG |
|
|
"ash $$2,%[1]"
|
|
erase(%[1]) |
|
|
%[1] |
|
|
adi 2 |
|
|
lae aar $2==2 && rom(1,3)==4 && rom(1,1)!=0 | SCR_REG |
|
|
"ash $$2,%[1]"
|
|
erase(%[1]) |
|
|
{regconst2,%[1],tostring((0-4)*rom(1,1))} |
|
|
adi 2 |
|
|
lae aar $2==2 && rom(1,3)==8 && rom(1,1)==0 | SCR_REG |
|
|
"ash $$3,%[1]"
|
|
erase(%[1]) |
|
|
%[1] |
|
|
adi 2 |
|
|
lae aar $2==2 && rom(1,3)==8 && rom(1,1)!=0 | SCR_REG |
|
|
"ash $$3,%[1]"
|
|
erase(%[1]) |
|
|
{regconst2,%[1],tostring((0-8)*rom(1,1))} |
|
|
adi 2 |
|
|
lae aar $2==2 && rom(1,1)==0 && defined(rom(1,3)) | SCR_ODD_REG |
|
|
"mul $$%(rom(1,3)%),%[1]"
|
|
erase(%[1]) |
|
|
%[1] |
|
|
adi 2 |
|
|
lae aar $2==2 && defined(rom(1,3)) | SCR_ODD_REG |
|
|
"mul $$%(rom(1,3)%),%[1]"
|
|
erase(%[1]) |
|
|
{regconst2,%[1],tostring((0-rom(1,3))*rom(1,1))} |
|
|
adi 2 |
|
|
aar $1==2 | |
|
|
remove(all)
|
|
"mov (sp)+,r0"
|
|
"mov (sp)+,r1"
|
|
"jsr pc,aar~"
|
|
erase(r01) | | |
|
|
#ifdef UNTESTED
|
|
aar !defined($1) | | remove(all)
|
|
"jsr pc,iaar~" | | |
|
|
#endif
|
|
lae sar defined(rom(1,3)) | | | | lae $1 aar $2 sti rom(1,3) |
|
|
lae lar defined(rom(1,3)) | | | | lae $1 aar $2 loi rom(1,3) |
|
|
sar $1==2 | |
|
|
remove(all)
|
|
"mov (sp)+,r0"
|
|
"mov (sp)+,r1"
|
|
"jsr pc,sar~"
|
|
erase(r01) | | |
|
|
#ifdef UNTESTED
|
|
sar !defined($1) | | remove(all)
|
|
"jsr pc,isar~" | | |
|
|
#endif
|
|
lar $1==2 | |
|
|
remove(all)
|
|
"mov (sp)+,r0"
|
|
"mov (sp)+,r1"
|
|
"jsr pc,lar~"
|
|
erase(r01) | | |
|
|
#ifdef UNTESTED
|
|
lar !defined($1) | | remove(all)
|
|
"jsr pc,ilar~" | | |
|
|
#endif
|
|
|
|
/****************************************
|
|
* group 12 : Compare instructions *
|
|
****************************************/
|
|
|
|
cmi $1==2 | source2 source2 |
|
|
allocate(REG = {CONST2,0})
|
|
"cmp %[1],%[2]"
|
|
"beq 2f"
|
|
"bgt 1f"
|
|
"inc %[a]"
|
|
"br 2f"
|
|
"1:\tdec %[a]\n2:"
|
|
setcc(%[a])
|
|
erase(%[a]) | %[a] | |
|
|
ldc cmi zlt highw(1)==0 && loww(1)==0 && $2==4 | source2 source2 |
|
|
| %[1] | zlt $3 |
|
|
ldc cmi zge highw(1)==0 && loww(1)==0 && $2==4 | source2 source2 |
|
|
| %[1] | zge $3 |
|
|
cmi $1==4 | | remove(all)
|
|
"jsr pc,cmi4~" | r0 | |
|
|
#ifdef UNTESTED
|
|
cmi !defined($1) | source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,cmi~"
|
|
erase(r0) | r0 | |
|
|
#endif
|
|
cmf defined($1) | | remove(ALL)
|
|
move({CONST2,$1},r0)
|
|
"jsr pc,cmf~"
|
|
erase(r0) | r0 | |
|
|
#ifdef UNTESTED
|
|
cmf !defined($1)| source2 |
|
|
remove(ALL)
|
|
move(%[1],r0)
|
|
"jsr pc,cmf~"
|
|
erase(r0) | r0 | |
|
|
#endif
|
|
cmu $1==2 | | | | cmp |
|
|
cmu $1==4 | | remove(all)
|
|
"jsr pc,cmu4~" | r0 | |
|
|
cmu defined($1) | | remove(all)
|
|
move({CONST2,$1},r0)
|
|
"jsr pc,cmu~" | r0 | |
|
|
#ifdef UNTESTED
|
|
cmu !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,cmu~"
|
|
erase(r0) | r0 | |
|
|
#endif
|
|
cms $1==2 | | | | cmi $1 |
|
|
ldc cms zeq $2==4 && loww(1)==0 && highw(1)==0 | source2 SCR_REG |
|
|
remove(all)
|
|
"bis %[1],%[2]"
|
|
"jeq $3" | | |
|
|
ldc cms zne $2==4 && loww(1)==0 && highw(1)==0 | source2 SCR_REG |
|
|
remove(all)
|
|
"bis %[1],%[2]"
|
|
"jne $3" | | |
|
|
ldc cms zeq $2==4 | source2 source2 |
|
|
remove(all)
|
|
"cmp $$%(loww(1)%),%[2]"
|
|
"bne 1f"
|
|
"cmp $$%(highw(1)%),%[1]"
|
|
"jeq $3"
|
|
"1:" | | |
|
|
ldc cms zne $2==4 | source2 source2 |
|
|
remove(all)
|
|
"cmp $$%(loww(1)%),%[2]"
|
|
"jne $3"
|
|
"cmp $$%(highw(1)%),%[1]"
|
|
"jne $3" | | |
|
|
cms defined($1) | | remove(all)
|
|
move({CONST2,$1},r0)
|
|
"jsr pc,cms~"
|
|
erase(r0) | r0 | |
|
|
#ifdef UNTESTED
|
|
cms !defined($1)| source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,cms~"
|
|
erase(r0) | r0 | |
|
|
#endif
|
|
cmp | source2 source2 |
|
|
allocate(REG = {CONST2,0})
|
|
"cmp %[1],%[2]"
|
|
"beq 2f"
|
|
"bhi 1f"
|
|
"inc %[a]"
|
|
"br 2f"
|
|
"1:\tdec %[a]\n2:"
|
|
setcc(%[a])
|
|
erase(%[a]) | %[a] | |
|
|
tlt and $2==2 | source2 SCR_REG |
|
|
test(%[1])
|
|
"blt 1f"
|
|
"clr %[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
tlt ior $2==2 | source2 SCR_REG |
|
|
test(%[1])
|
|
"bge 1f"
|
|
"bis $$1,%[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
tlt | source2 |
|
|
allocate(REG={CONST2,0})
|
|
test(%[1])
|
|
"bge 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
tle and $2==2 | source2 SCR_REG |
|
|
test(%[1])
|
|
"ble 1f"
|
|
"clr %[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
tle ior $2==2 | source2 SCR_REG |
|
|
test(%[1])
|
|
"bgt 1f"
|
|
"bis $$1,%[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
tle | source2 |
|
|
allocate(REG={CONST2,0})
|
|
test(%[1])
|
|
"bgt 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
teq and $2==2 | source1or2 SCR_REG |
|
|
test(%[1])
|
|
"beq 1f"
|
|
"clr %[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
teq ior $2==2 | source1or2 SCR_REG |
|
|
test(%[1])
|
|
"bne 1f"
|
|
"bis $$1,%[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
teq | source1or2 |
|
|
allocate(REG={CONST2,0})
|
|
test(%[1])
|
|
"bne 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
tne and $2==2 | source1or2 SCR_REG |
|
|
test(%[1])
|
|
"bne 1f"
|
|
"clr %[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
tne ior $2==2 | source1or2 SCR_REG |
|
|
test(%[1])
|
|
"beq 1f"
|
|
"bis $$1,%[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
tne | source1or2 |
|
|
allocate(REG={CONST2,0})
|
|
test(%[1])
|
|
"beq 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
tgt and $2==2 | source2 SCR_REG |
|
|
test(%[1])
|
|
"bgt 1f"
|
|
"clr %[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
tgt ior $2==2 | source2 SCR_REG |
|
|
test(%[1])
|
|
"ble 1f"
|
|
"bis $$1,%[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
tgt | source2 |
|
|
allocate(REG={CONST2,0})
|
|
test(%[1])
|
|
"ble 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
tge and $2==2 | source2 SCR_REG |
|
|
test(%[1])
|
|
"bge 1f"
|
|
"clr %[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
tge ior $2==2 | source2 SCR_REG |
|
|
test(%[1])
|
|
"blt 1f"
|
|
"bis $$1,%[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
tge | source2 |
|
|
allocate(REG={CONST2,0})
|
|
test(%[1])
|
|
"blt 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
and tne $1==2 | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"bit %[1],%[2]"
|
|
"beq 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
and teq $1==2 | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"bit %[1],%[2]"
|
|
"bne 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
|
|
cmi tlt and $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"blt 1f"
|
|
"clr %[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi tlt ior $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"bge 1f"
|
|
"bis $$1,%[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi tlt $1==2 | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"bge 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmi tle and $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"ble 1f"
|
|
"clr %[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi tle ior $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"bgt 1f"
|
|
"bis $$1,%[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi tle $1==2 | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"bgt 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmi teq and $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"beq 1f"
|
|
"clr %[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi teq ior $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"bne 1f"
|
|
"bis $$1,%[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi teq $1==2 | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"bne 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
loc cmi teq and $1>=0 && $1<=127 && $2==2 && $4==2 | NC source1 SCR_REG |
|
|
"cmpb %[1],$$$1"
|
|
"beq 1f"
|
|
"clr %[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
... | | | {CONST2, $1} | cmi 2 teq and 2 |
|
|
loc cmi teq ior $1>=0 && $1<=127 && $2==2 && $4==2 | NC source1 SCR_REG |
|
|
"cmpb %[1],$$$1"
|
|
"bne 1f"
|
|
"bis $$1,%[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
... | | | {CONST2, $1} | cmi 2 teq ior 2 |
|
|
loc cmi teq $1>=0 && $1<=127 && $2==2 | NC source1 |
|
|
allocate(REG={CONST2,0})
|
|
"cmpb %[1],$$$1"
|
|
"bne 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
... | | | {CONST2, $1} | cmi 2 teq |
|
|
cmi tne and $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"bne 1f"
|
|
"clr %[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi tne ior $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"beq 1f"
|
|
"bis $$1,%[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi tne $1==2 | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"beq 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
loc cmi tne and $1>=0 && $1<=127 && $2==2 && $4==2 | NC source1 SCR_REG |
|
|
"cmpb %[1],$$$1"
|
|
"bne 1f"
|
|
"clr %[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
... | | | {CONST2, $1} | cmi 2 tne and 2 |
|
|
loc cmi tne ior $1>=0 && $1<=127 && $2==2 && $4==2 | NC source1 SCR_REG |
|
|
"cmpb %[1],$$$1"
|
|
"beq 1f"
|
|
"bis $$1,%[2]\n1:"
|
|
erase(%[2]) | %[2] | |
|
|
... | | | {CONST2, $1} | cmi 2 tne ior 2 |
|
|
loc cmi tne $1>=0 && $1<=127 && $2==2 | NC source1 |
|
|
allocate(REG={CONST2,0})
|
|
"cmpb %[1],$$$1"
|
|
"beq 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
... | | | {CONST2, $1} | cmi 2 tne |
|
|
cmi tge and $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"bge 1f"
|
|
"clr %[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi tge ior $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"blt 1f"
|
|
"bis $$1,%[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi tge $1==2 | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"blt 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmi tgt and $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"bgt 1f"
|
|
"clr %[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi tgt ior $1==2 && $3==2 | source2 source2 SCR_REG |
|
|
"cmp %[2],%[1]"
|
|
"ble 1f"
|
|
"bis $$1,%[3]\n1:"
|
|
erase(%[3]) | %[3] | |
|
|
cmi tgt $1==2 | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"ble 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmp tlt | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"bhis 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmp tle | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"bhi 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmp teq | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"bne 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmp tne | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"beq 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmp tge | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"blo 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmp tgt | source2 source2 |
|
|
allocate(REG={CONST2,0})
|
|
"cmp %[2],%[1]"
|
|
"blos 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf tlt $1==4 | FLT_REG FLT_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"bge 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf tle $1==4 | FLT_REG FLT_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"bgt 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf teq $1==4 | FLT_REG FLT_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"bne 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf tne $1==4 | FLT_REG FLT_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"beq 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf tgt $1==4 | FLT_REG FLT_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"ble 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf tge $1==4 | FLT_REG FLT_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"blt 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf tlt $1==8 | DBL_REG double8 |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"bge 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
... | double8 DBL_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"ble 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf tle $1==8 | DBL_REG double8 |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"bgt 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
... | double8 DBL_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"blt 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf teq $1==8 | DBL_REG double8 |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"bne 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
... | double8 DBL_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"bne 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf tne $1==8 | DBL_REG double8 |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"beq 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
... | double8 DBL_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"beq 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf tgt $1==8 | DBL_REG double8 |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"ble 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
... | double8 DBL_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"bge 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
cmf tge $1==8 | DBL_REG double8 |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"blt 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
... | double8 DBL_REG |
|
|
allocate(REG={CONST2,0})
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"bgt 1f"
|
|
"inc %[a]\n1:"
|
|
erase(%[a]) | %[a] | |
|
|
|
|
/****************************************
|
|
* Group 13 : Branch instructions *
|
|
****************************************/
|
|
|
|
bra | | remove(all)
|
|
"jbr $1"
|
|
samecc | | |
|
|
blt | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jlt $1" | | |
|
|
ble | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jle $1" | | |
|
|
beq | NC source1 source1 |
|
|
remove(all)
|
|
"cmpb %[2],%[1]"
|
|
"jeq $1" | | |
|
|
... | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jeq $1" | | |
|
|
bne | NC source1 source1 |
|
|
remove(all)
|
|
"cmpb %[2],%[1]"
|
|
"jne $1" | | |
|
|
... | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jne $1" | | |
|
|
bge | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jge $1" | | |
|
|
bgt | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jgt $1" | | |
|
|
loc beq $1>=0 && $1<=127 | NC source1 |
|
|
remove(all)
|
|
"cmpb %[1],$$$1"
|
|
"jeq $2" | | |
|
|
... | | | {CONST2, $1} | beq $2 |
|
|
loc bne $1>=0 && $1<=127 | NC source1 |
|
|
remove(all)
|
|
"cmpb %[1],$$$1"
|
|
"jne $2" | | |
|
|
... | | | {CONST2, $1} | bne $2 |
|
|
zlt | source2 |
|
|
remove(all)
|
|
test(%[1])
|
|
"jlt $1"
|
|
samecc | | |
|
|
zle | source2 |
|
|
remove(all)
|
|
test(%[1])
|
|
"jle $1"
|
|
samecc | | |
|
|
zeq | source1or2 |
|
|
remove(all)
|
|
test(%[1])
|
|
"jeq $1"
|
|
samecc | | |
|
|
zne | source1or2 |
|
|
remove(all)
|
|
test(%[1])
|
|
"jne $1"
|
|
samecc | | |
|
|
zge | source2 |
|
|
remove(all)
|
|
test(%[1])
|
|
"jge $1"
|
|
samecc | | |
|
|
zgt | source2 |
|
|
remove(all)
|
|
test(%[1])
|
|
"jgt $1"
|
|
samecc | | |
|
|
cmp zlt | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jlo $2" | | |
|
|
cmp zle | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jlos $2" | | |
|
|
cmp zeq | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jeq $2" | | |
|
|
cmp zne | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jne $2" | | |
|
|
cmp zgt | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jhi $2" | | |
|
|
cmp zge | source2 source2 |
|
|
remove(all)
|
|
"cmp %[2],%[1]"
|
|
"jhis $2" | | |
|
|
cmf zlt $1==4 | FLT_REG FLT_REG |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jlt $2" | | |
|
|
cmf zle $1==4 | FLT_REG FLT_REG |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jle $2" | | |
|
|
cmf zeq $1==4 | FLT_REG FLT_REG |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jeq $2" | | |
|
|
cmf zne $1==4 | FLT_REG FLT_REG |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jne $2" | | |
|
|
cmf zgt $1==4 | FLT_REG FLT_REG |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jgt $2" | | |
|
|
cmf zge $1==4 | FLT_REG FLT_REG |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jge $2" | | |
|
|
cmf zlt $1==8 | DBL_REG double8 |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jlt $2" | | |
|
|
... | double8 DBL_REG |
|
|
remove(all)
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"jgt $2" | | |
|
|
cmf zle $1==8 | DBL_REG double8 |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jle $2" | | |
|
|
... | double8 DBL_REG |
|
|
remove(all)
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"jge $2" | | |
|
|
cmf zeq $1==8 | DBL_REG double8 |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jeq $2" | | |
|
|
... | double8 DBL_REG |
|
|
remove(all)
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"jeq $2" | | |
|
|
cmf zne $1==8 | DBL_REG double8 |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jne $2" | | |
|
|
... | double8 DBL_REG |
|
|
remove(all)
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"jne $2" | | |
|
|
cmf zgt $1==8 | DBL_REG double8 |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jgt $2" | | |
|
|
... | double8 DBL_REG |
|
|
remove(all)
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"jlt $2" | | |
|
|
cmf zge $1==8 | DBL_REG double8 |
|
|
remove(all)
|
|
"cmpf %[2],%[1]\ncfcc"
|
|
"jge $2" | | |
|
|
... | double8 DBL_REG |
|
|
remove(all)
|
|
"cmpf %[1],%[2]\ncfcc"
|
|
"jle $2" | | |
|
|
|
|
and zeq $1==2 | source1 source1or2 |
|
|
remove(all)
|
|
"bitb %[1],%[2]"
|
|
"jeq $2" | | |
|
|
... | source1or2 source1 |
|
|
remove(all)
|
|
"bitb %[1],%[2]"
|
|
"jeq $2" | | |
|
|
... | source2 source2 |
|
|
remove(all)
|
|
"bit %[1],%[2]"
|
|
"jeq $2" | | |
|
|
and zne $1==2 | source1 source1or2 |
|
|
remove(all)
|
|
"bitb %[1],%[2]"
|
|
"jne $2" | | |
|
|
... | source1or2 source1 |
|
|
remove(all)
|
|
"bitb %[1],%[2]"
|
|
"jne $2" | | |
|
|
... | source2 source2 |
|
|
remove(all)
|
|
"bit %[1],%[2]"
|
|
"jne $2" | | |
|
|
|
|
/************************************************
|
|
* group 14 : Procedure call instructions *
|
|
************************************************/
|
|
|
|
cal | | remove(ALL)
|
|
"jsr pc,$1" | | |
|
|
cai | register | remove(ALL)
|
|
"jsr pc,(%[1])" | | |
|
|
lfr $1==2 | | | r0 | |
|
|
lfr $1==4 | | | r1 r0 | |
|
|
lfr $1==8 | | | {relative8,"retar"} | |
|
|
lfr | | remove(all)
|
|
move({CONST2,$1},r0)
|
|
"jsr pc,lfr~"
|
|
erase(r0) | | |
|
|
|
|
lfr ret $1==$2 | | | | ret 0 |
|
|
|
|
#ifndef REGVARS
|
|
asp lfr ret $2==$3 | | | | ret 0 |
|
|
asp ret $2==0 | | | | ret 0 |
|
|
#endif
|
|
|
|
ret $1==0 | | remove(all)
|
|
#ifdef REGVARS
|
|
return | | |
|
|
#else
|
|
"mov r5,sp\nmov (sp)+,r5\nrts pc" | | |
|
|
#endif
|
|
ret $1==2 | source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
#ifdef REGVARS
|
|
return | | |
|
|
#else
|
|
"mov r5,sp\nmov (sp)+,r5\nrts pc" | | |
|
|
#endif
|
|
ret $1==4 | |
|
|
remove(all)
|
|
"mov (sp)+,r0"
|
|
"mov (sp)+,r1"
|
|
#ifdef REGVARS
|
|
return | | |
|
|
#else
|
|
"mov r5,sp\nmov (sp)+,r5\nrts pc" | | |
|
|
#endif
|
|
ret $1==8 | | | {ADDR_EXTERNAL, "retar"} | sti 8 ret 0 |
|
|
ret | | remove(all)
|
|
move({CONST2,$1},r0)
|
|
"jmp ret~" | | |
|
|
|
|
/************************************************
|
|
* Group 15 : Miscellaneous instructions *
|
|
************************************************/
|
|
|
|
asp $1==2 | NC xsource2 | | | |
|
|
... | | remove(all)
|
|
"tst (sp)+" | | |
|
|
asp $1==4 | | remove(all)
|
|
"cmp (sp)+,(sp)+" | | |
|
|
asp $1==0-2 | | remove(all)
|
|
"tst -(sp)" | | |
|
|
asp | | remove(all)
|
|
"add $$$1,sp" | | |
|
|
ass $1==2 | | remove(all)
|
|
"add (sp)+,sp" | | |
|
|
#ifdef UNTESTED
|
|
ass !defined($1)| source2 |
|
|
remove(all)
|
|
"cmp %[1],$$2"
|
|
"beq 1f;jmp unknown~;1:"
|
|
"add (sp)+,sp" | | |
|
|
#endif
|
|
|
|
blm $1==4 | SCR_REG SCR_REG |
|
|
"mov (%[2])+,(%[1])+"
|
|
"mov (%[2]),(%[1])"
|
|
erase(%[1]) erase(%[2]) | | |
|
|
blm $1==6 | SCR_REG SCR_REG |
|
|
"mov (%[2])+,(%[1])+"
|
|
"mov (%[2])+,(%[1])+"
|
|
"mov (%[2]),(%[1])"
|
|
erase(%[1]) erase(%[2]) | | |
|
|
blm $1==8 | SCR_REG SCR_REG |
|
|
"mov (%[2])+,(%[1])+"
|
|
"mov (%[2])+,(%[1])+"
|
|
"mov (%[2])+,(%[1])+"
|
|
"mov (%[2]),(%[1])"
|
|
erase(%[1]) erase(%[2]) | | |
|
|
blm | SCR_REG SCR_REG |
|
|
allocate(REG={CONST2,$1/2})
|
|
"1:mov (%[2])+,(%[1])+\nsob %[a],1b"
|
|
erase(%[1]) erase (%[2]) erase(%[a]) | | |
|
|
bls $1==2 | SCR_REG SCR_REG SCR_REG |
|
|
"asr %[1]\nbeq 2f"
|
|
"1:mov (%[3])+,(%[2])+\nsob %[1],1b\n2:"
|
|
erase(%[1]) erase (%[2]) erase(%[3]) | | |
|
|
#ifdef UNTESTED
|
|
bls !defined($1)| source2 SCR_REG SCR_REG SCR_REG |
|
|
remove(all)
|
|
"cmp %[1],$$2"
|
|
"beq 1f;jmp unknown~;1:"
|
|
"asr %[2]\nbeq 2f"
|
|
"1:mov (%[4])+,(%[3])+\nsob %[2],1b\n2:"
|
|
erase(%[2]) erase (%[3]) erase(%[4]) | | |
|
|
#endif
|
|
lae csa $2==2 | source2 |
|
|
remove(all)
|
|
move(%[1],r1)
|
|
move({ADDR_EXTERNAL,$1},r0)
|
|
"jmp csa~" | | |
|
|
csa $1==2 | |
|
|
remove(all)
|
|
"mov (sp)+,r0"
|
|
"mov (sp)+,r1"
|
|
"jmp csa~" | | |
|
|
#ifdef UNTESTED
|
|
csa !defined($1)| source2 |
|
|
remove(all)
|
|
"cmp %[1],$$2"
|
|
"beq 1f;jmp unknown~;1:"
|
|
"mov (sp)+,r0"
|
|
"mov (sp)+,r1"
|
|
"jmp csa~" | | |
|
|
#endif
|
|
lae csb $2==2 | NC source2 |
|
|
remove(all)
|
|
move(%[1],r1)
|
|
move({ADDR_EXTERNAL,$1},r0)
|
|
"jmp csb~" | | |
|
|
... | |
|
|
remove(all)
|
|
move({ADDR_EXTERNAL,$1},r0)
|
|
"mov (sp)+,r1"
|
|
"jmp csb~" | | |
|
|
|
|
csb $1==2 | |
|
|
remove(all)
|
|
"mov (sp)+,r0"
|
|
"mov (sp)+,r1"
|
|
"jmp csb~" | | |
|
|
#ifdef UNTESTED
|
|
csb !defined($1)| source2 |
|
|
remove(all)
|
|
"cmp %[1],$$2"
|
|
"beq 1f;jmp unknown~;1:"
|
|
"mov (sp)+,r0"
|
|
"mov (sp)+,r1"
|
|
"jmp csb~" | | |
|
|
#endif
|
|
dup $1==2 | register | | %[1] %[1] | |
|
|
dup $1==4 | NC longf4 | | %[1] %[1] | |
|
|
... | source2 source2 | | %[2] %[1] %[2] %[1] | |
|
|
dup $1==8 | NC double8| | %[1] %[1] | |
|
|
... | | remove(all)
|
|
move({CONST2, $1}, r0)
|
|
"jsr pc,dup~"
|
|
erase(r01) | | |
|
|
dup | | remove(all)
|
|
move({CONST2, $1}, r0)
|
|
"jsr pc,dup~"
|
|
erase(r01) | | |
|
|
dus $1==2 | source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,dup~"
|
|
erase(r01) | | |
|
|
#ifdef UNTESTED
|
|
dus !defined($1)| source2 |
|
|
remove(all)
|
|
"cmp %[1],$$2"
|
|
"beq 1f;jmp unknown~;1:"
|
|
"mov (sp)+,r0"
|
|
"jsr pc,dup~"
|
|
erase(r01) | | |
|
|
#endif
|
|
gto | | remove(all)
|
|
"mov $$$1,-(sp)"
|
|
"jmp gto~" | | |
|
|
fil | | "mov $$$1,hol0+4" | | |
|
|
lim | | | { relative2, "trpim~"} | |
|
|
lin | | "mov $$$1,hol0" | | |
|
|
lni | | "inc hol0" | | |
|
|
lor $1==0 | | | lb | |
|
|
lor $1==1 | | remove(all)
|
|
allocate(REG)
|
|
"mov sp,%[a]" | %[a] | |
|
|
lor $1==2 | | | {relative2,"reghp~"} | |
|
|
mon | | remove(all)
|
|
"jsr pc,mon~" | | |
|
|
nop | | remove(all)
|
|
"jsr pc,nop~" | | |
|
|
#ifdef DORCK
|
|
rck $1==2 | source2 |
|
|
remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,rck~" | | |
|
|
#ifdef UNTESTED
|
|
rck !defined($1)| source2 source2 |
|
|
remove(all)
|
|
"cmp %[1],$$2"
|
|
"beq 1f;jmp unknown~;1:"
|
|
move(%[2],r0)
|
|
"jsr pc,rck~" | | |
|
|
#endif
|
|
#else
|
|
rck $1==2 | source2 | | | |
|
|
rck !defined($1)| source2 source2 | | | |
|
|
#endif
|
|
rtt | | | | ret 0 |
|
|
sig | source2 |
|
|
allocate(REG)
|
|
move({relative2,"trppc~"},%[a])
|
|
"mov %[1],trppc~" | %[a] | |
|
|
sim | | remove(all)
|
|
"jsr pc,sim~" | | |
|
|
str $1==0 | source2 |
|
|
"mov %[1],r5" | | |
|
|
str $1==1 | source2 |
|
|
remove(all)
|
|
"mov %[1],sp" | | |
|
|
str $1==2 | | remove(all)
|
|
"jsr pc,strhp~" | | |
|
|
trp | | remove(all)
|
|
"jsr pc,trp~" | | |
|
|
exg $1==2 | source2 source2 | | %[1] %[2] | |
|
|
exg defined($1) | | remove(all)
|
|
move({CONST2,$1},r0)
|
|
"jsr pc,exg~" | | |
|
|
exg | source2 | remove(all)
|
|
move(%[1],r0)
|
|
"jsr pc,exg" | | |
|
|
|
|
lol lal sti $1==$2 && $3==1| | | | | /* throw away funny C-proc-prolog */
|
|
|
|
/********************************
|
|
* Coercions *
|
|
* *
|
|
* From EM-tokens to PDP-tokens *
|
|
********************************/
|
|
|
|
| LOCAL2 | | {regind2,lb,tostring(%[1.ind])} | |
|
|
| LOCAL4 | | {regind4,lb,tostring(%[1.ind])} | |
|
|
|
|
/********************************
|
|
* From source to register *
|
|
********************************/
|
|
|
|
| regconst2 | allocate(%[1],REG=%[1.reg])
|
|
"add $$%[1.ind],%[a]"
|
|
setcc(%[a]) | %[a] | |(6,105)
|
|
| ADDR_LOCAL | allocate(REG)
|
|
"mov r5,%[a]"
|
|
"add $$%[1.ind],%[a]"
|
|
setcc(%[a]) | %[a] | |(6,105)
|
|
| register | | {regconst2, %[1], "0"} | | (2,60)
|
|
| xsource2 | allocate(%[1], REG=%[1]) | %[a] | |
|
|
| xsource2 | allocate(%[1], REG=%[1]) | {regconst2, %[a], "0"} | |
|
|
| longf4 | allocate(FLT_REG)
|
|
move( %[1],%[a]) | %[a] | | (20,2000) + %[1]
|
|
| double8 | allocate(DBL_REG)
|
|
move(%[1],%[a]) | %[a] | | (20,3000) + %[1]
|
|
|
|
/********************************
|
|
* From source1 to source2 *
|
|
********************************/
|
|
|
|
| source1 | allocate(REG={CONST2,0})
|
|
"bisb %[1],%[a]"
|
|
erase(%[a]) setcc(%[a]) | %[a] | | (6,105)+%[1]
|
|
|
|
/********************************
|
|
* From long4 to source2 *
|
|
********************************/
|
|
|
|
| REG_PAIR | | %[1.2] %[1.1] | |
|
|
| regind4 | | {regind2,%[1.reg],"2+"+%[1.ind]} {regind2,%[1.reg],%[1.ind]} | |
|
|
| relative4 | | {relative2,"2+"+%[1.ind]} {relative2,%[1.ind]} | |
|
|
| regdef4 | | {regind2,%[1.reg],"2"} {regdef2,%[1.reg]} | |
|
|
| LOCAL4 | | {LOCAL2, %[1.ind]+2, 2} {LOCAL2, %[1.ind], 2} | |
|
|
|
|
/********************************
|
|
* from double8 to long4 *
|
|
********************************/
|
|
|
|
| regind8 | | {regind4,%[1.reg],"4+"+%[1.ind]} {regind4,%[1.reg],%[1.ind]} | |
|
|
| relative8 | | {relative4,"4+"+%[1.ind]} {relative4,%[1.ind]} | |
|
|
| regdef8 | | {regdef4,%[1.reg]} {regind4,%[1.reg],"4"} | |
|
|
|
|
|
|
|
|
/************************
|
|
* From STACK coercions *
|
|
************************/
|
|
|
|
| STACK | allocate(REG)
|
|
"mov (sp)+,%[a]"
|
|
setcc(%[a]) | %[a] | | (2,75)
|
|
| STACK | allocate(REG)
|
|
"mov (sp)+,%[a]"
|
|
setcc(%[a]) | {regconst2, %[a], "0"} | | (2,75)
|
|
| STACK | allocate(FLT_REG)
|
|
"movof (sp)+,%[a]"
|
|
samecc | %[a] | | (20,4740) /* /10 */
|
|
| STACK | allocate(DBL_REG)
|
|
"movf (sp)+,%[a]"
|
|
samecc | %[a] | | (20,6920) /* /10 */
|
|
| STACK | allocate(REG_PAIR)
|
|
"mov (sp)+,%[a.1]"
|
|
"mov (sp)+,%[a.2]"
|
|
setcc(%[a.2]) | %[a] | | (4,150)
|
|
|
|
MOVES:
|
|
(CONST2 %[num] == 0, source2, "clr %[2]" setcc(%[2]),(2,30))
|
|
(source2, source2, "mov %[1],%[2]" setcc(%[2]),(2,30)+%[1]+%[2])
|
|
(FLT_REG, longf4-FLT_REG,"movfo %[1],%[2]" samecc, (2,88) + %[2])
|
|
(longf4-FLT_REG,FLT_REG, "movof %[1],%[2]" samecc, (2,150) + %[2])
|
|
(FLT_REG, FLT_REG, "movf %[1],%[2]" samecc,(2,88))
|
|
(DBL_REG,double8, "movf %[1],%[2]" samecc,(2,88) + %[2])
|
|
(double8,DBL_REG, "movf %[1],%[2]" samecc,(2,170) + %[1])
|
|
(CONST2 %[num] == 0,source1, "clrb %[2]" setcc(%[2]),(2,45)+%[2])
|
|
(source1or2,source1, "movb %[1],%[2]" setcc(%[2]),(2,30)+%[1]+%[2])
|
|
(ftoint,source2, "movfi %[1.reg],%[2]" samecc)
|
|
|
|
TESTS:
|
|
(source2, "tst %[1]" ,(2,30) + %[1])
|
|
(source1, "tstb %[1]",(2,40) + %[1])
|
|
(FLT_REG+DBL_REG, "tstf %[1]\ncfcc" ,(4,260))
|
|
/* (DBL_REG, "tstf %[1]\ncfcc" ,(4,260)) */
|
|
|
|
STACKS:
|
|
( CONST2 %[num]==0 ,, "clr -(sp)" )
|
|
( source2 ,, "mov %[1],-(sp)" setcc(%[1]), (2,90)+%[1])
|
|
( regconst2 ,, "mov %[1.reg],-(sp)\nadd $$%[1.ind],(sp)" , (6,225))
|
|
( ADDR_LOCAL,, "mov r5,-(sp)" "add $$%[1.ind],(sp)", (6,225))
|
|
( DBL_REG ,, "movf %[1],-(sp)" samecc , (2,610))
|
|
( FLT_REG ,, "movfo %[1],-(sp)" samecc , (2,412))
|
|
( REG_PAIR ,, "mov %[1.2],-(sp)" "mov %[1.1],-(sp)" , (4,180))
|
|
( regind4 ,, "mov 2+%[1.ind](%[1.reg]),-(sp)"
|
|
"mov %[1.ind](%[1.reg]),-(sp)" , (8,300))
|
|
( relative4 ,, "mov 2+%[1.ind],-(sp)"
|
|
"mov %[1.ind],-(sp)" , (8,300))
|
|
( regdef4 ,, "mov 2(%[1.reg]),-(sp)"
|
|
"mov (%[1.reg]),-(sp)" , (6,270))
|
|
( regind8 ,REG, move(%[1.reg],%[a])
|
|
"add $$%(8%)+%[1.ind],%[a]"
|
|
"mov -(%[a]),-(sp)"
|
|
"mov -(%[a]),-(sp)"
|
|
"mov -(%[a]),-(sp)"
|
|
"mov -(%[a]),-(sp)"
|
|
erase(%[a]) , (14,600))
|
|
( regind8 ,, "mov 6+%[1.ind](%[1.reg]),-(sp)"
|
|
"mov 4+%[1.ind](%[1.reg]),-(sp)"
|
|
"mov 2+%[1.ind](%[1.reg]),-(sp)"
|
|
"mov %[1.ind](%[1.reg]),-(sp)" , (16,600))
|
|
( relative8 ,REG,"mov $$%(8%)+%[1.ind],%[a]"
|
|
"mov -(%[a]),-(sp)"
|
|
"mov -(%[a]),-(sp)"
|
|
"mov -(%[a]),-(sp)"
|
|
"mov -(%[a]),-(sp)" , (12,500))
|
|
( relative8 ,, "mov 6+%[1.ind],-(sp)"
|
|
"mov 4+%[1.ind],-(sp)"
|
|
"mov 2+%[1.ind],-(sp)"
|
|
"mov %[1.ind],-(sp)" , (16,600))
|
|
( regdef8 ,, "mov 6(%[1.reg]),-(sp)"
|
|
"mov 4(%[1.reg]),-(sp)"
|
|
"mov 2(%[1.reg]),-(sp)"
|
|
"mov (%[1.reg]),-(sp)" , (14,570))
|
|
( LOCAL4 ,, "mov 2+%[1.ind](r5),-(sp)"
|
|
"mov %[1.ind](r5),-(sp)" , (8,300))
|
|
( source1 ,, "clr -(sp)"
|
|
"movb %[1],(sp)" , (4,180)+%[1])
|
|
( ftoint ,, "movfi %[1.reg],-(sp)" )
|
|
( ftolong ,, "setl\nmovfi %[1.reg],-(sp)\nseti" )
|