Skip to content

Commit

Permalink
make return vals of allocregs const where possible
Browse files Browse the repository at this point in the history
  • Loading branch information
benjones authored and dlang-bot committed Mar 27, 2024
1 parent 0141842 commit ec05422
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 61 deletions.
16 changes: 8 additions & 8 deletions compiler/src/dmd/backend/cg87.d
Original file line number Diff line number Diff line change
Expand Up @@ -852,7 +852,7 @@ void fixresult87(ref CodeBuilder cdb,elem *e,regm_t retregs, ref regm_t outretre
pop87();
cdb.genfltreg(ESC(mf,1),3,0);
genfwait(cdb);
reg_t reg = allocreg(cdb,outretregs,(sz == FLOATSIZE) ? TYfloat : TYdouble);
const reg = allocreg(cdb,outretregs,(sz == FLOATSIZE) ? TYfloat : TYdouble);
if (sz == FLOATSIZE)
{
if (!I16)
Expand Down Expand Up @@ -917,7 +917,7 @@ void fixresult87(ref CodeBuilder cdb,elem *e,regm_t retregs, ref regm_t outretre
cdb.genfltreg(ESC(mf,1),3,0);
genfwait(cdb);
// MOVD XMM?,floatreg
reg_t reg = allocreg(cdb,outretregs,(sz == FLOATSIZE) ? TYfloat : TYdouble);
const reg = allocreg(cdb,outretregs,(sz == FLOATSIZE) ? TYfloat : TYdouble);
cdb.genxmmreg(xmmload(tym),reg,0,tym);
}
else
Expand Down Expand Up @@ -2972,8 +2972,8 @@ private void cdd_u64_I32(ref CodeBuilder cdb, elem *e, regm_t *pretregs)
retregs = *pretregs;
if (!retregs)
retregs = ALLREGS;
reg_t reg = allocreg(cdb,retregs,tym);
reg = findreglsw(retregs);
allocreg(cdb,retregs,tym);
const reg = findreglsw(retregs);
reg_t reg2 = findregmsw(retregs);
movregconst(cdb,reg2,0x80000000,0);
getregs(cdb,mask(reg2) | mAX);
Expand Down Expand Up @@ -3056,9 +3056,9 @@ private void cdd_u64_I64(ref CodeBuilder cdb, elem *e, regm_t *pretregs)
retregs = *pretregs;
if (!retregs)
retregs = ALLREGS;
reg_t reg = allocreg(cdb,retregs,tym);
const reg = allocreg(cdb,retregs,tym);
regm_t regm2 = ALLREGS & ~retregs & ~mAX;
reg_t reg2 = allocreg(cdb,regm2,tym);
const reg2 = allocreg(cdb,regm2,tym);
movregconst(cdb,reg2,0x80000000,0);
getregs(cdb,mask(reg2) | mAX);

Expand Down Expand Up @@ -3128,7 +3128,7 @@ void cdd_u32(ref CodeBuilder cdb, elem *e, regm_t *pretregs)
retregs = *pretregs & ALLREGS;
if (!retregs)
retregs = ALLREGS;
reg_t reg = allocreg(cdb,retregs,tym);
const reg = allocreg(cdb,retregs,tym);

cdb.genfltreg(0xC7,0,8);
code *cf3 = cdb.last();
Expand Down Expand Up @@ -3344,7 +3344,7 @@ void cdrndtol(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
retregs = *pretregs & (ALLREGS | mBP);
if (!retregs)
retregs = ALLREGS;
reg_t reg = allocreg(cdb,retregs,tym);
const reg = allocreg(cdb,retregs,tym);
genfwait(cdb); // FWAIT
if (tysize(tym) > REGSIZE)
{
Expand Down
16 changes: 8 additions & 8 deletions compiler/src/dmd/backend/cgxmm.d
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ void movxmmconst(ref CodeBuilder cdb, reg_t xreg, tym_t ty, eve* pev, regm_t fla
if (I32 && sz == 8)
{
regm_t rm = ALLREGS;
reg_t r = allocreg(cdb,rm,TYint); // allocate scratch register
const r = allocreg(cdb,rm,TYint); // allocate scratch register
static union U { targ_size_t s; targ_long[2] l; }
U u = void;
u.l[1] = 0;
Expand Down Expand Up @@ -186,7 +186,7 @@ void orthxmm(ref CodeBuilder cdb, elem *e, regm_t *pretregs)
if (e.Eoper == OPmin)
{
regm_t nretregs = XMMREGS & ~retregs;
reg_t sreg = allocreg(cdb,nretregs,e2.Ety); // hold sign bit
const sreg = allocreg(cdb,nretregs,e2.Ety); // hold sign bit
const uint sz = tysize(e1.Ety);
eve signbit;
signbit.Vint = 0x80000000;
Expand Down Expand Up @@ -644,7 +644,7 @@ void xmmpost(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
regm_t resultregs = XMMREGS & *pretregs & ~retregs;
if (!resultregs)
resultregs = XMMREGS & ~retregs;
reg_t resultreg = allocreg(cdb,resultregs, ty1);
const resultreg = allocreg(cdb,resultregs, ty1);

cdb.gen2(xmmload(ty1,true),modregxrmx(3,resultreg-XMM0,reg-XMM0)); // MOVSS/D resultreg,reg
checkSetVex(cdb.last(), ty1);
Expand Down Expand Up @@ -705,7 +705,7 @@ void xmmneg(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
getregs(cdb,retregs);
const reg = findreg(retregs);
regm_t rretregs = XMMREGS & ~retregs;
reg_t rreg = allocreg(cdb,rretregs,tyml);
const rreg = allocreg(cdb,rretregs,tyml);

eve signbit;
signbit.Vint = 0x80000000;
Expand Down Expand Up @@ -746,7 +746,7 @@ void xmmabs(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
getregs(cdb,retregs);
const reg = findreg(retregs);
regm_t rretregs = XMMREGS & ~retregs;
reg_t rreg = allocreg(cdb,rretregs,tyml);
const rreg = allocreg(cdb,rretregs,tyml);

eve mask;
mask.Vint = 0x7FFF_FFFF;
Expand Down Expand Up @@ -1292,7 +1292,7 @@ static if (0)
retregs = *pretregs & XMMREGS;
if (!retregs)
retregs = XMMREGS;
reg_t reg = allocreg(cdb,retregs, e.Ety);
const reg = allocreg(cdb,retregs, e.Ety);
code_newreg(&cs, reg - XMM0);
cs.Iop = op;
cdb.gen(&cs);
Expand Down Expand Up @@ -1478,7 +1478,7 @@ static if (0)
// VBROADCASTSS X/YMM,MEM
getlvalue(cdb,&cs, e1, 0); // get addressing mode
assert((cs.Irm & 0xC0) != 0xC0); // AVX1 doesn't have register source operands
reg_t reg = allocreg(cdb,retregs,ty);
const reg = allocreg(cdb,retregs,ty);
cs.Iop = VBROADCASTSS;
cs.Irex &= ~REX_W;
code_newreg(&cs,reg - XMM0);
Expand Down Expand Up @@ -1518,7 +1518,7 @@ static if (0)
// VBROADCASTSD YMM,MEM
getlvalue(cdb,&cs, e1, 0); // get addressing mode
assert((cs.Irm & 0xC0) != 0xC0); // AVX1 doesn't have register source operands
reg_t reg = allocreg(cdb,retregs,ty);
const reg = allocreg(cdb,retregs,ty);
cs.Iop = VBROADCASTSD;
cs.Irex &= ~REX_W;
code_newreg(&cs,reg - XMM0);
Expand Down
16 changes: 8 additions & 8 deletions compiler/src/dmd/backend/cod1.d
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,7 @@ void genstackclean(ref CodeBuilder cdb,uint numpara,regm_t keepmsk)

if (scratchm)
{
reg_t r = allocreg(cdb, scratchm, TYint);
const r = allocreg(cdb, scratchm, TYint);
cdb.gen1(0x58 + r); // POP r
}
else
Expand Down Expand Up @@ -1033,7 +1033,7 @@ void getlvalue(ref CodeBuilder cdb,code *pcs,elem *e,regm_t keepmsk)
int rbase;

scratchm = ALLREGS & ~keepmsk;
reg_t r = allocreg(cdb, scratchm, TYint);
const r = allocreg(cdb, scratchm, TYint);

if (ssflags & SSFLnobase1)
{
Expand Down Expand Up @@ -1147,8 +1147,8 @@ void getlvalue(ref CodeBuilder cdb,code *pcs,elem *e,regm_t keepmsk)
if (e1ty == TYfptr)
{
idxregs |= mMSW & ALLREGS & ~keepmsk;
reg_t msreg = allocreg(cdb, idxregs, TYfptr);
msreg = findregmsw(idxregs);
allocreg(cdb, idxregs, TYfptr);
const msreg = findregmsw(idxregs);
/* MOV msreg,segreg */
genregs(cdb, 0x8C, segfl[f], msreg);
}
Expand Down Expand Up @@ -1743,7 +1743,7 @@ void tstresult(ref CodeBuilder cdb, regm_t regm, tym_t tym, uint saveflag)
if (regm & XMMREGS)
{
regm_t xregs = XMMREGS & ~regm;
reg_t xreg = allocreg(cdb,xregs, TYdouble);
const xreg = allocreg(cdb,xregs, TYdouble);
opcode_t op = 0;
if (tym == TYdouble || tym == TYidouble || tym == TYcdouble)
op = 0x660000;
Expand Down Expand Up @@ -5052,7 +5052,7 @@ void pushParams(ref CodeBuilder cdb, elem* e, uint stackalign, tym_t tyf)
else
{
retregs = IDXREGS; // get an index reg
reg_t reg = allocreg(cdb, retregs, TYoffset);
const reg = allocreg(cdb, retregs, TYoffset);
genregs(cdb, 0x89, SP, reg); // MOV reg,SP
pop87();
cdb.gen2(op, modregrm(0, r, regtorm[reg])); // FSTP [reg]
Expand Down Expand Up @@ -5292,7 +5292,7 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
if (tyvector(tym) && forregs & XMMREGS)
{
assert(!flags);
reg_t xreg = allocreg(cdb, forregs, tym); // allocate registers
const xreg = allocreg(cdb, forregs, tym); // allocate registers
movxmmconst(cdb, xreg, tym, &e.EV, flags);
fixresult(cdb, e, forregs, outretregs);
return;
Expand Down Expand Up @@ -5366,7 +5366,7 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
* Not so efficient. We should at least do a PXOR for 0.
*/
regm_t rm = ALLREGS;
reg_t r = allocreg(cdb, rm, TYint); // allocate scratch register
const r = allocreg(cdb, rm, TYint); // allocate scratch register
movregconst(cdb, r, p[0], 0);
cdb.genfltreg(0x89, r, 0); // MOV floatreg,r
movregconst(cdb, r, p[1], 0);
Expand Down
32 changes: 15 additions & 17 deletions compiler/src/dmd/backend/cod2.d
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ void cdorth(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
code csx = void;
getlvalue(cdb,&csx,e,0);
nest -= inc;
reg_t regx = allocreg(cdb,*pretregs,ty);
const regx = allocreg(cdb,*pretregs,ty);
csx.Iop = LEA;
code_newreg(&csx, regx);
cdb.gen(&csx); // LEA regx,EA
Expand Down Expand Up @@ -1100,7 +1100,7 @@ void cdmul(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
resreg &= ~(mBP | mR13);
if (!resreg)
resreg = retregs;
reg_t reg = allocreg(cdb,resreg,TYint);
const reg = allocreg(cdb,resreg,TYint);

regm_t sregm = (ALLREGS & ~mR13) & ~resreg;
codelem(cdb,e.EV.E1,&sregm,false);
Expand Down Expand Up @@ -1136,7 +1136,7 @@ void cdmul(ref CodeBuilder cdb,elem *e,regm_t *pretregs)

scodelem(cdb,e.EV.E1,&retregs,0,true); // eval left leaf
const regx = findreg(retregs);
reg_t rreg = allocreg(cdb,resreg,e.Ety);
const rreg = allocreg(cdb,resreg,e.Ety);

// IMUL regx,imm16
cdb.genc2(0x69,grex | modregxrmx(3,rreg,regx),e2factor);
Expand Down Expand Up @@ -2628,7 +2628,7 @@ void cdloglog(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
if (!retregs)
retregs = ALLREGS; // if mPSW only

reg_t reg = allocreg(cdb1,retregs,TYint); // allocate reg for result
const reg = allocreg(cdb1,retregs,TYint); // allocate reg for result
movregconst(cdb1,reg,e.Eoper == OPoror,*pretregs & mPSW);
regcon.immed.mval &= ~mask(reg); // mark reg as unavail
*pretregs = retregs;
Expand All @@ -2655,7 +2655,7 @@ void cdloglog(ref CodeBuilder cdb,elem *e,regm_t *pretregs)

assert(sz <= 4); // result better be int
regm_t retregs = *pretregs & allregs;
reg_t reg = allocreg(cdb1,retregs,TYint); // allocate reg for result
const reg = allocreg(cdb1,retregs,TYint); // allocate reg for result
movregconst(cdb1,reg,e.Eoper == OPoror,0); // reg = 1
regcon.immed.mval &= ~mask(reg); // mark reg as unavail
*pretregs = retregs;
Expand Down Expand Up @@ -2689,7 +2689,7 @@ void cdloglog(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
retregs = ALLREGS; // if mPSW only
CodeBuilder cdbcg;
cdbcg.ctor();
reg_t reg = allocreg(cdbcg,retregs,TYint); // allocate reg for result
const reg = allocreg(cdbcg,retregs,TYint); // allocate reg for result
code *cg = cdbcg.finish();
for (code *c1 = cg; c1; c1 = code_next(c1)) // for each instruction
cdb1.gen(c1); // duplicate it
Expand Down Expand Up @@ -4261,7 +4261,7 @@ void cdmemset(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
STOSB
*/
regm_t regs = allregs & (*pretregs ? ~(mAX|mBX|mCX|mDI) : ~(mAX|mCX|mDI));
reg_t sreg = allocreg(cdb,regs,TYint);
const sreg = allocreg(cdb,regs,TYint);
genregs(cdb,0x89,CX,sreg); // MOV sreg,ECX (32 bits only)

const n = I64 ? 3 : 2;
Expand Down Expand Up @@ -4360,7 +4360,7 @@ private void cdmemsetn(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
mregbx = *pretregs & ~(mregidx | mregcx | retregs3);
if (!mregbx)
mregbx = allregs & ~(mregidx | mregcx | retregs3);
reg_t regbx = allocreg(cdb, mregbx, TYnptr);
const regbx = allocreg(cdb, mregbx, TYnptr);
getregs(cdb, mregbx);
genmovreg(cdb,regbx,idxreg); // MOV BX,DI
}
Expand Down Expand Up @@ -4588,7 +4588,7 @@ else
code cs;
cs.Iop = 0x8B;
regm_t retregs = *pretregs;
reg_t reg = allocreg(cdb,retregs,tym);
const reg = allocreg(cdb,retregs,tym);

reg_t msreg = findregmsw(retregs);
buildEA(&cs,DI,-1,1,REGSIZE);
Expand Down Expand Up @@ -4796,7 +4796,7 @@ void getoffset(ref CodeBuilder cdb,elem *e,reg_t reg)
if (reg == STACK)
{ regm_t retregs = ALLREGS;

reg_t regx = allocreg(cdb,retregs,TYoffset);
const regx = allocreg(cdb,retregs,TYoffset);
reg = findreg(retregs);
stack = 1;
}
Expand Down Expand Up @@ -4933,7 +4933,7 @@ void getoffset(ref CodeBuilder cdb,elem *e,reg_t reg)
if (reg == STACK)
{ regm_t retregs = ALLREGS;

reg_t regx = allocreg(cdb,retregs,TYoffset);
const regx = allocreg(cdb,retregs,TYoffset);
reg = findreg(retregs);
loadea(cdb,e,&cs,LEA,reg,0,0,0); // LEA reg,EA
if (I64)
Expand Down Expand Up @@ -5364,7 +5364,7 @@ if (config.exe & EX_windos)
getregs(cdb,mES); // allocate ES
}
}
reg_t reg = allocreg(cdb,retregs,TYint);
const reg = allocreg(cdb,retregs,TYint);
code_newreg(&cs, reg);
if (sz == 1 && I64 && reg >= 4)
cs.Irex |= REX;
Expand Down Expand Up @@ -5473,8 +5473,6 @@ if (config.exe & EX_windos)
else if (tyml == TYhptr)
{
uint rvalue;
reg_t lreg;
reg_t rtmp;
regm_t mtmp;

rvalue = e2.EV.Vlong;
Expand All @@ -5487,7 +5485,7 @@ if (config.exe & EX_windos)
regm_t retregs = mLSW & ~idxregs & *pretregs;
if (!retregs)
retregs = mLSW & ~idxregs;
lreg = allocreg(cdb,retregs,TYint);
const lreg = allocreg(cdb,retregs,TYint);

// Can't use LES if the EA uses ES as a seg override
if (*pretregs & mES && (cs.Iflags & CFSEG) != CFes)
Expand All @@ -5511,7 +5509,7 @@ if (config.exe & EX_windos)

// Allocate temporary register, rtmp
mtmp = ALLREGS & ~mCX & ~idxregs & ~retregs;
rtmp = allocreg(cdb,mtmp,TYint);
const rtmp = allocreg(cdb,mtmp,TYint);

movregconst(cdb,rtmp,rvalue >> 16,0); // MOV rtmp,e2+2
getregs(cdb,mtmp);
Expand Down Expand Up @@ -5539,7 +5537,7 @@ if (config.exe & EX_windos)
if ((retregs & mMSW) == 0)
retregs |= ALLREGS & mMSW;
assert(retregs & mMSW && retregs & mLSW);
reg_t reg = allocreg(cdb,retregs,tyml);
const reg = allocreg(cdb,retregs,tyml);
uint sreg = findreglsw(retregs);
cs.Iop = 0x8B;
cs.Irm |= modregrm(0,sreg,0);
Expand Down
Loading

0 comments on commit ec05422

Please sign in to comment.