<div dir="ltr">On 23 July 2013 17:05, bearophile <span dir="ltr"><<a href="mailto:bearophileHUGS@lycos.com" target="_blank">bearophileHUGS@lycos.com</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">Manu:<div class="im"><br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
//    return [arb[0] - aib[0], arb[1] + aib[1]]; // this final line is<br>
tricky... it's not very portable.<br>
<br>
    // Maybe:<br>
    return select([-1, 0], arb-aib, arb+aib);<br>
    // Hopefully the x86 optimiser will generate the proper opcode. Or a<br>
bunch of other options; a multi-vector shuffle, shift, swizzle, interleave.<br>
}<br>
<br>
I think that would be better. More portable, and it eliminates the code<br>
that implies a vector->float->vector cast sequence, which I maintain,<br>
should be syntactically discouraged at all costs.<br>
You don't want to be giving people bad ideas that it's reasonable code to<br>
write ;)<br>
</blockquote>
<br></div>
Apparently that select() uses __builtin_ia32_pblendvb128, that is a SSE4.1 instruction. At the moment I have only SSE3 :-(<br></blockquote><div><br></div><div>It's probably better to use a shuf, or a shift for compatibility, since the selection predicate is constant anyway.</div>
</div></div></div>