Search code examples
gccarmv8sve

ARM-SVE: wrapping runtime sized register


In a generic SIMD library eve we were looking into supporting length agnostic sve

However, we cannot wrap a sizeless register into a struct to do some meta-programming around it.

struct foo {
  svint8_t a;
};

Is there a way to do it? Either clang or gcc.

I found some talk of __sizeless_struct and some patches flying around but I think it didn't go anywhere. I also found these gcc tests - no wrapping of a register in a struct.


Solution

  • No, unfortunately this isn't possible (at the time of writing). __sizeless_struct was an experimental feature that Arm added as part of the initial downstream implementation of the SVE ACLE in Clang. The main purpose was to allow tuple types like svfloat32x3_t to be defined directly in <arm_sve.h>. But the feature had complex, counter-trend semantics. It broke one of the fundamental rules of C++, which is that all class objects have a constant size, so it would have been an ongoing maintenance burden for upstream compilers.

    __sizeless_struct (or something like it) probably wouldn't be acceptable for a portable SIMD framework, since the sizeless struct would inherit all of the restrictions of sizeless vector types: no global variables, no uses in normal structs, etc. Either all SIMD targets would have to live by those restrictions, or the restrictions would vary by target (limiting portability).

    Function-based abstraction might be a better starting point than class-based abstraction for SIMD frameworks that want to support variable-length vectors. Google Highway is an example of this and it works well for SVE.