mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 21:21:48 +03:00
neglected to generate code for cdeq() (#21090)
This commit is contained in:
parent
ce91ddca22
commit
653658faad
2 changed files with 28 additions and 6 deletions
|
@ -133,9 +133,22 @@ void cdeq(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
|
|||
getregs(cdb, cs.reg);
|
||||
const p = cast(targ_size_t*) &(e2.EV);
|
||||
movregconst(cdb,cs.reg,*p,sz == 8);
|
||||
freenode(e2);
|
||||
goto Lp;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Move constant into r, then store r into EA
|
||||
*/
|
||||
regm_t m = tyfloating(tyml) ? INSTR.FLOATREGS : cg.allregs;
|
||||
m &= ~(mask(cs.base) | mask(cs.index));
|
||||
assert(NOREG < 64); // otherwise mask(NOREG) will not work
|
||||
reg_t r = allocreg(cdb, m, tyml);
|
||||
const p = cast(targ_size_t*) &(e2.EV);
|
||||
movregconst(cdb,r,*p,sz == 8);
|
||||
storeToEA(cs,r,sz);
|
||||
cdb.gen(&cs);
|
||||
}
|
||||
freenode(e2);
|
||||
goto Lp;
|
||||
}
|
||||
retregs = allregs; // pick a reg, any reg
|
||||
}
|
||||
|
|
|
@ -1482,7 +1482,7 @@ reg_t findreg(regm_t regm, int line, const(char)* file)
|
|||
void freenode(elem* e)
|
||||
{
|
||||
elem_debug(e);
|
||||
//dbg_printf("freenode(%p) : comsub = %d, count = %d\n",e,e.Ecomsub,e.Ecount);
|
||||
//printf("freenode(%p) : Ecount = %d, Ecomsub = %d\n",e,e.Ecount,e.Ecomsub);
|
||||
if (e.Ecomsub--) return; /* usage count */
|
||||
if (e.Ecount) /* if it was a CSE */
|
||||
{
|
||||
|
@ -1499,7 +1499,7 @@ void freenode(elem* e)
|
|||
}
|
||||
|
||||
/*********************************
|
||||
* Reset Ecomsub for all elem nodes, i.e. reverse the effects of freenode().
|
||||
* Reset Ecomsub for all elem nodes to Ecount, i.e. reverse the effects of freenode().
|
||||
*/
|
||||
|
||||
@trusted
|
||||
|
@ -2653,7 +2653,9 @@ void codelem(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs,uin
|
|||
assert(0);
|
||||
}
|
||||
|
||||
if (!(constflag & 1) && pretregs & (mES | ALLREGS | mBP | XMMREGS) & ~cg.regcon.mvar)
|
||||
regm_t tmask = cg.AArch64 ? (cg.allregs | INSTR.FLOATREGS)
|
||||
: (mES | ALLREGS | mBP | XMMREGS);
|
||||
if (!(constflag & 1) && pretregs & tmask & ~cg.regcon.mvar)
|
||||
pretregs &= ~cg.regcon.mvar; /* can't use register vars */
|
||||
|
||||
uint op = e.Eoper;
|
||||
|
@ -2672,7 +2674,14 @@ void codelem(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs,uin
|
|||
if (e.Ecount) /* if common subexp */
|
||||
{
|
||||
/* if no return value */
|
||||
if ((pretregs & (mSTACK | mES | ALLREGS | mBP | XMMREGS)) == 0)
|
||||
if (cg.AArch64)
|
||||
{
|
||||
if ((pretregs & (cg.allregs | INSTR.FLOATREGS)) == 0)
|
||||
{
|
||||
pretregs = (tyfloating(e.Ety)) ? INSTR.FLOATREGS : cg.allregs;
|
||||
}
|
||||
}
|
||||
else if ((pretregs & (mSTACK | mES | ALLREGS | mBP | XMMREGS)) == 0)
|
||||
{
|
||||
if (pretregs & (mST0 | mST01))
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue