diff --git a/compiler/src/dmd/backend/x86/cg87.d b/compiler/src/dmd/backend/x86/cg87.d index c0d8c9a90a..8046027615 100644 --- a/compiler/src/dmd/backend/x86/cg87.d +++ b/compiler/src/dmd/backend/x86/cg87.d @@ -785,7 +785,6 @@ ubyte loadconst(elem* e, int im) @trusted 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)); 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); 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 (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) { +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); uint mf = (sz == FLOATSIZE) ? MFfloat : MFdouble; // FSTP floatreg @@ -1631,7 +1636,8 @@ void load87(ref CodeBuilder cdb,elem* e,uint eoffset,ref regm_t outretregs,elem* 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); - +//elem_print(e); +//elem_print(eleft); assert(!(NOSAHF && op == 3)); elem_debug(e); if (ADDFWAIT()) diff --git a/compiler/src/dmd/e2ir.d b/compiler/src/dmd/e2ir.d index b3f13c77a5..87d359055b 100644 --- a/compiler/src/dmd/e2ir.d +++ b/compiler/src/dmd/e2ir.d @@ -1754,8 +1754,20 @@ elem* toElem(Expression e, ref IRState irs) elem* visitAdd(AddExp e) { int op = OPadd; - if (e.type.ty == Tcomplex64 && e.e1.type.ty == Tfloat64 && e.e2.type.ty == Timaginary64) - op = OPpair; + if (e.type.isComplex()) + { + 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); }