phobos unittests not passing with dmd built by clang
Martin Nowak
dawg at dawgfoto.de
Wed Feb 1 11:13:08 PST 2012
On Wed, 01 Feb 2012 10:58:12 +0100, Don Clugston <dac at nospam.com> wrote:
> On 01/02/12 09:44, dennis luehring wrote:
>>> The behaviour of the sign bit is completely specified in the x86
>>> manuals. As that link says, the C standard got it wrong in a couple of
>>> places.
>>> The one thing which is implementation specific is that on Intel, an 80
>>> bit load of a signalling NaN doesn't raise an exception, whereas it
>>> does
>>> on AMD. I don't know what Via does.
>>
>> just a question:
>>
>> would it be a good idea to test this platform specific behavior
>> in the phobos unit-tests?
>>
>> produce "an 80 bit load of a signalling NaN"
>> check:
>> intel: do not raise
>> amd: do raise
>> via: ...
>>
>> maybe only for showing that D is aware of this special cases?
>
> It doesn't matter very much. If you load, and then do any operation
> (such as add) you'll get an exception. AMD will trigger one instruction
> earlier.
> Hardly anybody knows this -- I haven't found any references to it. It's
> in wikipedia, but the entry that mentions it was written by me!
>
> There is an underlying problem we have though. What _is_ T.init?
> If a variable of type T is default initialized as "this is
> uninitialized", what is T.init?
>
> In most cases, the compiler should give you a "variable XXX is used
> before set" error anyway.
"long double val = NAN;"
This is sNaN for Clang and qNaN for GCC.
--------------
At least on my Intel loading a sNaN and storing it in a double adds a sign.
--------------
import std.stdio, std.math;
void main()
{
ubyte[10] snan = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
0xFF, 0x7F];
ubyte[10] qnan = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
0xFF, 0x7F];
real srval = 0, qrval = 0;
double sdval = 0, qdval = 0;
asm
{
fld real ptr snan[RBP];
fst double ptr sdval[RBP];
fstp real ptr srval[RBP];
fld real ptr qnan[RBP];
fst double ptr qdval[RBP];
fstp real ptr qrval[RBP];
}
writefln("%s %s %s %s", srval, signbit(srval), sdval, signbit(sdval));
writefln("%s %s %s %s", qrval, signbit(qrval), qdval, signbit(qdval));
}
--------------
nan 0 nan 1
nan 0 nan 0
More information about the Digitalmars-d
mailing list