rcsid added
several optimizations added
This commit is contained in:
parent
a520ccdbbc
commit
17caf7129e
1 changed files with 77 additions and 12 deletions
|
@ -1,3 +1,4 @@
|
||||||
|
"$Header$"
|
||||||
/*
|
/*
|
||||||
* (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
* (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
|
||||||
*
|
*
|
||||||
|
@ -32,6 +33,7 @@
|
||||||
|
|
||||||
EM_WSIZE = 2
|
EM_WSIZE = 2
|
||||||
EM_PSIZE = 4
|
EM_PSIZE = 4
|
||||||
|
EM_BSIZE = 8
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -112,6 +114,8 @@ ABS = {STRING addr;} 2 cost=(3,5) "%[addr]"
|
||||||
ABS1 = {STRING addr;} 2 cost=(3,5) "%[addr]"
|
ABS1 = {STRING addr;} 2 cost=(3,5) "%[addr]"
|
||||||
IMMEDIATE = {INT cc;} 2 cost=(1,2) "#%[cc]"
|
IMMEDIATE = {INT cc;} 2 cost=(1,2) "#%[cc]"
|
||||||
LOCAL_ADDR = {INT off;} 4 /* not really addressable */
|
LOCAL_ADDR = {INT off;} 4 /* not really addressable */
|
||||||
|
REGOFF_ADDR = {REGISTER reg;
|
||||||
|
INT off;} 4 /* not really addressable */
|
||||||
EXTERNAL_ADDR = {STRING off;} 4 cost=(4,4) "#%[off]"
|
EXTERNAL_ADDR = {STRING off;} 4 cost=(4,4) "#%[off]"
|
||||||
INDEX_ADDR = {REGISTER reg,ireg;
|
INDEX_ADDR = {REGISTER reg,ireg;
|
||||||
INT di;} 4
|
INT di;} 4
|
||||||
|
@ -152,7 +156,7 @@ ALT_MEM = ALTERABLE * MEMORY
|
||||||
DATASCR = DATAREG * SCRATCH
|
DATASCR = DATAREG * SCRATCH
|
||||||
ADDSCR = ADDREG * SCRATCH
|
ADDSCR = ADDREG * SCRATCH
|
||||||
MEM_ALL = ALL - DATAREG - DATAREG4 - ADDREG - IMMEDIATE - IMMEDIATE4
|
MEM_ALL = ALL - DATAREG - DATAREG4 - ADDREG - IMMEDIATE - IMMEDIATE4
|
||||||
- LOCAL_ADDR - EXTERNAL_ADDR - DOUBLE - DOUBLEZERO
|
- LOCAL_ADDR -REGOFF_ADDR - EXTERNAL_ADDR - DOUBLE - DOUBLEZERO
|
||||||
ALL_ACCESSIBLE = IADDREG + IADDREG4 + IADDREG1 + INDEXED + INDEXED4
|
ALL_ACCESSIBLE = IADDREG + IADDREG4 + IADDREG1 + INDEXED + INDEXED4
|
||||||
|
|
||||||
ANY1 = DISPL1 + ABS1 + IADDREG1
|
ANY1 = DISPL1 + ABS1 + IADDREG1
|
||||||
|
@ -204,13 +208,18 @@ lil | | allocate(ADDREG = {DISPL4,LB,$1})| {IADDREG,%[a]} | |
|
||||||
lof | ADDREG | | {DISPL,%[1],$1} | |
|
lof | ADDREG | | {DISPL,%[1],$1} | |
|
||||||
... | nocoercions: EXTERNAL_ADDR | | {ABS,%[1.off]+"+"+tostring($1)} | |
|
... | nocoercions: EXTERNAL_ADDR | | {ABS,%[1.off]+"+"+tostring($1)} | |
|
||||||
... | nocoercions: LOCAL_ADDR | | {DISPL,LB,%[1.off]+$1} | |
|
... | nocoercions: LOCAL_ADDR | | {DISPL,LB,%[1.off]+$1} | |
|
||||||
|
... | nocoercions: REGOFF_ADDR | | {DISPL,%[1.reg],%[1.off]+$1} | |
|
||||||
ldf | ADDREG | | {DISPL4,%[1],$1} | |
|
ldf | ADDREG | | {DISPL4,%[1],$1} | |
|
||||||
... | nocoercions: EXTERNAL_ADDR | | {ABS4,%[1.off]+"+"+tostring($1)} | |
|
... | nocoercions: EXTERNAL_ADDR | | {ABS4,%[1.off]+"+"+tostring($1)} | |
|
||||||
... | nocoercions: LOCAL_ADDR | | {DISPL4,LB,%[1.off]+$1} | |
|
... | nocoercions: LOCAL_ADDR | | {DISPL4,LB,%[1.off]+$1} | |
|
||||||
|
... | nocoercions: REGOFF_ADDR | | {DISPL4,%[1.reg],%[1.off]+$1} | |
|
||||||
lal | | | {LOCAL_ADDR,$1} | |
|
lal | | | {LOCAL_ADDR,$1} | |
|
||||||
| LOCAL_ADDR | allocate(ADDREG)
|
| LOCAL_ADDR | allocate(ADDREG)
|
||||||
"lea %[1.off](a6),%[a]"
|
"lea %[1.off](a6),%[a]"
|
||||||
samecc | %[a] | |
|
samecc | %[a] | |
|
||||||
|
| REGOFF_ADDR | allocate(ADDREG)
|
||||||
|
"lea %[1.off](%[1.reg]),%[a]"
|
||||||
|
samecc | %[a] | |
|
||||||
lae | | | {EXTERNAL_ADDR,$1} | |
|
lae | | | {EXTERNAL_ADDR,$1} | |
|
||||||
| EXTERNAL_ADDR | allocate(ADDREG)
|
| EXTERNAL_ADDR | allocate(ADDREG)
|
||||||
"lea %[1.off],%[a]"
|
"lea %[1.off],%[a]"
|
||||||
|
@ -230,6 +239,7 @@ lxa | STACK | "move.w #$1,-(sp)"
|
||||||
"jsr .lxa" | A0 | |
|
"jsr .lxa" | A0 | |
|
||||||
loi $1 == 1 | ADDREG | | {IADDREG1, %[1]} | |
|
loi $1 == 1 | ADDREG | | {IADDREG1, %[1]} | |
|
||||||
... | nocoercions: LOCAL_ADDR | | {DISPL1,LB,%[1.off]} | |
|
... | nocoercions: LOCAL_ADDR | | {DISPL1,LB,%[1.off]} | |
|
||||||
|
... | nocoercions: REGOFF_ADDR | | {DISPL1,%[1.reg],%[1.off]} | |
|
||||||
... | nocoercions: EXTERNAL_ADDR | | {ABS1,%[1.off]} | |
|
... | nocoercions: EXTERNAL_ADDR | | {ABS1,%[1.off]} | |
|
||||||
loi $1 == 2 | ADDREG | | {IADDREG,%[1]} | |
|
loi $1 == 2 | ADDREG | | {IADDREG,%[1]} | |
|
||||||
loi $1 == 4 | ADDREG | | {IADDREG4,%[1]} | |
|
loi $1 == 4 | ADDREG | | {IADDREG4,%[1]} | |
|
||||||
|
@ -245,7 +255,9 @@ lae loi $2 == 6 | | remove(ALL)
|
||||||
lae loi $2 == 8 | | remove(ALL)
|
lae loi $2 == 8 | | remove(ALL)
|
||||||
"move.l $1+4,-(sp)"
|
"move.l $1+4,-(sp)"
|
||||||
"move.l $1,-(sp)" | | |
|
"move.l $1,-(sp)" | | |
|
||||||
loi $1 > 4 | ADDSCR | remove(ALL)
|
loi $1 == 6 | ADDREG | | {DISPL,%[1],4} {IADDREG4,%[1]} | |
|
||||||
|
loi $1 == 8 | ADDREG | | {DISPL4,%[1],4} {IADDREG4,%[1]} | |
|
||||||
|
loi $1 > 8 | ADDSCR | remove(ALL)
|
||||||
allocate(DATAREG4= {IMMEDIATE4,$1/2-1})
|
allocate(DATAREG4= {IMMEDIATE4,$1/2-1})
|
||||||
"add.l #$1,%[1]"
|
"add.l #$1,%[1]"
|
||||||
"1:"
|
"1:"
|
||||||
|
@ -299,10 +311,12 @@ lpi | | | {EXTERNAL_ADDR,$1} | |
|
||||||
|
|
||||||
|
|
||||||
#ifdef REGVARS
|
#ifdef REGVARS
|
||||||
stl inreg($1)==2 | ANY | remove(regvar($1))
|
stl inreg($1)==2 | nocoercions: ANY | remove(regvar($1))
|
||||||
move(%[1],regvar($1)) | | |
|
move(%[1],regvar($1)) | | |
|
||||||
|
... | STACK |
|
||||||
|
"move.w (sp)+,%(regvar($1)%)" | | |
|
||||||
#endif
|
#endif
|
||||||
stl | ANY | remove(DISPL,%[reg] == LB && %[dis] == $1)
|
stl | nocoercions: ANY | remove(DISPL,%[reg] == LB && %[dis] == $1)
|
||||||
remove(DISPL4,%[reg] == LB && (%[dis] == $1-2 ||
|
remove(DISPL4,%[reg] == LB && (%[dis] == $1-2 ||
|
||||||
%[dis] == $1))
|
%[dis] == $1))
|
||||||
remove(DISPL1,%[reg] == LB && (%[dis] == $1 ||
|
remove(DISPL1,%[reg] == LB && (%[dis] == $1 ||
|
||||||
|
@ -312,6 +326,8 @@ stl | ANY | remove(DISPL,%[reg] == LB && %[dis] == $1)
|
||||||
remove(DISPL1,%[reg] != LB)
|
remove(DISPL1,%[reg] != LB)
|
||||||
remove(ALL_ACCESSIBLE)
|
remove(ALL_ACCESSIBLE)
|
||||||
move(%[1],{DISPL,LB,$1}) | | |
|
move(%[1],{DISPL,LB,$1}) | | |
|
||||||
|
... | STACK |
|
||||||
|
"move.w (sp)+,$1(a6)" | | |
|
||||||
ste | ANY |
|
ste | ANY |
|
||||||
remove(ABS)
|
remove(ABS)
|
||||||
remove(ABS4)
|
remove(ABS4)
|
||||||
|
@ -378,6 +394,29 @@ sti $1 == 1
|
||||||
... | nocoercions: LOCAL_ADDR ANY1 |
|
... | nocoercions: LOCAL_ADDR ANY1 |
|
||||||
remove(MEM_ALL)
|
remove(MEM_ALL)
|
||||||
move(%[2],{DISPL1,LB,%[1.off]}) | | |
|
move(%[2],{DISPL1,LB,%[1.off]}) | | |
|
||||||
|
... | nocoercions: REGOFF_ADDR DATAREG |
|
||||||
|
remove(MEM_ALL)
|
||||||
|
move(%[2], {DISPL1,%[1.reg],%[1.off]}) | | |
|
||||||
|
... | nocoercions: REGOFF_ADDR IADDREG |
|
||||||
|
remove(MEM_ALL)
|
||||||
|
move({DISPL,%[2.reg],1}, {DISPL1,%[1.reg],%[1.off]}) | | |
|
||||||
|
... | nocoercions: REGOFF_ADDR DISPL |
|
||||||
|
remove(MEM_ALL)
|
||||||
|
move({DISPL,%[2.reg],%[2.dis]+1}, {DISPL1,%[1.reg],%[1.off]}) | | |
|
||||||
|
... | nocoercions: REGOFF_ADDR INDEXED |
|
||||||
|
remove(MEM_ALL)
|
||||||
|
move({INDEXED,%[2.reg],%[2.ireg],%[2.di]+1},
|
||||||
|
{DISPL1,%[1.reg],%[1.off]}) | | |
|
||||||
|
... | nocoercions: REGOFF_ADDR ABS |
|
||||||
|
remove(MEM_ALL)
|
||||||
|
move({ABS,%[2.addr]+"+1"}, {DISPL1,%[1.reg],%[1.off]}) | | |
|
||||||
|
... | nocoercions: REGOFF_ADDR IMMEDIATE |
|
||||||
|
remove(MEM_ALL)
|
||||||
|
move({IMMEDIATE,(%[2.cc]-((%[2.cc]>>8)<<8)+128)%256-128},
|
||||||
|
{DISPL1,%[1.reg],%[1.off]}) | | |
|
||||||
|
... | nocoercions: REGOFF_ADDR ANY1 |
|
||||||
|
remove(MEM_ALL)
|
||||||
|
move(%[2],{DISPL1,%[1.reg],%[1.off]}) | | |
|
||||||
... | nocoercions: EXTERNAL_ADDR DATAREG |
|
... | nocoercions: EXTERNAL_ADDR DATAREG |
|
||||||
remove(MEM_ALL)
|
remove(MEM_ALL)
|
||||||
move(%[2], {ABS1,%[1.off]}) | | |
|
move(%[2], {ABS1,%[1.off]}) | | |
|
||||||
|
@ -415,10 +454,13 @@ sts $1 == 2 | | remove(ALL)
|
||||||
"jsr .sts"
|
"jsr .sts"
|
||||||
| | |
|
| | |
|
||||||
#ifdef REGVARS
|
#ifdef REGVARS
|
||||||
sdl inreg($1)==2 | ANY4 | remove(regvar($1))
|
sdl inreg($1)==2 | nocoercions: ANY4 | remove(regvar($1))
|
||||||
move (%[1],regvar($1)) | | |
|
move (%[1],regvar($1)) | | |
|
||||||
|
... | STACK |
|
||||||
|
"move.l (sp)+,%(regvar($1)%)" | | |
|
||||||
#endif
|
#endif
|
||||||
sdl | ANY4 | remove(DISPL,%[reg] == LB && (%[dis] == $1 || %[dis] == $1+2))
|
sdl | nocoercions: ANY4 |
|
||||||
|
remove(DISPL,%[reg] == LB && (%[dis] == $1 || %[dis] == $1+2))
|
||||||
remove(DISPL4,%[reg] == LB && (%[dis] >= $1-2 &&
|
remove(DISPL4,%[reg] == LB && (%[dis] >= $1-2 &&
|
||||||
%[dis] <= $1+2))
|
%[dis] <= $1+2))
|
||||||
remove(DISPL1,%[reg] == LB && (%[dis] >= $1 &&
|
remove(DISPL1,%[reg] == LB && (%[dis] >= $1 &&
|
||||||
|
@ -428,6 +470,8 @@ sdl | ANY4 | remove(DISPL,%[reg] == LB && (%[dis] == $1 || %[dis] == $1+2))
|
||||||
remove(DISPL1,%[reg] != LB)
|
remove(DISPL1,%[reg] != LB)
|
||||||
remove(ALL_ACCESSIBLE)
|
remove(ALL_ACCESSIBLE)
|
||||||
move(%[1],{DISPL4,LB,$1}) | | |
|
move(%[1],{DISPL4,LB,$1}) | | |
|
||||||
|
... | STACK |
|
||||||
|
"move.l (sp)+,$1(a6)" | | |
|
||||||
sde | ANY4 |
|
sde | ANY4 |
|
||||||
remove(ABS)
|
remove(ABS)
|
||||||
remove(ABS4)
|
remove(ABS4)
|
||||||
|
@ -555,6 +599,10 @@ ldl ldl adp sdl $1 == $2 && $2 == $4 && inreg($1)==2 | |
|
||||||
ldl adp sdl $1 == $3 && inreg($1)==2 | | remove(regvar($1))
|
ldl adp sdl $1 == $3 && inreg($1)==2 | | remove(regvar($1))
|
||||||
"add.l #$2,%(regvar($1)%)"
|
"add.l #$2,%(regvar($1)%)"
|
||||||
erase(regvar($1)) | | |
|
erase(regvar($1)) | | |
|
||||||
|
ldl loi ldl loi adp ldl sti $2==4&&$4==4&&$7==4&&$1==$3&&$1==$6&&inreg($1)==2
|
||||||
|
| | remove(MEM_ALL)
|
||||||
|
allocate(ADDREG = {IADDREG4,regvar($1)})
|
||||||
|
"add.l #$5,(%(regvar($1)%))" | %[a] | |
|
||||||
loc ldl ads sdl $2 == $4 && $3 == 2 && inreg($2)==2 | |
|
loc ldl ads sdl $2 == $4 && $3 == 2 && inreg($2)==2 | |
|
||||||
remove(regvar($2))
|
remove(regvar($2))
|
||||||
"add.l #$1,%(regvar($2)%)"
|
"add.l #$1,%(regvar($2)%)"
|
||||||
|
@ -569,10 +617,12 @@ ldc ldl ads sdl $2 == $4 && $3 == 4 && inreg($2)==2 | |
|
||||||
erase(regvar($2)) | | |
|
erase(regvar($2)) | | |
|
||||||
lil inc sil $1==$3 && inreg($1)==2 | |
|
lil inc sil $1==$3 && inreg($1)==2 | |
|
||||||
remove(MEM_ALL)
|
remove(MEM_ALL)
|
||||||
"add.w #1,(%(regvar($1)%))" | | |
|
"add.w #1,(%(regvar($1)%))"
|
||||||
|
setcc({IADDREG,regvar($1)}) | | |
|
||||||
lil dec sil $1==$3 && inreg($1)==2 | |
|
lil dec sil $1==$3 && inreg($1)==2 | |
|
||||||
remove(MEM_ALL)
|
remove(MEM_ALL)
|
||||||
"sub.w #1,(%(regvar($1)%))" | | |
|
"sub.w #1,(%(regvar($1)%))"
|
||||||
|
setcc({IADDREG,regvar($1)}) | | |
|
||||||
lol and stl $1 == $3 && $2 == 2 && inreg($1)==2 | ANY |
|
lol and stl $1 == $3 && $2 == 2 && inreg($1)==2 | ANY |
|
||||||
remove(regvar($1))
|
remove(regvar($1))
|
||||||
"and.w %[1],%(regvar($1)%)"
|
"and.w %[1],%(regvar($1)%)"
|
||||||
|
@ -928,12 +978,24 @@ slu | | | | sli $1 |
|
||||||
|
|
||||||
/* G R O U P VI : P O I N T E R A R I T H M E T I C */
|
/* G R O U P VI : P O I N T E R A R I T H M E T I C */
|
||||||
|
|
||||||
adp $1 >= 1 && $1 <= 8 | ADDSCR | "add.l #$1,%[1]"
|
adp $1 >= 1 && $1 <= 8
|
||||||
|
| nocoercions: EXTERNAL_ADDR | | {EXTERNAL_ADDR,%[1.off] + "+"
|
||||||
|
+ tostring($1)} | |
|
||||||
|
... | nocoercions: LOCAL_ADDR | | {LOCAL_ADDR,%[1.off]+$1} | |
|
||||||
|
... | nocoercions: REGOFF_ADDR | | {REGOFF_ADDR,%[1.reg],%[1.off]+$1} | |
|
||||||
|
... | nocoercions: ADDREG | | {REGOFF_ADDR,%[1],$1} | |
|
||||||
|
... | ADDSCR | "add.l #$1,%[1]"
|
||||||
erase(%[1])
|
erase(%[1])
|
||||||
setcc(%[1]) | %[1] | |
|
setcc(%[1]) | %[1] | |
|
||||||
adp | ADDSCR | "lea $1(%[1]),%[1]"
|
adp | nocoercions: EXTERNAL_ADDR | | {EXTERNAL_ADDR,%[1.off] + "+"
|
||||||
|
+ tostring($1)} | |
|
||||||
|
... | nocoercions: LOCAL_ADDR | | {LOCAL_ADDR,%[1.off]+$1} | |
|
||||||
|
... | nocoercions: REGOFF_ADDR | | {REGOFF_ADDR,%[1.reg],%[1.off]+$1} | |
|
||||||
|
... | nocoercions: ADDREG | | {REGOFF_ADDR,%[1],$1} | |
|
||||||
|
... | ADDSCR | "lea $1(%[1]),%[1]"
|
||||||
erase(%[1])
|
erase(%[1])
|
||||||
setcc(%[1]) | %[1] | |
|
setcc(%[1]) | %[1] | |
|
||||||
|
|
||||||
/* The next patterns are for efficient translation of "*p++" in C */
|
/* The next patterns are for efficient translation of "*p++" in C */
|
||||||
ldl ldl adp sdl $1 == $2 && $2 == $4 | |
|
ldl ldl adp sdl $1 == $2 && $2 == $4 | |
|
||||||
allocate(ADDREG={DISPL4,LB,$1})
|
allocate(ADDREG={DISPL4,LB,$1})
|
||||||
|
@ -1002,10 +1064,12 @@ inc | DATASCR | "add.w #1,%[1]"
|
||||||
#ifdef REGVARS
|
#ifdef REGVARS
|
||||||
lil inc sil $1==$3 && inreg($1) == 2 | |
|
lil inc sil $1==$3 && inreg($1) == 2 | |
|
||||||
remove(MEM_ALL)
|
remove(MEM_ALL)
|
||||||
"add.w #1,(%(regvar($1)%))" | | |
|
"add.w #1,(%(regvar($1)%))"
|
||||||
|
setcc({IADDREG,regvar($1)}) | | |
|
||||||
lil dec sil $1==$3 && inreg($1) == 2 | |
|
lil dec sil $1==$3 && inreg($1) == 2 | |
|
||||||
remove(MEM_ALL)
|
remove(MEM_ALL)
|
||||||
"sub.w #1,(%(regvar($1)%))" | | |
|
"sub.w #1,(%(regvar($1)%))"
|
||||||
|
setcc({IADDREG,regvar($1)}) | | |
|
||||||
#endif
|
#endif
|
||||||
lil inc sil $1==$3 | | allocate(ADDREG={DISPL4,LB,$1})
|
lil inc sil $1==$3 | | allocate(ADDREG={DISPL4,LB,$1})
|
||||||
remove(MEM_ALL)
|
remove(MEM_ALL)
|
||||||
|
@ -2580,6 +2644,7 @@ STACKS:
|
||||||
(ANY, , "move.w %[1],-(sp)" setcc(%[1]), (2,4) + %[1])
|
(ANY, , "move.w %[1],-(sp)" setcc(%[1]), (2,4) + %[1])
|
||||||
(EXTERNAL_ADDR, , "pea %[1.off]" nocc)
|
(EXTERNAL_ADDR, , "pea %[1.off]" nocc)
|
||||||
(LOCAL_ADDR, , "pea %[1.off](a6)" nocc)
|
(LOCAL_ADDR, , "pea %[1.off](a6)" nocc)
|
||||||
|
(REGOFF_ADDR, , "pea %[1.off](%[1.reg])" nocc)
|
||||||
(INDEX_ADDR, , "pea %[1.di](%[1.reg],%[1.ireg].w)" nocc)
|
(INDEX_ADDR, , "pea %[1.di](%[1.reg],%[1.ireg].w)" nocc)
|
||||||
(IMMEDIATE4 %[cc] == 0, , "clr.l -(sp)")
|
(IMMEDIATE4 %[cc] == 0, , "clr.l -(sp)")
|
||||||
(IMMEDIATE4, , "pea %[1.cc]" nocc)
|
(IMMEDIATE4, , "pea %[1.cc]" nocc)
|
||||||
|
|
Loading…
Reference in a new issue