do not depend on SP for restoring registers
This commit is contained in:
parent
13c2a9a2a5
commit
f2c241fe3a
4 changed files with 56 additions and 96 deletions
|
@ -184,13 +184,6 @@ con_float() {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MOVEM_LIMIT 2
|
|
||||||
/* If #registers to be saved exceeds MOVEM_LIMIT, we
|
|
||||||
* use the movem instruction to save registers; else
|
|
||||||
* we simply use several move.l's.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
regscore(off,size,typ,score,totyp)
|
regscore(off,size,typ,score,totyp)
|
||||||
long off;
|
long off;
|
||||||
{
|
{
|
||||||
|
@ -238,18 +231,16 @@ regreturn()
|
||||||
{
|
{
|
||||||
register struct regsav_t *p;
|
register struct regsav_t *p;
|
||||||
|
|
||||||
if (regnr > MOVEM_LIMIT) {
|
if (regnr > 1) {
|
||||||
fputs("movem.l (sp)+,", codefile);
|
fprintf(codefile,"movem.l -%ld(a6),", nlocals);
|
||||||
for (p = regsav; ;) {
|
for (p = regsav; ;) {
|
||||||
fputs(p->rs_reg, codefile);
|
fputs(p->rs_reg, codefile);
|
||||||
if (++p == ®sav[regnr]) break;
|
if (++p == ®sav[regnr]) break;
|
||||||
putc('/',codefile);
|
putc('/',codefile);
|
||||||
}
|
}
|
||||||
putc('\n',codefile);
|
putc('\n',codefile);
|
||||||
} else {
|
} else if (regnr == 1) {
|
||||||
for (p = ®sav[regnr-1]; p >= regsav; p--) {
|
fprintf(codefile,"move.l -%ld(a6),%s\n",nlocals);
|
||||||
fprintf(codefile,"move.l (sp)+,%s\n",p->rs_reg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
fputs("unlk a6\nrts\n", codefile);
|
fputs("unlk a6\nrts\n", codefile);
|
||||||
}
|
}
|
||||||
|
@ -258,18 +249,22 @@ f_regsave()
|
||||||
{
|
{
|
||||||
register struct regsav_t *p;
|
register struct regsav_t *p;
|
||||||
|
|
||||||
if (regnr > MOVEM_LIMIT) {
|
nlocals += regnr*4;
|
||||||
|
#ifdef TBL68020
|
||||||
|
fprintf(codefile,"link\ta6,#-%ld\n",nlocals);
|
||||||
|
#else
|
||||||
|
fprintf(codefile,"tst.b -%ld(sp)\nlink\ta6,#-%ld\n",nlocals+40,nlocals);
|
||||||
|
#endif
|
||||||
|
if (regnr > 1) {
|
||||||
fputs("movem.l ", codefile);
|
fputs("movem.l ", codefile);
|
||||||
for (p = regsav; ;) {
|
for (p = regsav; ;) {
|
||||||
fputs(p->rs_reg, codefile);
|
fputs(p->rs_reg, codefile);
|
||||||
if (++p == ®sav[regnr]) break;
|
if (++p == ®sav[regnr]) break;
|
||||||
putc('/',codefile);
|
putc('/',codefile);
|
||||||
}
|
}
|
||||||
fputs(",-(sp)\n", codefile);
|
fputs(",(sp)\n", codefile);
|
||||||
} else {
|
} else if (regnr == 1) {
|
||||||
for (p = regsav; p < ®sav[regnr]; p++) {
|
fprintf(codefile,"move.l %s,(sp)\n",p->rs_reg);
|
||||||
fprintf(codefile,"move.l %s,-(sp)\n",p->rs_reg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* initialise register-parameters */
|
/* initialise register-parameters */
|
||||||
for (p = regsav; p < ®sav[regnr]; p++) {
|
for (p = regsav; p < ®sav[regnr]; p++) {
|
||||||
|
@ -300,11 +295,6 @@ regsave(s,off,size)
|
||||||
prolog(n) full n; {
|
prolog(n) full n; {
|
||||||
|
|
||||||
nlocals = n;
|
nlocals = n;
|
||||||
#ifdef TBL68020
|
|
||||||
fprintf(codefile,"link\ta6,#-%ld\n",n);
|
|
||||||
#else
|
|
||||||
fprintf(codefile,"tst.b -%ld(sp)\nlink\ta6,#-%ld\n",n+40,n);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -184,13 +184,6 @@ con_float() {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MOVEM_LIMIT 2
|
|
||||||
/* If #registers to be saved exceeds MOVEM_LIMIT, we
|
|
||||||
* use the movem instruction to save registers; else
|
|
||||||
* we simply use several move.l's.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
regscore(off,size,typ,score,totyp)
|
regscore(off,size,typ,score,totyp)
|
||||||
long off;
|
long off;
|
||||||
{
|
{
|
||||||
|
@ -238,18 +231,16 @@ regreturn()
|
||||||
{
|
{
|
||||||
register struct regsav_t *p;
|
register struct regsav_t *p;
|
||||||
|
|
||||||
if (regnr > MOVEM_LIMIT) {
|
if (regnr > 1) {
|
||||||
fputs("movem.l (sp)+,", codefile);
|
fprintf(codefile,"movem.l -%ld(a6),", nlocals);
|
||||||
for (p = regsav; ;) {
|
for (p = regsav; ;) {
|
||||||
fputs(p->rs_reg, codefile);
|
fputs(p->rs_reg, codefile);
|
||||||
if (++p == ®sav[regnr]) break;
|
if (++p == ®sav[regnr]) break;
|
||||||
putc('/',codefile);
|
putc('/',codefile);
|
||||||
}
|
}
|
||||||
putc('\n',codefile);
|
putc('\n',codefile);
|
||||||
} else {
|
} else if (regnr == 1) {
|
||||||
for (p = ®sav[regnr-1]; p >= regsav; p--) {
|
fprintf(codefile,"move.l -%ld(a6),%s\n",nlocals);
|
||||||
fprintf(codefile,"move.l (sp)+,%s\n",p->rs_reg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
fputs("unlk a6\nrts\n", codefile);
|
fputs("unlk a6\nrts\n", codefile);
|
||||||
}
|
}
|
||||||
|
@ -258,18 +249,22 @@ f_regsave()
|
||||||
{
|
{
|
||||||
register struct regsav_t *p;
|
register struct regsav_t *p;
|
||||||
|
|
||||||
if (regnr > MOVEM_LIMIT) {
|
nlocals += regnr*4;
|
||||||
|
#ifdef TBL68020
|
||||||
|
fprintf(codefile,"link\ta6,#-%ld\n",nlocals);
|
||||||
|
#else
|
||||||
|
fprintf(codefile,"tst.b -%ld(sp)\nlink\ta6,#-%ld\n",nlocals+40,nlocals);
|
||||||
|
#endif
|
||||||
|
if (regnr > 1) {
|
||||||
fputs("movem.l ", codefile);
|
fputs("movem.l ", codefile);
|
||||||
for (p = regsav; ;) {
|
for (p = regsav; ;) {
|
||||||
fputs(p->rs_reg, codefile);
|
fputs(p->rs_reg, codefile);
|
||||||
if (++p == ®sav[regnr]) break;
|
if (++p == ®sav[regnr]) break;
|
||||||
putc('/',codefile);
|
putc('/',codefile);
|
||||||
}
|
}
|
||||||
fputs(",-(sp)\n", codefile);
|
fputs(",(sp)\n", codefile);
|
||||||
} else {
|
} else if (regnr == 1) {
|
||||||
for (p = regsav; p < ®sav[regnr]; p++) {
|
fprintf(codefile,"move.l %s,(sp)\n",p->rs_reg);
|
||||||
fprintf(codefile,"move.l %s,-(sp)\n",p->rs_reg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* initialise register-parameters */
|
/* initialise register-parameters */
|
||||||
for (p = regsav; p < ®sav[regnr]; p++) {
|
for (p = regsav; p < ®sav[regnr]; p++) {
|
||||||
|
@ -300,11 +295,6 @@ regsave(s,off,size)
|
||||||
prolog(n) full n; {
|
prolog(n) full n; {
|
||||||
|
|
||||||
nlocals = n;
|
nlocals = n;
|
||||||
#ifdef TBL68020
|
|
||||||
fprintf(codefile,"link\ta6,#-%ld\n",n);
|
|
||||||
#else
|
|
||||||
fprintf(codefile,"tst.b -%ld(sp)\nlink\ta6,#-%ld\n",n+40,n);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -184,13 +184,6 @@ con_float() {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MOVEM_LIMIT 2
|
|
||||||
/* If #registers to be saved exceeds MOVEM_LIMIT, we
|
|
||||||
* use the movem instruction to save registers; else
|
|
||||||
* we simply use several move.l's.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
regscore(off,size,typ,score,totyp)
|
regscore(off,size,typ,score,totyp)
|
||||||
long off;
|
long off;
|
||||||
{
|
{
|
||||||
|
@ -238,18 +231,16 @@ regreturn()
|
||||||
{
|
{
|
||||||
register struct regsav_t *p;
|
register struct regsav_t *p;
|
||||||
|
|
||||||
if (regnr > MOVEM_LIMIT) {
|
if (regnr > 1) {
|
||||||
fputs("movem.l (sp)+,", codefile);
|
fprintf(codefile,"movem.l -%ld(a6),", nlocals);
|
||||||
for (p = regsav; ;) {
|
for (p = regsav; ;) {
|
||||||
fputs(p->rs_reg, codefile);
|
fputs(p->rs_reg, codefile);
|
||||||
if (++p == ®sav[regnr]) break;
|
if (++p == ®sav[regnr]) break;
|
||||||
putc('/',codefile);
|
putc('/',codefile);
|
||||||
}
|
}
|
||||||
putc('\n',codefile);
|
putc('\n',codefile);
|
||||||
} else {
|
} else if (regnr == 1) {
|
||||||
for (p = ®sav[regnr-1]; p >= regsav; p--) {
|
fprintf(codefile,"move.l -%ld(a6),%s\n",nlocals);
|
||||||
fprintf(codefile,"move.l (sp)+,%s\n",p->rs_reg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
fputs("unlk a6\nrts\n", codefile);
|
fputs("unlk a6\nrts\n", codefile);
|
||||||
}
|
}
|
||||||
|
@ -258,18 +249,22 @@ f_regsave()
|
||||||
{
|
{
|
||||||
register struct regsav_t *p;
|
register struct regsav_t *p;
|
||||||
|
|
||||||
if (regnr > MOVEM_LIMIT) {
|
nlocals += regnr*4;
|
||||||
|
#ifdef TBL68020
|
||||||
|
fprintf(codefile,"link\ta6,#-%ld\n",nlocals);
|
||||||
|
#else
|
||||||
|
fprintf(codefile,"tst.b -%ld(sp)\nlink\ta6,#-%ld\n",nlocals+40,nlocals);
|
||||||
|
#endif
|
||||||
|
if (regnr > 1) {
|
||||||
fputs("movem.l ", codefile);
|
fputs("movem.l ", codefile);
|
||||||
for (p = regsav; ;) {
|
for (p = regsav; ;) {
|
||||||
fputs(p->rs_reg, codefile);
|
fputs(p->rs_reg, codefile);
|
||||||
if (++p == ®sav[regnr]) break;
|
if (++p == ®sav[regnr]) break;
|
||||||
putc('/',codefile);
|
putc('/',codefile);
|
||||||
}
|
}
|
||||||
fputs(",-(sp)\n", codefile);
|
fputs(",(sp)\n", codefile);
|
||||||
} else {
|
} else if (regnr == 1) {
|
||||||
for (p = regsav; p < ®sav[regnr]; p++) {
|
fprintf(codefile,"move.l %s,(sp)\n",p->rs_reg);
|
||||||
fprintf(codefile,"move.l %s,-(sp)\n",p->rs_reg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* initialise register-parameters */
|
/* initialise register-parameters */
|
||||||
for (p = regsav; p < ®sav[regnr]; p++) {
|
for (p = regsav; p < ®sav[regnr]; p++) {
|
||||||
|
@ -300,11 +295,6 @@ regsave(s,off,size)
|
||||||
prolog(n) full n; {
|
prolog(n) full n; {
|
||||||
|
|
||||||
nlocals = n;
|
nlocals = n;
|
||||||
#ifdef TBL68020
|
|
||||||
fprintf(codefile,"link\ta6,#-%ld\n",n);
|
|
||||||
#else
|
|
||||||
fprintf(codefile,"tst.b -%ld(sp)\nlink\ta6,#-%ld\n",n+40,n);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -184,13 +184,6 @@ con_float() {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MOVEM_LIMIT 2
|
|
||||||
/* If #registers to be saved exceeds MOVEM_LIMIT, we
|
|
||||||
* use the movem instruction to save registers; else
|
|
||||||
* we simply use several move.l's.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
regscore(off,size,typ,score,totyp)
|
regscore(off,size,typ,score,totyp)
|
||||||
long off;
|
long off;
|
||||||
{
|
{
|
||||||
|
@ -238,18 +231,16 @@ regreturn()
|
||||||
{
|
{
|
||||||
register struct regsav_t *p;
|
register struct regsav_t *p;
|
||||||
|
|
||||||
if (regnr > MOVEM_LIMIT) {
|
if (regnr > 1) {
|
||||||
fputs("movem.l (sp)+,", codefile);
|
fprintf(codefile,"movem.l -%ld(a6),", nlocals);
|
||||||
for (p = regsav; ;) {
|
for (p = regsav; ;) {
|
||||||
fputs(p->rs_reg, codefile);
|
fputs(p->rs_reg, codefile);
|
||||||
if (++p == ®sav[regnr]) break;
|
if (++p == ®sav[regnr]) break;
|
||||||
putc('/',codefile);
|
putc('/',codefile);
|
||||||
}
|
}
|
||||||
putc('\n',codefile);
|
putc('\n',codefile);
|
||||||
} else {
|
} else if (regnr == 1) {
|
||||||
for (p = ®sav[regnr-1]; p >= regsav; p--) {
|
fprintf(codefile,"move.l -%ld(a6),%s\n",nlocals);
|
||||||
fprintf(codefile,"move.l (sp)+,%s\n",p->rs_reg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
fputs("unlk a6\nrts\n", codefile);
|
fputs("unlk a6\nrts\n", codefile);
|
||||||
}
|
}
|
||||||
|
@ -258,18 +249,22 @@ f_regsave()
|
||||||
{
|
{
|
||||||
register struct regsav_t *p;
|
register struct regsav_t *p;
|
||||||
|
|
||||||
if (regnr > MOVEM_LIMIT) {
|
nlocals += regnr*4;
|
||||||
|
#ifdef TBL68020
|
||||||
|
fprintf(codefile,"link\ta6,#-%ld\n",nlocals);
|
||||||
|
#else
|
||||||
|
fprintf(codefile,"tst.b -%ld(sp)\nlink\ta6,#-%ld\n",nlocals+40,nlocals);
|
||||||
|
#endif
|
||||||
|
if (regnr > 1) {
|
||||||
fputs("movem.l ", codefile);
|
fputs("movem.l ", codefile);
|
||||||
for (p = regsav; ;) {
|
for (p = regsav; ;) {
|
||||||
fputs(p->rs_reg, codefile);
|
fputs(p->rs_reg, codefile);
|
||||||
if (++p == ®sav[regnr]) break;
|
if (++p == ®sav[regnr]) break;
|
||||||
putc('/',codefile);
|
putc('/',codefile);
|
||||||
}
|
}
|
||||||
fputs(",-(sp)\n", codefile);
|
fputs(",(sp)\n", codefile);
|
||||||
} else {
|
} else if (regnr == 1) {
|
||||||
for (p = regsav; p < ®sav[regnr]; p++) {
|
fprintf(codefile,"move.l %s,(sp)\n",p->rs_reg);
|
||||||
fprintf(codefile,"move.l %s,-(sp)\n",p->rs_reg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* initialise register-parameters */
|
/* initialise register-parameters */
|
||||||
for (p = regsav; p < ®sav[regnr]; p++) {
|
for (p = regsav; p < ®sav[regnr]; p++) {
|
||||||
|
@ -300,11 +295,6 @@ regsave(s,off,size)
|
||||||
prolog(n) full n; {
|
prolog(n) full n; {
|
||||||
|
|
||||||
nlocals = n;
|
nlocals = n;
|
||||||
#ifdef TBL68020
|
|
||||||
fprintf(codefile,"link\ta6,#-%ld\n",n);
|
|
||||||
#else
|
|
||||||
fprintf(codefile,"tst.b -%ld(sp)\nlink\ta6,#-%ld\n",n+40,n);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue