Hello all,

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.

For Xmm, Ymm, Zmm registers the function defines globalRegType like this:
https://github.com/ghc/ghc/blob/master/compiler/cmm/CmmExpr.hs#L585-L587

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

The function `globalRegType` is internally called by the function
`cmmRegType` (
https://github.com/ghc/ghc/blob/838b69032566ce6ab3918d70e8d5e098d0bcee02/compiler/cmm/CmmExpr.hs#L275)
which is itself used in a number of places in the x86 code generator.

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.

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:

`globalRegType :: DynFlags -> GlobalReg -> CmmType`

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?

Thanks
Abhiroop Sakar
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to