|
Message-ID: <alpine.LRH.2.02.1902280132030.8764@key0.esi.com.au> Date: Thu, 28 Feb 2019 02:38:44 +1100 (AEDT) From: Damian McGuckin <damianm@....com.au> To: musl@...ts.openwall.com Subject: Re: FE Exception triggered by comparison On Wed, 27 Feb 2019, Alexander Monakov wrote: >> I understand this. But, at least on an X86 architecture, that involves >> a write-to+read-from memory and I want to avoid that. > > I don't understand this claim. With both SSE and x87 this should amount > to comparing a register with itself and testing flags. Can you > elaborate? I would love to be proved wrong, but if you want something that is safe from generating an exception with an signalling NaN, you need to do this. For qNaN stuff, I personally normally do if (x != x) /* then 'x' is an NaN */ but I find that isnan(x) does not expand to anything like this. Anyway, when I tried the code below, I was just shocked. #include <math.h> #include <stdio.h> main() { double x = 5.0; x -= x, x /= x; printf("what %s\n", isnan(x) ? "yes" : "no!"); return(0); } Looking at the assembler, there is a subroutine call to __isnan. Awful! >>> Well, sorry, but these instructions do not work that way. Any >>> operation on a NaN, including comparison, even comparison for >>> equality, will raise IE, at least if it is an sNaN. > > (for sNaNs, sure, but notably for qNaNs comparisons for equality, as > opposed to ordered comparisons, should not raise "invalid" in C and C++) You are correct. Markus was reading the standard incorrectly I believe. Or maybe my explanation of what I was trying to do was poor and Markus simply misunderstood what I was trying to say! >> However, on experiments on GCC, the if/else/else/else above does not >> raise an IE. Is this an optimizer bug? > > You're probably seeing the long-standing bug in gcc x86 backend where it > would emit 'ucom'-kind instructions for both ordered and equality > comparisons. It appears to be finally fixed starting from GCC 8. Wonderful. Thanks for that information. GCC 8 is on my list of updates but I have yet to get around to it. I will rerun my tests against that. I do lament that I have to resort to using isless() macro and friends to do a comparison in C/C++ without triggering an IE. It really does seriously compromise the readability of code. It would be nice if we had operators like ~<= instead of having to use the long-winded islessequal Than again, everybody wants their own succint operators and there are only a limited number of characters to exploit. I think Professor Kahan asked for !< for 'not less than' over 20 years ago and we have not seen any movement on that front. Regards - Damian Pacific Engineering Systems International, 277-279 Broadway, Glebe NSW 2037 Ph:+61-2-8571-0847 .. Fx:+61-2-9692-9623 | unsolicited email not wanted here Views & opinions here are mine and not those of any past or present employer
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.