Skip to content

Commit 2fa2686

Browse files
marler8997Marler
authored andcommitted
Fix issue 20089: Handle extra case in fixresult_complex87
1 parent 5bfa3a2 commit 2fa2686

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

src/dmd/backend/cg87.d

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3646,6 +3646,25 @@ void fixresult_complex87(ref CodeBuilder cdb,elem *e,regm_t retregs,regm_t *pret
36463646
cdb.genf2(0xDD,modregrm(3,3,0)); // FPOP
36473647
pop87();
36483648
}
3649+
else if (tym == TYllong)
3650+
{
3651+
assert(retregs & mST01, "this float expression is not implemented");
3652+
if (!(*pretregs & mCX))
3653+
{
3654+
printf("*pretregs = %d is not implemented\n", *pretregs);
3655+
assert(0, "moving cfloat to register other than CX is not implemented");
3656+
}
3657+
pop87();
3658+
cdb.genfltreg(ESC(MFfloat,1),BX,0); // FSTP floatreg
3659+
genfwait(cdb);
3660+
getregs(cdb,mCX);
3661+
cdb.genfltreg(LOD, CX, 4); // MOV RCX,floatreg
3662+
3663+
pop87();
3664+
cdb.genfltreg(ESC(MFfloat,1),BX,0); // FSTP floatreg
3665+
genfwait(cdb);
3666+
cdb.genfltreg(LOD, CX, 0); // MOV RCX,floatreg
3667+
}
36493668
else if (tym == TYcfloat && *pretregs & (mAX|mDX) && retregs & mST01)
36503669
{
36513670
if (*pretregs & mPSW && !(retregs & mPSW))

test/runnable/test18772.d

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
1-
float fun(cfloat z)
1+
float getreal(cfloat z)
22
{
33
return z.re;
44
}
5+
float geti(cfloat z)
6+
{
7+
return z.im;
8+
}
59

610
void main()
711
{
812
cfloat[1] A;
913
float[1] B;
1014
int i = 0;
11-
double C = fun(A[i] * B[i]);
15+
A[0] = 2.0f + 4i;
16+
B[0] = 3.0f;
17+
assert(((2.0f + 4i) * 3.0f).re == getreal(A[i] * B[i]));
18+
//assert(((2.0f + 4i) * 3.0f).im == geti(A[i] * B[i]));
19+
double C = getreal(A[i] * B[i]);
1220
}

0 commit comments

Comments
 (0)