On Wed, 9 Aug 2023, Wang, Phoebe via Gcc-patches wrote: > Proposal 3: Change the ABI of 512-bit vector and always be > passed/returned from memory.
Changing ABIs like that for existing code that has worked for some time on existing hardware is a bad idea. At this point it seems appropriate to remind people of another ABI consideration for vector extensions. glibc's libmvec defines vector versions of various functions, including AVX512 ones (of course those function versions only work on hardware with the relevant instructions). glibc's headers use both _Pragma ("omp declare simd notinbranch") and __attribute__ ((__simd__ ("notinbranch"))) to declare, to the compiler including those headers, what function variants are available in glibc. Existing glibc versions need to continue to work with new compiler versions. That is, it's part of the ABI, which must remain stable, exactly which function versions the above pragma and attribute imply are available - and of course the details of how those functions versions take arguments / return results are also part of the ABI (it would be OK for a new compiler to choose not to use some of those vector versions, but not to start calling them with a different ABI). Maybe you'll want to add new vector function versions, with different interfaces, to libmvec in future. If so, you need a *different* pragma or attribute to declare to the compiler that the libmvec version using that pragma or attribute has the additional functions - so new compilers using the existing header will not try to generate calls to new function versions that don't exist in that glibc version (but new compilers using a new header version from new glibc will see the new pragma or attribute and so be able to generate the relevant calls to new functions). And once you've defined the ABI for such a new pragma or attribute, that itself then becomes a stable interface - so if you end up with vector extensions involving yet another set of interfaces, they need another corresponding new pragma / attribute for libmvec to declare to the compiler that the new interfaces exist. -- Joseph S. Myers jos...@codesourcery.com