refactor gensaverestore()

This commit is contained in:
Walter Bright 2024-06-17 20:49:15 -07:00 committed by The Dlang Bot
parent 179e8d68eb
commit 3457a5902d
3 changed files with 14 additions and 17 deletions

1
.gitignore vendored
View file

@ -2,6 +2,7 @@
*.deps *.deps
.B* .B*
*~ *~
/compiler/src/bug2
/compiler/test/test_results /compiler/test/test_results
/compiler/test/trace.def /compiler/test/trace.def
/compiler/test/trace.log /compiler/test/trace.log

View file

@ -112,7 +112,7 @@ struct REGSAVE
nothrow: nothrow:
@trusted @trusted
void reset() { off = 0; top = 0; idx = 0; alignment = _tysize[TYnptr]/*REGSIZE*/; } void reset() { off = 0; top = 0; idx = 0; alignment = _tysize[TYnptr]/*REGSIZE*/; }
void save(ref CodeBuilder cdb, reg_t reg, uint *pidx) { REGSAVE_save(this, cdb, reg, *pidx); } void save(ref CodeBuilder cdb, reg_t reg, out uint pidx) { REGSAVE_save (this, cdb, reg, pidx); }
void restore(ref CodeBuilder cdb, reg_t reg, uint idx) { REGSAVE_restore(this, cdb, reg, idx); } void restore(ref CodeBuilder cdb, reg_t reg, uint idx) { REGSAVE_restore(this, cdb, reg, idx); }
} }

View file

@ -345,46 +345,42 @@ uint gensaverestore(regm_t regm,ref CodeBuilder cdbsave,ref CodeBuilder cdbresto
uint stackused = 0; uint stackused = 0;
code *[regm.sizeof * 8] restore; code *[regm.sizeof * 8] restore = void;
reg_t i; reg_t i;
for (i = 0; regm; i++) for (i = 0; regm; i++)
{ {
if (regm & 1) if (regm & 1)
{ {
code *cs2; CodeBuilder cdb;
cdb.ctor();
if (i == ES && I16) if (i == ES && I16)
{ {
stackused += REGSIZE; stackused += REGSIZE;
cdbsave.gen1(0x06); // PUSH ES cdbsave.gen1(0x06); // PUSH ES
cs2 = gen1(null, 0x07); // POP ES cdb.gen1(0x07); // POP ES
} }
else if (i == ST0 || i == ST01) else if (i == ST0 || i == ST01)
{ {
CodeBuilder cdb;
cdb.ctor();
gensaverestore87(1 << i, cdbsave, cdb); gensaverestore87(1 << i, cdbsave, cdb);
cs2 = cdb.finish();
} }
else if (i >= XMM0 || I64 || cgstate.funcarg.size) else if (i >= XMM0 || I64 || cgstate.funcarg.size)
{ uint idx; {
cgstate.regsave.save(cdbsave, i, &idx); uint idx;
CodeBuilder cdb; cgstate.regsave.save(cdbsave, i, idx);
cdb.ctor();
cgstate.regsave.restore(cdb, i, idx); cgstate.regsave.restore(cdb, i, idx);
cs2 = cdb.finish();
} }
else else
{ {
stackused += REGSIZE; stackused += REGSIZE;
cdbsave.gen1(0x50 + (i & 7)); // PUSH i cdbsave.gen1(0x50 + (i & 7)); // PUSH i
cs2 = gen1(null, 0x58 + (i & 7)); // POP i cdb.gen1(0x58 + (i & 7)); // POP i
if (i & 8) if (i & 8)
{ code_orrex(cdbsave.last(), REX_B); { code_orrex(cdbsave.last(), REX_B);
code_orrex(cs2, REX_B); code_orrex(cdb.last(), REX_B);
} }
} }
restore[i] = cs2; restore[i] = cdb.finish();
} }
else else
restore[i] = null; restore[i] = null;
@ -3511,7 +3507,7 @@ void cdfunc(ref CGstate cg, ref CodeBuilder cdb, elem* e, regm_t* pretregs)
if (mi & tosave) if (mi & tosave)
{ {
uint idx; uint idx;
cgstate.regsave.save(cdbsave, j, &idx); cgstate.regsave.save(cdbsave, j, idx);
cgstate.regsave.restore(cdbrestore, j, idx); cgstate.regsave.restore(cdbrestore, j, idx);
saved |= mi; saved |= mi;
keepmsk &= ~mi; // don't need to keep these for rest of params keepmsk &= ~mi; // don't need to keep these for rest of params
@ -3579,7 +3575,7 @@ void cdfunc(ref CGstate cg, ref CodeBuilder cdb, elem* e, regm_t* pretregs)
if (mi & tosave) if (mi & tosave)
{ {
uint idx; uint idx;
cgstate.regsave.save(cdbsave, j, &idx); cgstate.regsave.save(cdbsave, j, idx);
cgstate.regsave.restore(cdbrestore, j, idx); cgstate.regsave.restore(cdbrestore, j, idx);
saved |= mi; saved |= mi;
keepmsk &= ~mi; // don't need to keep these for rest of params keepmsk &= ~mi; // don't need to keep these for rest of params