On Mon, Feb 4, 2013 at 3:19 PM, Geoffrey Mainland <span dir="ltr">&lt;<a href="mailto:mainland@apeiron.net" target="_blank">mainland@apeiron.net</a>&gt;</span> wrote:<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

What would a sensible fallback be for AVX instructions? What should we<br>
fall back on when the LLVM backend is not being used?<br></blockquote><div><br></div><div>Depends on the instruction. A 256-bit multiply could be replaced by N multiplies etc. For popcount we have a little bit of C code in ghc-prim that we use if SSE 4.2 isn&#39;t enabled. An alternative is to emit some different assembly in e.g. the x86-64 backend if AVX isn&#39;t enabled.</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Maybe we could desugar AVX instructions to SSE instructions on platforms<br>
that support SSE but not AVX, but in practice people would then #ifdef<br>
anyway and just use SSE if AVX weren&#39;t available.<br></blockquote><div><br></div><div>I don&#39;t follow here. If you conditionally emitted different instructions in the backends depending on which -m flags are passed to GHC, why would people #ifdef?</div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The current idea is to hide the #ifdefs in a library. Clients of the<br>
library would then get the &quot;best&quot; short-vector implementation available<br>
for their platform by using this library. Right now this library is a<br>
modified version of primitive, and I have modified versions of vector<br>
and DPH that use this version of the primitive library to generate SSE<br>
code.<br></blockquote><div><br></div><div>You would still end up with an GHC.Exts that exports a different API depending on which flags (e.g. -m&lt;something&gt;) are passed to GHC. Couldn&#39;t you use ghc-prim for your fallbacks and have GHC.Exts.yourPrimOp use either those fallbacks or the AVX instructions.</div>

<div><br></div><div>-- Johan</div><div><br></div></div>