[Issue 16327] New: direct floating point equal comparison fails on 32-bit emulation
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Wed Jul 27 10:05:54 PDT 2016
https://issues.dlang.org/show_bug.cgi?id=16327
Issue ID: 16327
Summary: direct floating point equal comparison fails on 32-bit
emulation
Product: D
Version: D2
Hardware: x86_64
OS: Linux
Status: NEW
Severity: normal
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: greensunny12 at gmail.com
--------
S fun(S)(in S x)
{
return -1 / x;
}
unittest
{
import std.meta : AliasSeq;
foreach (S; AliasSeq!(float, double, real))
{
import std.stdio;
S i = fun!S(3);
assert(i == S(-1) / 3); // this lines passes
assert(fun!S(3) == S(-1) / 3); // error
}
}
--------
I tested 32-bit with this command on a x86_64 platform.
rdmd -main -unittest -m32
Assembler:
----------
.text._D3foo14__unittestL6_1FZv segment
assume CS:.text._D3foo14__unittestL6_1FZv
_D3foo14__unittestL6_1FZv:
push EBP
mov EBP,ESP
sub ESP,4
push dword ptr FLAT:.rodata[08h]
call _D3foo15__T8crazyfunTfZ8crazyfunFNaNbNiNfxfZf at PC32
fstp float ptr -4[EBP]
fld float ptr -4[EBP]
fld float ptr _D3foo12__ModuleInfoZ at SYM32[0Dh]
fucompp ST(1),ST
fstsw AX
sahf
jp L26
je L30
L26: mov EAX,0Eh
call _D3foo15__unittest_failFiZv at PC32
L30: push dword ptr _TMP3 at SYM32[0Ah]
call _D3foo15__T8crazyfunTfZ8crazyfunFNaNbNiNfxfZf at PC32
fld float ptr _TMP3 at SYM32[019h]
fucompp ST(1),ST
fstsw AX
sahf
jp L4A
je L54
L4A: mov EAX,0Fh
call _D3foo15__unittest_failFiZv at PC32
L54: leave
ret
nop
nop
.text._D3foo14__unittestL6_1FZv ends
.text._D3foo15__T8crazyfunTfZ8crazyfunFNaNbNiNfxfZf segment
assume CS:.text._D3foo15__T8crazyfunTfZ8crazyfunFNaNbNiNfxfZf
_D3foo15__T8crazyfunTfZ8crazyfunFNaNbNiNfxfZf:
fld float ptr FLAT:.rodata[0Ah]
fdiv float ptr 4[ESP]
ret 4
nop
nop
nop
.text._D3foo15__T8crazyfunTfZ8crazyfunFNaNbNiNfxfZf ends
--
More information about the Digitalmars-d-bugs
mailing list