Skip to content

Commit

Permalink
modernize parameters to loadea()
Browse files Browse the repository at this point in the history
  • Loading branch information
WalterBright authored and dlang-bot committed Jun 20, 2024
1 parent 402c076 commit 3658e62
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 78 deletions.
20 changes: 10 additions & 10 deletions compiler/src/dmd/backend/x86/cg87.d
Original file line number Diff line number Diff line change
Expand Up @@ -1691,12 +1691,12 @@ L5:
case TYcfloat:
case TYcdouble:
case TYdouble_alias:
loadea(cdb,e,&cs,ESC(mf,1),0,0,0,0); // FLD var
loadea(cdb,e,cs,ESC(mf,1),0,0,0,0); // FLD var
break;
case TYldouble:
case TYildouble:
case TYcldouble:
loadea(cdb,e,&cs,0xDB,5,0,0,0); // FLD var
loadea(cdb,e,cs,0xDB,5,0,0,0); // FLD var
break;
default:
printf("ty = x%x\n", ty);
Expand Down Expand Up @@ -1734,7 +1734,7 @@ L5:
}
else
{
loadea(cdb,e.E1,&cs,ESC(mf1,1),0,0,0,0); /* FLD e.E1 */
loadea(cdb,e.E1,cs,ESC(mf1,1),0,0,0,0); /* FLD e.E1 */
}

