mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 05:00:16 +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
|
*.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
|
||||||
|
|
|
@ -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); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue