neglected to generate code for cdeq() (#21090)

This commit is contained in:
Walter Bright 2025-03-26 16:20:05 -07:00 committed by GitHub
parent ce91ddca22
commit 653658faad
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 28 additions and 6 deletions

View file

@ -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
}

View file

@ -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))
{