https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81467
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> --- If you want to clobber the xmm16-31 and/or k registers, do it conditionally based on preprocessor macros: __asm ("...." : ... : ... : "..." #if defined(__AVX512F__) && defined(__x86_64__) , "xmm18" #endif #if defined(__AVX512F__) , "k4" #endif ); xmm16+ is only available in m64/mx31 code (thus __x86_64__) and if AVX512F is included. Then if you compile code with -mavx512f -m64 or similar, it will clobber those registers, otherwise the registers aren't really available to the compiler and don't have to be clobbered. As for 2), you haven't read the gcc documentation. { and } are special characters in the inline asm templates, for supporting multiple dialects. So you need to use "vmovdqu32 0(%0), %%zmm0 %{%%k1%}%{z%}".