Unfortunately the asm produced by ldc shows the call to the array equality function still. Fifth try:
bool isInitNaN(T)(T x) if (isFloatingPoint!T) { union FPData { T f; static if (T.sizeof == uint.sizeof) { uint data; } else static if (T.sizeof == ulong.sizeof) { ulong data; } else static if (T.sizeof == 10) { ulong data1; ushort data2; } else static if (T.sizeof == 12) { ulong data1; uint data2; } else static if (T.sizeof == 16) { ulong data1; ulong data2; } else { ubyte[T.sizeof] data; } } static FPData fnan, fpd; fpd.f = x; static if (T.sizeof == 10 || T.sizeof == 12 || T.sizeof == 16) return fnan.data1 == fpd.data1 && fnan.data2 == fpd.data2; else return fnan.data == fpd.data; } Bye, bearophile