Skip to content

Commit 414e335

Browse files
WalterBrightthewilsonator
authored andcommitted
implement complex add and subtract
1 parent fb63a78 commit 414e335

1 file changed

Lines changed: 36 additions & 0 deletions

File tree

  • compiler/src/dmd/backend/arm

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,44 @@ void cdorth(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
9393

9494
regm_t PSW = pretregs & mPSW;
9595

96+
bool isPair = isRegisterPair(true, ty, 0);
97+
9698
if (tyfloating(ty1))
9799
{
100+
if (isPair)
101+
{
102+
assert(sz != 32); // TODO AArch64
103+
Rd = findreg(retregs & INSTR.LSW);
104+
Rn = findreg(retregs1 & INSTR.LSW);
105+
Rm = findreg(retregs2 & INSTR.LSW);
106+
107+
reg_t Rd0 = findreg(retregs & INSTR.MSW);
108+
reg_t Rn0 = findreg(retregs1 & INSTR.MSW);
109+
reg_t Rm0 = findreg(retregs2 & INSTR.MSW);
110+
111+
const ftype = INSTR.szToFtype(sz / 2);
112+
switch (e.Eoper)
113+
{
114+
// FADD/FSUB (extended register)
115+
// http://www.scs.stanford.edu/~zyedidia/arm64/encodingindex.html#addsub_ext
116+
case OPadd:
117+
cdb.gen1(INSTR.fadd_float(ftype,Rm0,Rn0,Rd0)); // FADD Rd0,Rn0,Rm0 LSW
118+
cdb.gen1(INSTR.fadd_float(ftype,Rm,Rn,Rd)); // FADD Rd,Rn,Rm MSW
119+
break;
120+
121+
case OPmin:
122+
cdb.gen1(INSTR.fsub_float(ftype,Rm0,Rn0,Rd0)); // FSUB Rd0,Rn0,Rm0 LSW
123+
cdb.gen1(INSTR.fsub_float(ftype,Rm,Rn,Rd)); // FSUB Rd,Rn,Rm MSW
124+
break;
125+
126+
default:
127+
assert(0);
128+
}
129+
pretregs = retregs | PSW;
130+
fixresult(cdb,e,retregs,pretregs);
131+
return;
132+
}
133+
98134
if (sz == 16) // 128 bit float
99135
{
100136
uint clib;

0 commit comments

Comments
 (0)