Skip to content

Commit 0f74e94

Browse files
authored
AArch64 does not support x87 intrinsics (dlang#22664)
1 parent 835610c commit 0f74e94

4 files changed

Lines changed: 17 additions & 0 deletions

File tree

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,6 +1686,13 @@ void cdcnvt(ref CGstate cg, ref CodeBuilder cdb,elem* e, ref regm_t pretregs)
16861686

16871687
case OPd_ld: // call __extenddftf2
16881688
case OPld_d: // call __trunctfdf2
1689+
if (sz == 8 && tysize(e.E1.Ety) == 8) // same size means no-op
1690+
{
1691+
codelem(cgstate,cdb,e.E1,pretregs,false);
1692+
freenode(e);
1693+
return;
1694+
}
1695+
16891696
regm_t retregs1 = mask(32);
16901697
codelem(cgstate,cdb,e.E1,retregs1,false);
16911698
import dmd.backend.arm.cod1 : CLIB_A, callclib;

compiler/src/dmd/backend/x86/cg87.d

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3327,6 +3327,7 @@ void cnvt87(ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
33273327
@trusted
33283328
void cdrndtol(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
33293329
{
3330+
assert(!cg.AArch64);
33303331
if (pretregs == 0)
33313332
{
33323333
codelem(cgstate,cdb,e.E1,pretregs,false);
@@ -3383,6 +3384,7 @@ void cdrndtol(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
33833384
@trusted
33843385
void cdscale(ref CGstate cg, ref CodeBuilder cdb,elem* e,ref regm_t pretregs)
33853386
{
3387+
assert(!cg.AArch64);
33863388
assert(pretregs != 0);
33873389

33883390
regm_t retregs = mST0;
@@ -3783,6 +3785,7 @@ void fixresult_complex87(ref CodeBuilder cdb,elem* e,regm_t retregs, ref regm_t
37833785
@trusted
37843786
void cdconvt87(ref CGstate cg, ref CodeBuilder cdb, elem* e, ref regm_t pretregs)
37853787
{
3788+
assert(!cg.AArch64);
37863789
regm_t retregs = mST01;
37873790
codelem(cgstate,cdb,e.E1, retregs, false);
37883791
switch (e.Eoper)
@@ -3931,6 +3934,7 @@ void loadPair87(ref CodeBuilder cdb, elem* e, ref regm_t outretregs)
39313934
void cdtoprec(ref CGstate cg, ref CodeBuilder cdb, elem* e, ref regm_t pretregs)
39323935
{
39333936
//printf("cdtoprec: pretregs = %s\n", regm_str(pretregs));
3937+
assert(!cg.AArch64);
39343938
if (!pretregs)
39353939
{
39363940
codelem(cgstate,cdb,e.E1,pretregs,false);

compiler/src/dmd/glue/toir.d

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,9 @@ int intrinsic_op(FuncDeclaration fd)
601601
{
602602
if (op == OPbsf || op == OPbsr || op == OPbtc || op == OPbtr || op == OPbts)
603603
return NotIntrinsic; // TODO AArch64
604+
if (op == OPcos || op == OPsin || op == OPrint || op == OPsqrt || op == OPscale ||
605+
op == OPrndtol || op == OPyl2xp1 || op == OPtoPrec)
606+
return NotIntrinsic; // x87 only
604607
}
605608
return op;
606609

compiler/src/dmd/root/ctfloat.d

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,11 @@ extern (C++) struct CTFloat
4141

4242
version (GNU)
4343
enum yl2x_supported = false;
44+
else version (AArch64)
45+
enum yl2x_supported = false; // no x87 FPU
4446
else
4547
enum yl2x_supported = __traits(compiles, core.math.yl2x(1.0L, 2.0L));
48+
4649
enum yl2xp1_supported = yl2x_supported;
4750

4851
static void yl2x(const real_t* x, const real_t* y, real_t* res) pure

0 commit comments

Comments
 (0)