I’m looking for a ways of defining register files with non-standard machine value type in tablegen. The value types not covered by SimpleValueType enum. For example (from the top of my head) 25 bit integers, or 8 way 18 bit integers. These types going to be used with intrinsics so I also need appropriate C custom types defined.
I wonder if I can describe those in tablegen files or do I need to extend llvm. What is the right way of supporting such types?
I’m not familiar will llvm internals so far, so any help and pointers appreciated.
You would need an MVT type defined for every legal type you have, so you would need to add those. However, LLVM has a pretty widely spread assumption of 8-bit bytes, so that will be far more problematic for your target. Fixing that would be a large project.
We maintain a set of patches for enabling 24/40-bit MVTs, and also a set of patches to support 16-bit bytes. I can provide them upon request. (Only llvm, no clang patches yet.)
Users can extend our architecture with own register files and own instructions. They are not limited to a narrow set of bit widths. I think, to support such extensions, I’ll need to handle MVTs dynamically. Perhaps, use standard MVTs whenever is possible and reserve a range for extensions.
Still, it’s interesting to see your set of 24/40-bit MVTs related patches, this might be a good example on how to extend MVTs. Is it publicly available?