Skip to content

Commit 0b9850f

Browse files
authored
add 128 bit float support to cdorth() (dlang#21293)
1 parent 78a7d57 commit 0b9850f

2 files changed

Lines changed: 76 additions & 23 deletions

File tree

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,6 +1341,10 @@ enum CLIB_A
13411341
{
13421342
realToDouble,
13431343
doubleToReal,
1344+
add,
1345+
min,
1346+
mul,
1347+
div,
13441348
netf2,
13451349
}
13461350

@@ -1398,6 +1402,38 @@ void getClibFunction(uint clib, ref Symbol* s, ref ClibInfo* cinfo, objfmt_t obj
13981402
break;
13991403
}
14001404

1405+
case CLIB_A.add:
1406+
{
1407+
string name = "__addtf3";
1408+
s = symboly(name, mask(32) | mask(33));
1409+
cinfo.retregs = mask(32);
1410+
break;
1411+
}
1412+
1413+
case CLIB_A.min:
1414+
{
1415+
string name = "__subtf3";
1416+
s = symboly(name, mask(32) | mask(33));
1417+
cinfo.retregs = mask(32);
1418+
break;
1419+
}
1420+
1421+
case CLIB_A.mul:
1422+
{
1423+
string name = "__multf3";
1424+
s = symboly(name, mask(32) | mask(33));
1425+
cinfo.retregs = mask(32);
1426+
break;
1427+
}
1428+
1429+
case CLIB_A.div:
1430+
{
1431+
string name = "__divtf3";
1432+
s = symboly(name, mask(32) | mask(33));
1433+
cinfo.retregs = mask(32);
1434+
break;
1435+
}
1436+
14011437
case CLIB_A.netf2:
14021438
{
14031439
string name = "__netf2";

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

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import dmd.backend.oper;
3737
import dmd.backend.ty;
3838
import dmd.backend.type;
3939
import dmd.backend.x86.xmm;
40-
import dmd.backend.arm.cod1 : loadFromEA, storeToEA, getlvalue;
40+
import dmd.backend.arm.cod1 : loadFromEA, storeToEA, getlvalue, CLIB_A, callclib;
4141
import dmd.backend.arm.cod3 : conditionCode, genBranch, gentstreg, movregconst, COND, loadFloatRegConst;
4242
import dmd.backend.arm.instr;
4343

@@ -96,30 +96,47 @@ void cdorth(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
9696

9797
if (tyfloating(ty1))
9898
{
99-
uint ftype = sz == 2 ? 3 :
100-
sz == 4 ? 0 : 1;
101-
switch (e.Eoper)
99+
if (sz == 16) // 128 bit float
102100
{
103-
// FADD/FSUB (extended register)
104-
// http://www.scs.stanford.edu/~zyedidia/arm64/encodingindex.html#addsub_ext
105-
case OPadd:
106-
cdb.gen1(INSTR.fadd_float(ftype,Rm,Rn,Rd)); // FADD Rd,Rn,Rm
107-
break;
108-
109-
case OPmin:
110-
cdb.gen1(INSTR.fsub_float(ftype,Rm,Rn,Rd)); // FSUB Rd,Rn,Rm
111-
break;
112-
113-
case OPmul:
114-
cdb.gen1(INSTR.fmul_float(ftype,Rm,Rn,Rd)); // FMUL Rd,Rn,Rm
115-
break;
116-
117-
case OPdiv:
118-
cdb.gen1(INSTR.fdiv_float(ftype,Rm,Rn,Rd)); // FDIV Rd,Rn,Rm
119-
break;
101+
uint clib;
102+
switch (e.Eoper)
103+
{
104+
case OPadd: clib = CLIB_A.add; break;
105+
case OPmin: clib = CLIB_A.min; break;
106+
case OPmul: clib = CLIB_A.mul; break;
107+
case OPdiv: clib = CLIB_A.div; break;
120108

121-
default:
122-
assert(0);
109+
default:
110+
assert(0);
111+
}
112+
callclib(cdb,e,clib,pretregs,0);
113+
}
114+
else
115+
{
116+
const ftype = INSTR.szToFtype(sz);
117+
switch (e.Eoper)
118+
{
119+
// FADD/FSUB (extended register)
120+
// http://www.scs.stanford.edu/~zyedidia/arm64/encodingindex.html#addsub_ext
121+
case OPadd:
122+
cdb.gen1(INSTR.fadd_float(ftype,Rm,Rn,Rd)); // FADD Rd,Rn,Rm
123+
break;
124+
125+
case OPmin:
126+
cdb.gen1(INSTR.fsub_float(ftype,Rm,Rn,Rd)); // FSUB Rd,Rn,Rm
127+
break;
128+
129+
case OPmul:
130+
cdb.gen1(INSTR.fmul_float(ftype,Rm,Rn,Rd)); // FMUL Rd,Rn,Rm
131+
break;
132+
133+
case OPdiv:
134+
cdb.gen1(INSTR.fdiv_float(ftype,Rm,Rn,Rd)); // FDIV Rd,Rn,Rm
135+
break;
136+
137+
default:
138+
assert(0);
139+
}
123140
}
124141
pretregs = retregs | PSW;
125142
fixresult(cdb,e,mask(Rd),pretregs);

0 commit comments

Comments
 (0)