<div dir="ltr">hrmm, i think i can help with this tomorrow/ rest of the week, (esp since i'm one of your mentors :) )<div><br></div><div>but if other folks have design ideas, more than happy to use as many ideas as possible!</div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Jun 27, 2018 at 5:32 PM Abhiroop Sarkar <<a href="mailto:asiamgenius@gmail.com">asiamgenius@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div dir="ltr" class="m_-5563502741034449259gmail_signature"><div>Hello all,</div><div><br></div><div>I am currently working on adding support for SIMD operations to the native code generator. One of the roadblocks I faced recently was the definition of the `globalRegType` function in "compiler/cmm/CmmExpr.hs". The `globalRegType` function maps the STG registers to the respective `CmmType` datatype.</div><div><br></div><div>For Xmm, Ymm, Zmm registers the function defines globalRegType like this: <a href="https://github.com/ghc/ghc/blob/master/compiler/cmm/CmmExpr.hs#L585-L587" target="_blank">https://github.com/ghc/ghc/blob/master/compiler/cmm/CmmExpr.hs#L585-L587</a></div><div><br></div><div>Consider the case for an Xmm register, the above definition limits an Xmm register to hold only vectors of size 4. However we can store 2 64-bit Doubles or 16 Int8s or 8 Int16s and so on</div><div><br></div><div>The function `globalRegType` is internally called by the function `cmmRegType` (<a href="https://github.com/ghc/ghc/blob/838b69032566ce6ab3918d70e8d5e098d0bcee02/compiler/cmm/CmmExpr.hs#L275" target="_blank">https://github.com/ghc/ghc/blob/838b69032566ce6ab3918d70e8d5e098d0bcee02/compiler/cmm/CmmExpr.hs#L275</a>) which is itself used in a number of places in the x86 code generator.</div><div><br></div><div>In fact depending on the result of the `cmmRegType` function is another important function `cmmTypeFormat` defined in Format.hs whose result is used to print the actual assembly instruction.</div><div><br></div><div>I have extended all the other Format types to include VectorFormats, however this definition of the `globalRegType` seems incorrect to me. Looking at the signature of the function itself:</div><div><br></div><div>`globalRegType :: DynFlags -> GlobalReg -> CmmType`<br><br>its actually difficult to predict the CmmType by just looking at the GlobalReg in case of Xmm, Ymm, Zmm. So thats why my original question how do I go about solving this. Should I modify the GlobalReg type to contain more information like Width and Length(for Xmm, Ymm, Zmm)  or do I somehow pass the length and width information to the globalRegType function?</div><div><br></div><div>Thanks</div><div>Abhiroop Sakar</div></div></div>
_______________________________________________<br>
ghc-devs mailing list<br>
<a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br>
</blockquote></div>