Skip to content

Commit

Permalink
refactor gensaverestore()
Browse files Browse the repository at this point in the history
  • Loading branch information
WalterBright authored and dlang-bot committed Jun 18, 2024
1 parent 179e8d6 commit 3457a59
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 17 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
*.deps
.B*
*~
/compiler/src/bug2
/compiler/test/test_results
/compiler/test/trace.def
/compiler/test/trace.log
Expand Down
2 changes: 1 addition & 1 deletion compiler/src/dmd/backend/code.d
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ struct REGSAVE
nothrow:
@trusted
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); }
}

Expand Down
28 changes: 12 additions & 16 deletions compiler/src/dmd/backend/x86/cod1.d
Original file line number Diff line number Diff line change
Expand Up @@ -345,46 +345,42 @@ uint gensaverestore(regm_t regm,ref CodeBuilder cdbsave,ref CodeBuilder cdbresto

uint stackused = 0;

code *[regm.sizeof * 8] restore;
code *[regm.sizeof * 8] restore = void;

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

0 comments on commit 3457a59

Please sign in to comment.