mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 21:21:48 +03:00
refactor gensaverestore()
This commit is contained in:
parent
179e8d68eb
commit
3457a5902d
3 changed files with 14 additions and 17 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -2,6 +2,7 @@
|
|||
*.deps
|
||||
.B*
|
||||
*~
|
||||
/compiler/src/bug2
|
||||
/compiler/test/test_results
|
||||
/compiler/test/trace.def
|
||||
/compiler/test/trace.log
|
||||
|
|
|
@ -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); }
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue