<div dir="ltr"><div>Yes, xorpd is an IEEE-754 negate, but as you noted, this is not (if LLVM starts respecting FP exceptions and rounding modes):<br><pre class="" id="comment_text_0">  %fsub = fsub float -0.0, %fabsf</pre>
<br></div>So as suggested, LLVM IR requires an fneg instruction or intrinsic to preserve the fneg operation in the C source down to the asm.<br><div><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">
On Fri, Aug 8, 2014 at 1:06 PM, Stephen Canon <span dir="ltr"><<a href="mailto:scanon@apple.com" target="_blank">scanon@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><div class=""><br><div><blockquote type="cite"><div>On Aug 8, 2014, at 2:59 PM, Sanjay Patel <<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.com</a>> wrote:</div>
<br><div><div dir="ltr"><div>FYI, I was looking at the SSE/AVX codegen here:<br><a href="http://llvm.org/bugs/show_bug.cgi?id=20578" target="_blank">http://llvm.org/bugs/show_bug.cgi?id=20578</a><br><br></div>If LLVM starts caring about FP exceptions, even this won't be possible. Is there a way of doing an IEEE-754 fneg in C/C++? Ie, there's no fneg() in libm, so any C method we choose could cause an exception, and that's not allowed by the IEEE definition of fneg.</div>
</div></blockquote><br></div></div><div>Huh? XOR[PS|PD] is an IEEE-754 negate( ) on x86; it does not raise any FP exceptions.</div><div><br></div><div>In C, it’s not specified at present whether –x corresponds to negate( ), but the general belief (among IEEE-754 committee members) seems to be that it should, and historically clang has mostly tried to behave that way.</div>
<div><br></div><div>On a platform where –x does not correspond to the IEEE-754 negate( ) operation, but the FP representation is known, you would type-pun to integer (via union or memcpy), xor the signbit, and type-pun back to FP to get the result.  The only platform I know of where even this isn’t possible is i386 under an ABI that returns on the x87 stack, where loading a single- or double- sNaN necessarily signals invalid.  Thankfully, the last such machine is now … what, 15 years old?</div>
<div><br></div><div>– Steve</div></div></blockquote></div><br></div>