<div dir="ltr">On Fri, Mar 24, 2017 at 4:27 AM, Renato Golin <span dir="ltr"><<a href="mailto:renato.golin@linaro.org" target="_blank">renato.golin@linaro.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On 22 March 2017 at 01:38, Friedman, Eli <<a href="mailto:efriedma@codeaurora.org">efriedma@codeaurora.org</a>> wrote:<br>
>> Small example fail.c:<br>
>><br>
>>    // clang -O2 -target armv7a-none-none-eabi -mfloat-abi=hard -ffast-math<br>
>> -S fail.c -o -<br>
>>    extern float sinf (float x);<br>
>>    float sin1 (float x) {return (sinf (x));}<br>
<br>
</span>I changed your example slightly to make sure we're passing the<br>
arguments, otherwise 'sin1' just becomes 'b sinf', which is "correct"<br>
on both hard and soft float.<br>
<span class=""><br>
extern float sinf (float x);<br>
</span>float sin1 (float x, float y) {return (sinf (y)+x);}<br>
<span class=""><br>
<br>
>> generates code to pass the parameter in r0 and expect the result in r0.<br>
>> The same code without -ffast-math compiles correctly. It also works with<br>
>> -fno-builtin-sinf.<br>
<br>
</span>Right, so this is the problem. You're declaring a function that is<br>
declared in the C library, and the compiler will try and match it with<br>
what it understands of the ABI (via builtins).<br>
<br>
In this case, GCC and Clang "understand" different things about them,<br>
and I'm not saying Clang is right. But if you want to use your own<br>
sine functions, using -fno-builtin-sinf is the *right* way to go.<br>
<br>
So, now that you have a work around that makes sense (and can progress<br>
without us blocking you), let's talk about the problem at hand.<br>
<span class=""><br>
<br>
> It would be more accurate to say -ffast-math makes the compiler treat sin()<br>
> as a builtin, and therefore recreate the declaration from scratch.<br>
<br>
</span>Precisely.<br>
<br>
But the problem is not as simple as it seems. We had a conversation<br>
about this during the US LLVM last year, and the conclusion is that<br>
soft-float ABI functions should always have soft-float calling<br>
conventions (GCC seems to agree). But sin/cos are not soft-fp<br>
functions at all.<br>
<br>
Looking at the patch, sin/cos wasn't wrongly bundled with the soft-fp<br>
nodes, so it's possible that fast-math is combining nodes, thus<br>
changing the behaviour of the selection dag wrt calling conventions.<br>
<br>
Saleem,<br>
<br>
Any light on why is sin/cos bundled with soft-fp handling?<br></blockquote><div><br></div><div>sin/cos are libm functions, and so a libcall to those need to honour the floating point ABI requests.  The calling convention to be followed there should match `-mfloat-abi` (that is, -mfloat-abi=hard => AAPCS/VFP, -mfloat-abi=soft => AAPCS).</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
cheers,<br>
--renato<br>
</blockquote></div><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org</div>
</div></div>