Skip to content

Commit c8cd7d6

Browse files
WalterBrightthewilsonator
authored andcommitted
implement comparison for 128 bit floats
1 parent e8dbbd2 commit c8cd7d6

2 files changed

Lines changed: 40 additions & 9 deletions

File tree

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,7 +1345,13 @@ enum CLIB_A
13451345
min,
13461346
mul,
13471347
div,
1348+
eqtf2,
13481349
netf2,
1350+
gttf2,
1351+
getf2,
1352+
lttf2,
1353+
letf2,
1354+
13491355
}
13501356

13511357
private
@@ -1384,6 +1390,12 @@ void initClibInfo(ref Symbol*[CLIB_A.max + 1] clibsyms, ref ClibInfo[CLIB_A.max
13841390
private
13851391
void getClibFunction(uint clib, ref Symbol* s, ref ClibInfo* cinfo, objfmt_t objfmt, exefmt_t exe)
13861392
{
1393+
void declare(string name)
1394+
{
1395+
s = symboly(name, mask(32));
1396+
cinfo.retregs = mask(32);
1397+
}
1398+
13871399
switch (clib)
13881400
{
13891401
case CLIB_A.realToDouble:
@@ -1434,13 +1446,12 @@ void getClibFunction(uint clib, ref Symbol* s, ref ClibInfo* cinfo, objfmt_t obj
14341446
break;
14351447
}
14361448

1437-
case CLIB_A.netf2:
1438-
{
1439-
string name = "__netf2";
1440-
s = symboly(name, mask(32));
1441-
cinfo.retregs = mask(32);
1442-
break;
1443-
}
1449+
case CLIB_A.netf2: declare("__netf2"); break;
1450+
case CLIB_A.eqtf2: declare("__eqtf2"); break;
1451+
case CLIB_A.lttf2: declare("__lttf2"); break;
1452+
case CLIB_A.letf2: declare("__letf2"); break;
1453+
case CLIB_A.gttf2: declare("__gttf2"); break;
1454+
case CLIB_A.getf2: declare("__getf2"); break;
14441455

14451456
default:
14461457
assert(0);

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -933,8 +933,28 @@ void cdcmp(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
933933
scodelem(cgstate,cdb,e2,retregs2,retregs1,true); // right leaf
934934
reg_t Vm = findreg(retregs1);
935935
reg_t Vn = findreg(retregs2);
936-
uint ftype = INSTR.szToFtype(sz);
937-
cdb.gen1(INSTR.fcmpe_float(ftype,Vm,Vn)); // FCMPE Vn,Vm
936+
if (tym == TYldouble || tym == TYildouble)
937+
{
938+
CLIB_A clib;
939+
switch (jop)
940+
{
941+
case COND.eq: clib = CLIB_A.eqtf2; break;
942+
case COND.ne: clib = CLIB_A.netf2; break;
943+
case COND.lt: clib = CLIB_A.lttf2; break;
944+
case COND.le: clib = CLIB_A.letf2; break;
945+
case COND.gt: clib = CLIB_A.gttf2; break;
946+
case COND.ge: clib = CLIB_A.getf2; break;
947+
default: assert(0);
948+
}
949+
regm_t dummy;
950+
callclib(cdb,null,clib,dummy,0);
951+
gentstreg(cdb,0,0); // CMP w0,#0
952+
}
953+
else
954+
{
955+
uint ftype = INSTR.szToFtype(sz);
956+
cdb.gen1(INSTR.fcmpe_float(ftype,Vm,Vn)); // FCMPE Vn,Vm
957+
}
938958
goto L3;
939959
}
940960

0 commit comments

Comments
 (0)