mirror of
https://github.com/dlang/dmd.git
synced 2025-04-25 20:50:41 +03:00
more cases of creating complex expressions
This commit is contained in:
parent
4379255e45
commit
b0ed73d783
2 changed files with 23 additions and 5 deletions
|
@ -785,7 +785,6 @@ ubyte loadconst(elem* e, int im)
|
||||||
@trusted
|
@trusted
|
||||||
void fixresult87(ref CodeBuilder cdb,elem* e,regm_t retregs, ref regm_t outretregs, bool isReturnValue = false)
|
void fixresult87(ref CodeBuilder cdb,elem* e,regm_t retregs, ref regm_t outretregs, bool isReturnValue = false)
|
||||||
{
|
{
|
||||||
//printf("fixresult87(e = %p, retregs = x%x, outretregs = x%x)\n", e,retregs,outretregs);
|
|
||||||
//printf("fixresult87(e = %p, retregs = %s, outretregs = %s)\n", e,regm_str(retregs),regm_str(outretregs));
|
//printf("fixresult87(e = %p, retregs = %s, outretregs = %s)\n", e,regm_str(retregs),regm_str(outretregs));
|
||||||
assert(!outretregs || retregs);
|
assert(!outretregs || retregs);
|
||||||
|
|
||||||
|
@ -797,7 +796,7 @@ void fixresult87(ref CodeBuilder cdb,elem* e,regm_t retregs, ref regm_t outretre
|
||||||
|
|
||||||
tym_t tym = tybasic(e.Ety);
|
tym_t tym = tybasic(e.Ety);
|
||||||
uint sz = _tysize[tym];
|
uint sz = _tysize[tym];
|
||||||
//printf("tym = x%x, sz = %d\n", tym, sz);
|
//printf("tym = %s, sz = %d\n", tym_str(tym), sz);
|
||||||
|
|
||||||
/* if retregs needs to be transferred into the 8087 */
|
/* if retregs needs to be transferred into the 8087 */
|
||||||
if (outretregs & mST0 && retregs & (mBP | ALLREGS))
|
if (outretregs & mST0 && retregs & (mBP | ALLREGS))
|
||||||
|
@ -911,6 +910,12 @@ void fixresult87(ref CodeBuilder cdb,elem* e,regm_t retregs, ref regm_t outretre
|
||||||
}
|
}
|
||||||
else if (retregs & mST0 && outretregs & XMMREGS)
|
else if (retregs & mST0 && outretregs & XMMREGS)
|
||||||
{
|
{
|
||||||
|
if (0 && sz > DOUBLESIZE)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "sz: %d tym: %s\n", sz, tym_str(tym));
|
||||||
|
fprintf(stderr, "fixresult87(e = %p, retregs = %s, outretregs = %s, mST0: %s)\n", e,regm_str(retregs),regm_str(outretregs),regm_str(mST0));
|
||||||
|
elem_print(e);
|
||||||
|
}
|
||||||
assert(sz <= DOUBLESIZE);
|
assert(sz <= DOUBLESIZE);
|
||||||
uint mf = (sz == FLOATSIZE) ? MFfloat : MFdouble;
|
uint mf = (sz == FLOATSIZE) ? MFfloat : MFdouble;
|
||||||
// FSTP floatreg
|
// FSTP floatreg
|
||||||
|
@ -1631,7 +1636,8 @@ void load87(ref CodeBuilder cdb,elem* e,uint eoffset,ref regm_t outretregs,elem*
|
||||||
|
|
||||||
if (NDPP)
|
if (NDPP)
|
||||||
printf("+load87(e=%p, eoffset=%d, outretregs=%s, eleft=%p, op=%d, stackused = %d)\n",e,eoffset,regm_str(outretregs),eleft,op,global87.stackused);
|
printf("+load87(e=%p, eoffset=%d, outretregs=%s, eleft=%p, op=%d, stackused = %d)\n",e,eoffset,regm_str(outretregs),eleft,op,global87.stackused);
|
||||||
|
//elem_print(e);
|
||||||
|
//elem_print(eleft);
|
||||||
assert(!(NOSAHF && op == 3));
|
assert(!(NOSAHF && op == 3));
|
||||||
elem_debug(e);
|
elem_debug(e);
|
||||||
if (ADDFWAIT())
|
if (ADDFWAIT())
|
||||||
|
|
|
@ -1754,8 +1754,20 @@ elem* toElem(Expression e, ref IRState irs)
|
||||||
elem* visitAdd(AddExp e)
|
elem* visitAdd(AddExp e)
|
||||||
{
|
{
|
||||||
int op = OPadd;
|
int op = OPadd;
|
||||||
if (e.type.ty == Tcomplex64 && e.e1.type.ty == Tfloat64 && e.e2.type.ty == Timaginary64)
|
if (e.type.isComplex())
|
||||||
op = OPpair;
|
{
|
||||||
|
const ty = e.type.ty;
|
||||||
|
const ty1 = e.e1.type.ty;
|
||||||
|
const ty2 = e.e2.type.ty;
|
||||||
|
if (ty == Tcomplex32 && ty1 == Tfloat32 && ty2 == Timaginary32 ||
|
||||||
|
ty == Tcomplex64 && ty1 == Tfloat64 && ty2 == Timaginary64 ||
|
||||||
|
0 && ty == Tcomplex80 && ty1 == Tfloat80 && ty2 == Timaginary80)
|
||||||
|
op = OPpair;
|
||||||
|
else if (ty == Tcomplex32 && ty1 == Timaginary32 && ty2 == Tfloat32 ||
|
||||||
|
ty == Tcomplex64 && ty1 == Timaginary64 && ty2 == Tfloat64 ||
|
||||||
|
0 && ty == Tcomplex80 && ty1 == Timaginary80 && ty2 == Tfloat80)
|
||||||
|
op = OPrpair;
|
||||||
|
}
|
||||||
|
|
||||||
return toElemBin(e, op);
|
return toElemBin(e, op);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue