Skip to content

Commit 8d75186

Browse files
authored
fix post increment of floats (dlang#21348)
1 parent d59f075 commit 8d75186

3 files changed

Lines changed: 13 additions & 10 deletions

File tree

compiler/src/dmd/backend/arm/cod2.d

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1957,6 +1957,7 @@ void floatPost(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
19571957
elem* e2 = e.E2;
19581958
const tym_t ty1 = tybasic(e.E1.Ety);
19591959
const sz = _tysize[ty1];
1960+
assert(sz <= 8); // TODO AArch64 16 byte floats
19601961
const ftype = INSTR.szToFtype(sz);
19611962

19621963
regm_t retregs;
@@ -1988,6 +1989,7 @@ void floatPost(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
19881989
retregs = INSTR.FLOATREGS;
19891990
reg = allocreg(cdb,retregs,ty1);
19901991
loadFromEA(cs,reg,sz == 8 ? 8 : 4,sz);
1992+
cdb.gen(&cs);
19911993
}
19921994

19931995
if (regvar && pretregs == mPSW)
@@ -2000,16 +2002,17 @@ void floatPost(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
20002002
regm_t vretregs = INSTR.FLOATREGS & ~mask(cs.reg);
20012003
reg_t vreg = allocreg(cdb,vretregs,ty1);
20022004
double value = sz == 8 ? e2.Vdouble : e2.Vfloat;
2005+
uint opx = e.Eoper == OPpostinc ? 0 : 1;
20032006
loadFloatRegConst(cdb,vreg,value,sz); // FMOV vreg,value
20042007

20052008
switch (e.Eoper)
20062009
{
20072010
case OPpostinc:
2008-
cdb.gen1(INSTR.fadd_float(ftype,reg,vreg,reg)); // FADD Rd,Rn,Rm
2011+
cdb.gen1(INSTR.fadd_float(ftype,vreg,reg,reg)); // FADD Rd,Rn,Rm
20092012
break;
20102013

20112014
case OPpostdec:
2012-
cdb.gen1(INSTR.fsub_float(ftype,reg,vreg,reg)); // FSUB Rd,Rn,Rm
2015+
cdb.gen1(INSTR.fsub_float(ftype,vreg,reg,reg)); // FSUB Rd,Rn,Rm
20132016
break;
20142017

20152018
default:
@@ -2036,11 +2039,11 @@ void floatPost(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
20362039
switch (e.Eoper)
20372040
{
20382041
case OPpostinc:
2039-
cdb.gen1(INSTR.fadd_float(ftype,reg,vreg,reg)); // FADD Rd,Rn,Rm
2042+
cdb.gen1(INSTR.fadd_float(ftype,vreg,reg,reg)); // FADD Rd,Rn,Rm
20402043
break;
20412044

20422045
case OPpostdec:
2043-
cdb.gen1(INSTR.fsub_float(ftype,reg,vreg,reg)); // FSUB Rd,Rn,Rm
2046+
cdb.gen1(INSTR.fsub_float(ftype,vreg,reg,reg)); // FSUB Rd,Rn,Rm
20442047
break;
20452048

20462049
default:

compiler/src/dmd/backend/arm/cod4.d

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -567,19 +567,19 @@ void floatOpAss(ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
567567
// FADD/FSUB (extended register)
568568
// http://www.scs.stanford.edu/~zyedidia/arm64/encodingindex.html#floatdp2
569569
case OPaddass:
570-
cdb.gen1(INSTR.fadd_float(ftype,Rm,Rn,Rd)); // FADD Rd,Rn,Rm
570+
cdb.gen1(INSTR.fadd_float(ftype,Rn,Rm,Rd)); // FADD Rd,Rn,Rm
571571
break;
572572

573573
case OPminass:
574-
cdb.gen1(INSTR.fsub_float(ftype,Rm,Rn,Rd)); // FSUB Rd,Rn,Rm
574+
cdb.gen1(INSTR.fsub_float(ftype,Rn,Rm,Rd)); // FSUB Rd,Rn,Rm
575575
break;
576576

577577
case OPmulass:
578-
cdb.gen1(INSTR.fmul_float(ftype,Rm,Rn,Rd)); // FMUL Rd,Rn,Rm
578+
cdb.gen1(INSTR.fmul_float(ftype,Rn,Rm,Rd)); // FMUL Rd,Rn,Rm
579579
break;
580580

581581
case OPdivass:
582-
cdb.gen1(INSTR.fdiv_float(ftype,Rm,Rn,Rd)); // FDIV Rd,Rn,Rm
582+
cdb.gen1(INSTR.fdiv_float(ftype,Rn,Rm,Rd)); // FDIV Rd,Rn,Rm
583583
break;
584584

585585
default:
@@ -953,7 +953,7 @@ void cdcmp(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
953953
else
954954
{
955955
uint ftype = INSTR.szToFtype(sz);
956-
cdb.gen1(INSTR.fcmpe_float(ftype,Vm,Vn)); // FCMPE Vn,Vm
956+
cdb.gen1(INSTR.fcmpe_float(ftype,Vn,Vm)); // FCMPE Vn,Vm
957957
}
958958
goto L3;
959959
}

compiler/src/dmd/backend/elem.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1488,7 +1488,7 @@ elem* el_convert(ref GlobalOptimizer go, elem* e)
14881488
*/
14891489
if (tyreal(e.Ety) && // don't bother with imaginary or complex
14901490
e.E2.Eoper == OPconst && el_toldoubled(e.E2) == 2.0L &&
1491-
!go.AArch64) // doesn't do the *2 optimization
1491+
!go.AArch64) // TODO AArch64 do the *2 optimization
14921492
{
14931493
e.E1 = el_convert(go, e.E1);
14941494
/* Don't call el_convert(e.E2), we want it to stay as a constant

0 commit comments

Comments
 (0)