// Variable cannot be put into a register anymore
Expand Down Expand Up @@ -2011,7 +2011,7 @@ void eq87(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
static if (0)
{
// Doesn't work if ST(0) gets saved to the stack by getlvalue()
loadea(cdb,e.E1,&cs,op1,op2,0,0,0);
loadea(cdb,e.E1,cs,op1,op2,0,0,0);
}
else
{
Expand Down Expand Up @@ -2084,7 +2084,7 @@ void complex_eq87(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
{
code cs;
opcode_t op1;
uint op2;
ubyte op2;
uint sz;
int fxch = 0;

Expand Down Expand Up @@ -2140,7 +2140,7 @@ void complex_eq87(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
}
else
{
loadea(cdb,e.E1,&cs,op1,op2,sz,0,0);
loadea(cdb,e.E1,cs,op1,op2,sz,0,0);
genfwait(cdb);
}
if (fxch)
Expand Down Expand Up @@ -2204,7 +2204,7 @@ private void cnvteq87(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
{
code cs;
opcode_t op1;
uint op2;
ubyte op2;

assert(e.Eoper == OPeq);
assert(!*pretregs);
Expand Down Expand Up @@ -2238,7 +2238,7 @@ private void cnvteq87(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
cs.Iflags = ADDFWAIT() ? CFwait : 0;
if (e.E1.Eoper == OPvar)
notreg(e.E1); // cannot be put in register anymore
loadea(cdb,e.E1,&cs,op1,op2,0,0,0);
loadea(cdb,e.E1,cs,op1,op2,0,0,0);

genfwait(cdb);
genSetRoundingMode(cdb, CW.roundtonearest); // FLDCW roundtonearest
Expand Down Expand Up @@ -3839,13 +3839,13 @@ void cload87(ref CodeBuilder cdb, elem *e, ref regm_t outretregs)
{
case TYcfloat:
case TYcdouble:
loadea(cdb,e,&cs,ESC(mf,1),0,0,0,0); // FLD var
loadea(cdb,e,cs,ESC(mf,1),0,0,0,0); // FLD var
cs.IEV1.Voffset += sz;
cdb.gen(&cs);
break;

case TYcldouble:
loadea(cdb,e,&cs,0xDB,5,0,0,0); // FLD var
loadea(cdb,e,cs,0xDB,5,0,0,0); // FLD var
cs.IEV1.Voffset += sz;
cdb.gen(&cs);
break;
Expand Down
4 changes: 2 additions & 2 deletions compiler/src/dmd/backend/x86/cgxmm.d
Original file line number Diff line number Diff line change
Expand Up @@ -1931,12 +1931,12 @@ void cloadxmm(ref CodeBuilder cdb, elem *e, regm_t *pretregs)

regm_t retregs0 = mXMM0;
reg_t reg0 = allocreg(cdb, retregs0, ty);
loadea(cdb, e, &cs, opmv, reg0, 0, RMload, 0); // MOVSS/MOVSD XMM0,data
loadea(cdb, e, cs, opmv, reg0, 0, RMload, 0); // MOVSS/MOVSD XMM0,data
checkSetVex(cdb.last(), ty);

regm_t retregs1 = mXMM1;
reg_t reg1 = allocreg(cdb, retregs1, ty);
loadea(cdb, e, &cs, opmv, reg1, tysize(ty), RMload, mXMM0); // MOVSS/MOVSD XMM1,data+offset
loadea(cdb, e, cs, opmv, reg1, tysize(ty), RMload, mXMM0); // MOVSS/MOVSD XMM1,data+offset
checkSetVex(cdb.last(), ty);

return;
Expand Down
85 changes: 42 additions & 43 deletions compiler/src/dmd/backend/x86/cod1.d
Original file line number Diff line number Diff line change
Expand Up @@ -600,28 +600,27 @@ void logexp(ref CodeBuilder cdb, elem *e, int jcond, uint fltarg, code *targ)
* Routine to aid in setting things up for gen().
* Look for common subexpression.
* Can handle indirection operators, but not if they're common subs.
* Input:
* e -> elem where we get some of the data from
* cs -> partially filled code to add
* op = opcode
* reg = reg field of (mod reg r/m)
* offset = data to be added to Voffset field
* Params:
* cdb = generated code sink
* e = elem where we get some of the data from
* cs = partially filled code to add
* op = opcode
* reg = reg field of (mod reg r/m)
* offset = data to be added to Voffset field
* keepmsk = mask of registers we must not destroy
* desmsk = mask of registers destroyed by executing the instruction
* Returns:
* pointer to code generated
*/

@trusted
void loadea(ref CodeBuilder cdb,elem *e,code *cs,uint op,uint reg,targ_size_t offset,
void loadea(ref CodeBuilder cdb,elem *e,ref code cs,uint op,reg_t reg,targ_size_t offset,
regm_t keepmsk,regm_t desmsk)
{
code* c, cg, cd;

debug
if (debugw)
printf("loadea: e=%p cs=%p op=x%x reg=%s offset=%lld keepmsk=%s desmsk=%s\n",
e, cs, op, regstring[reg], cast(ulong)offset, regm_str(keepmsk), regm_str(desmsk));
e, &cs, op, regstring[reg], cast(ulong)offset, regm_str(keepmsk), regm_str(desmsk));
assert(e);
cs.Iflags = 0;
cs.Irex = 0;
Expand Down Expand Up @@ -671,7 +670,7 @@ void loadea(ref CodeBuilder cdb,elem *e,code *cs,uint op,uint reg,targ_size_t of
cs.Iop = 0x8C; /* MOV reg,ES */
cs.Irm = modregrm(3, 0, reg & 7);
if (reg & 8)
code_orrex(cs, REX_B);
code_orrex(&cs, REX_B);
}
else // XXX reg,i
{
Expand All @@ -692,9 +691,9 @@ void loadea(ref CodeBuilder cdb,elem *e,code *cs,uint op,uint reg,targ_size_t of
}
}

getlvalue(cdb, *cs, e, keepmsk);
getlvalue(cdb, cs, e, keepmsk);
if (offset == REGSIZE)
getlvalue_msw(*cs);
getlvalue_msw(cs);
else
cs.IEV1.Voffset += offset;
if (I64)
Expand All @@ -708,7 +707,7 @@ void loadea(ref CodeBuilder cdb,elem *e,code *cs,uint op,uint reg,targ_size_t of
(op == LODSD || op == STOSD))
cs.Irex &= ~REX_W; // not needed for xmm ops
}
code_newreg(cs, reg); // OR in reg field
code_newreg(&cs, reg); // OR in reg field
if (!I16)
{
if (reg == 6 && op == 0xFF || /* don't PUSH a word */
Expand Down Expand Up @@ -761,7 +760,7 @@ L2:
cs.Iop = NOP;
}

cdb.gen(cs);
cdb.gen(&cs);
}


Expand Down Expand Up @@ -3973,7 +3972,7 @@ private void funccall(ref CodeBuilder cdb, elem* e, uint numpara, uint numalign,
// CALL [function]
cs.Iflags = 0;
cgstate.stackclean++;
loadea(cdbe, e11, &cs, 0xFF, farfunc ? 3 : 2, 0, keepmsk, desmsk);
loadea(cdbe, e11, cs, 0xFF, farfunc ? 3 : 2, 0, keepmsk, desmsk);
cgstate.stackclean--;
freenode(e11);
}
Expand Down Expand Up @@ -4651,7 +4650,7 @@ void pushParams(ref CodeBuilder cdb, elem* e, uint stackalign, tym_t tyf)
if (I32)
{
assert(sz >= REGSIZE * 2);
loadea(cdb, e, &cs, 0xFF, 6, sz - REGSIZE, 0, 0); // PUSH EA+4
loadea(cdb, e, cs, 0xFF, 6, sz - REGSIZE, 0, 0); // PUSH EA+4
cdb.genadjesp(REGSIZE);
cgstate.stackpush += REGSIZE;
sz -= REGSIZE;
Expand All @@ -4674,15 +4673,15 @@ void pushParams(ref CodeBuilder cdb, elem* e, uint stackalign, tym_t tyf)
{
if (sz == DOUBLESIZE)
{
loadea(cdb, e, &cs, 0xFF, 6, DOUBLESIZE - REGSIZE, 0, 0); // PUSH EA+6
loadea(cdb, e, cs, 0xFF, 6, DOUBLESIZE - REGSIZE, 0, 0); // PUSH EA+6
cs.IEV1.Voffset -= REGSIZE;
cdb.gen(&cs); // PUSH EA+4
cdb.genadjesp(REGSIZE);
getlvalue_lsw(cs);
cdb.gen(&cs); // PUSH EA+2
}
else /* TYlong */
loadea(cdb, e, &cs, 0xFF, 6, REGSIZE, 0, 0); // PUSH EA+2
loadea(cdb, e, cs, 0xFF, 6, REGSIZE, 0, 0); // PUSH EA+2
cdb.genadjesp(REGSIZE);
}
cgstate.stackpush += sz;
Expand Down Expand Up @@ -4802,13 +4801,13 @@ void pushParams(ref CodeBuilder cdb, elem* e, uint stackalign, tym_t tyf)
code cs;
cs.Iflags = 0;
cs.Irex = 0;
loadea(cdb, e, &cs, 0xFF, 6, sz - regsize, RMload, 0); // PUSH EA+sz-2
loadea(cdb, e, cs, 0xFF, 6, sz - regsize, RMload, 0); // PUSH EA+sz-2
code_orflag(cdb.last(), flag);
cdb.genadjesp(REGSIZE);
cgstate.stackpush += sz;
while (cast(targ_int)(sz -= regsize) > 0)
{
loadea(cdb, e, &cs, 0xFF, 6, sz - regsize, RMload, 0);
loadea(cdb, e, cs, 0xFF, 6, sz - regsize, RMload, 0);
code_orflag(cdb.last(), flag);
cdb.genadjesp(REGSIZE);
}
Expand Down Expand Up @@ -5214,28 +5213,28 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
if (!I16 && (tym == TYfloat || tym == TYifloat))
{
reg = allocreg(cdb, regm, TYoffset); // get a register
loadea(cdb, e, &cs, 0x8B, reg, 0, 0, 0); // MOV reg,data
loadea(cdb, e, cs, 0x8B, reg, 0, 0, 0); // MOV reg,data
cdb.gen2(0xD1,modregrmx(3,4,reg)); // SHL reg,1
}
else if (I64 && (tym == TYdouble || tym ==TYidouble))
{
reg = allocreg(cdb, regm, TYoffset); // get a register
loadea(cdb, e,&cs, 0x8B, reg, 0, 0, 0); // MOV reg,data
loadea(cdb, e, cs, 0x8B, reg, 0, 0, 0); // MOV reg,data
// remove sign bit, so that -0.0 == 0.0
cdb.gen2(0xD1, modregrmx(3, 4, reg)); // SHL reg,1
code_orrex(cdb.last(), REX_W);
}
else if (TARGET_OSX && e.Eoper == OPvar && movOnly(e))
{
reg = allocreg(cdb, regm, TYoffset); // get a register
loadea(cdb, e, &cs, 0x8B, reg, 0, 0, 0); // MOV reg,data
loadea(cdb, e, cs, 0x8B, reg, 0, 0, 0); // MOV reg,data
fixresult(cdb, e, regm, outretregs);
}
else
{ cs.IFL2 = FLconst;
cs.IEV2.Vsize_t = 0;
op = (sz == 1) ? 0x80 : 0x81;
loadea(cdb, e, &cs, op, 7, 0, 0, 0); // CMP EA,0
loadea(cdb, e, cs, op, 7, 0, 0, 0); // CMP EA,0

// Convert to TEST instruction if EA is a register
// (to avoid register contention on Pentium)
Expand All @@ -5256,26 +5255,26 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
{
reg = allocreg(cdb, regm, TYoffset); // get a register
if (I32) // it's a 48 bit pointer
loadea(cdb, e, &cs, MOVZXw, reg, REGSIZE, 0, 0); // MOVZX reg,data+4
loadea(cdb, e, cs, MOVZXw, reg, REGSIZE, 0, 0); // MOVZX reg,data+4
else
{
loadea(cdb, e, &cs, 0x8B, reg, REGSIZE, 0, 0); // MOV reg,data+2
loadea(cdb, e, cs, 0x8B, reg, REGSIZE, 0, 0); // MOV reg,data+2
if (tym == TYfloat || tym == TYifloat) // dump sign bit
cdb.gen2(0xD1, modregrm(3, 4, reg)); // SHL reg,1
}
loadea(cdb,e,&cs,0x0B,reg,0,regm,0); // OR reg,data
loadea(cdb,e,cs,0x0B,reg,0,regm,0); // OR reg,data
}
else if (sz == 8 || (I64 && sz == 2 * REGSIZE && !tyfloating(tym)))
{
reg = allocreg(cdb, regm, TYoffset); // get a register
int i = sz - REGSIZE;
loadea(cdb, e, &cs, 0x8B, reg, i, 0, 0); // MOV reg,data+6
loadea(cdb, e, cs, 0x8B, reg, i, 0, 0); // MOV reg,data+6
if (tyfloating(tym)) // TYdouble or TYdouble_alias
cdb.gen2(0xD1, modregrm(3, 4, reg)); // SHL reg,1

while ((i -= REGSIZE) >= 0)
{
loadea(cdb, e, &cs, 0x0B, reg, i, regm, 0); // OR reg,data+i
loadea(cdb, e, cs, 0x0B, reg, i, regm, 0); // OR reg,data+i
code *c = cdb.last();
if (i == 0)
c.Iflags |= CFpsw; // need the flags on last OR
Expand Down Expand Up @@ -5467,7 +5466,7 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
{
// opmv = tyuns(tym) ? MOVZXb : MOVSXb; // MOVZX/MOVSX
}
loadea(cdb, e, &cs, opmv, reg, 0, 0, 0); // MOV regL,data
loadea(cdb, e, cs, opmv, reg, 0, 0, 0); // MOV regL,data
}
else
{
Expand All @@ -5476,7 +5475,7 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
nreg = reg; // already allocated
else
nreg = allocreg(cdb, nregm, tym);
loadea(cdb, e, &cs, opmv, nreg, 0, 0, 0); // MOV nregL,data
loadea(cdb, e, cs, opmv, nreg, 0, 0, 0); // MOV nregL,data
if (reg != nreg)
{
genmovreg(cdb, reg, nreg); // MOV reg,nreg
Expand All @@ -5498,7 +5497,7 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
/* getlvalue() will unwind this and unregister s; could use a better solution */
}
}
loadea(cdb, e, &cs, opmv, reg, 0, RMload, 0); // MOVSS/MOVSD reg,data
loadea(cdb, e, cs, opmv, reg, 0, RMload, 0); // MOVSS/MOVSD reg,data
checkSetVex(cdb.last(),tym);
}
else if (sz <= REGSIZE)
Expand All @@ -5512,11 +5511,11 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
{
// opmv = tyuns(tym) ? MOVZXw : MOVSXw; // MOVZX/MOVSX
}
loadea(cdb, e, &cs, opmv, reg, 0, RMload, 0);
loadea(cdb, e, cs, opmv, reg, 0, RMload, 0);
}
else if (sz <= 2 * REGSIZE && forregs & mES)
{
loadea(cdb, e, &cs, 0xC4, reg, 0, 0, mES); // LES data
loadea(cdb, e, cs, 0xC4, reg, 0, 0, mES); // LES data
}
else if (sz <= 2 * REGSIZE)
{
Expand All @@ -5530,7 +5529,7 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
int i = DOUBLESIZE - REGSIZE;
do
{
loadea(cdb,e,&cs,0xFF,6,i,0,0); // PUSH EA+i
loadea(cdb,e,cs,0xFF,6,i,0,0); // PUSH EA+i
cdb.genadjesp(REGSIZE);
cgstate.stackpush += REGSIZE;
i -= REGSIZE;
Expand All @@ -5541,11 +5540,11 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
}

reg = findregmsw(forregs);
loadea(cdb, e, &cs, 0x8B, reg, REGSIZE, forregs, 0); // MOV reg,data+2
loadea(cdb, e, cs, 0x8B, reg, REGSIZE, forregs, 0); // MOV reg,data+2
if (I32 && sz == REGSIZE + 2)
cdb.last().Iflags |= CFopsize; // seg is 16 bits
reg = findreglsw(forregs);
loadea(cdb, e, &cs, 0x8B, reg, 0, forregs, 0); // MOV reg,data
loadea(cdb, e, cs, 0x8B, reg, 0, forregs, 0); // MOV reg,data
}
else if (sz >= 8)
{
Expand All @@ -5557,7 +5556,7 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
int i = sz - REGSIZE;
do
{
loadea(cdb,e,&cs,0xFF,6,i,0,0); // PUSH EA+i
loadea(cdb,e,cs,0xFF,6,i,0,0); // PUSH EA+i
cdb.genadjesp(REGSIZE);
cgstate.stackpush += REGSIZE;
i -= REGSIZE;
Expand All @@ -5568,10 +5567,10 @@ void loaddata(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
else
{
assert(reg == AX);
loadea(cdb, e, &cs, 0x8B, AX, 6, 0, 0); // MOV AX,data+6
loadea(cdb, e, &cs, 0x8B, BX, 4, mAX, 0); // MOV BX,data+4
loadea(cdb, e, &cs, 0x8B, CX, 2, mAX|mBX, 0); // MOV CX,data+2
loadea(cdb, e, &cs, 0x8B, DX, 0, mAX|mCX|mCX, 0); // MOV DX,data
loadea(cdb, e, cs, 0x8B, AX, 6, 0, 0); // MOV AX,data+6
loadea(cdb, e, cs, 0x8B, BX, 4, mAX, 0); // MOV BX,data+4
loadea(cdb, e, cs, 0x8B, CX, 2, mAX|mBX, 0); // MOV CX,data+2
loadea(cdb, e, cs, 0x8B, DX, 0, mAX|mCX|mCX, 0); // MOV DX,data
}
}
else
Expand Down
Loading

0 comments on commit 3658e62

Please sign in to comment.