Hi,

With tcc 0.9.25 on x86_64, x == x is regarded as true, even for NaN.
I've looked at the generated code with "tcc -c" and "objdump -d" for:

int main(void)
{
  volatile double x = 0.0/0.0;
  return x == x ? 1 : 0;
}

It appears:

[...]
  37:   66 0f 2e 45 f8          ucomisd -0x8(%rbp),%xmm0
  3c:   0f 85 05 00 00 00       jne    47 <main+0x47>
  42:   e9 0a 00 00 00          jmpq   51 <main+0x51>
  47:   b8 00 00 00 00          mov    $0x0,%eax
  4c:   e9 05 00 00 00          jmpq   56 <main+0x56>
  51:   b8 01 00 00 00          mov    $0x1,%eax
  56:   e9 00 00 00 00          jmpq   5b <main+0x5b>
  5b:   c9                      leaveq 
  5c:   c3                      retq   

According to

  
http://www.sesp.cse.clrc.ac.uk/html/SoftwareTools/vtune/users_guide/mergedProjects/analyzer_ec/mergedProjects/reference_olh/mergedProjects/instructions/instruct32_hh/vc314.htm

(found with Google), one has:

UNORDERED:    ZF,PF,CF <- 111;
GREATER_THAN: ZF,PF,CF <- 000;
LESS_THAN:    ZF,PF,CF <- 001;
EQUAL:        ZF,PF,CF <- 100;

If I understand correctly (I've never worked with x86/x86_64 asm
code), the jne tests the ZF flag, but this flag is set also for
unordered (the case of NaN). Hence the incorrect result.

-- 
Vincent Lefèvre <[email protected]> - Web: <http://www.vinc17.net/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.net/blog/>
Work: CR INRIA - computer arithmetic / Arénaire project (LIP, ENS-Lyon)


_______________________________________________
Tinycc-devel mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/tinycc-devel

Reply via email to