From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ulrich Drepper To: egcs@cygnus.com Subject: next glibc showstopper Date: Fri, 21 Nov 1997 21:50:00 -0000 Message-id: X-SW-Source: 1997-11/msg00706.html Hi, Here's the next problem which prevent successfully compiling the glibc with the current egcs on ix86: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ double r (double, double); extern inline int bar (double x) { union { double d; int i[2]; } u = { d: x }; return u.i[1] < 0; } int foo (double d1, double d2) { double e = r (d1, d2); if (bar (d1) && bar (e)) <---- PROBLEM return 1; else return 5; return 0; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The fault part of the code is this: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 12: e8 fc ff ff ff call 13 17: dd 45 08 fldl 0x8(%ebp) 1a: dd 5d f8 fstpl 0xfffffff8(%ebp) if (bar (d1) && bar (e)) 1d: 83 7d fc 00 cmpl $0x0,0xfffffffc(%ebp) 21: 7d 0d jnl 30 23: dd 5d f8 fstpl 0xfffffff8(%ebp) \ here is something 26: 7d 0a jnl 32 / missing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ After the call to `r' (address 12) the return value is in %st(0). The according to the inline function `d1' is tested. It is copied on the stack (why?) and the correct word is tested against $0. This is ok. But now the return value must be checked. Here only the storing happens but NO compare instruction sets the flags. I.e., the flags as determined for `d1' are used. -- Uli ---------------. drepper at gnu.org ,-. Rubensstrasse 5 Ulrich Drepper \ ,-------------------' \ 76149 Karlsruhe/Germany Cygnus Solutions `--' drepper at cygnus.com `------------------------