https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89229
--- Comment #19 from H.J. Lu <hjl.tools at gmail dot com> --- sse.md has (define_insn "mov<mode>_internal" [(set (match_operand:VMOVE 0 "nonimmediate_operand" "=v,v ,v ,m") (match_operand:VMOVE 1 "nonimmediate_or_sse_const_operand" " C,BC,vm,v"))] .... /* There is no evex-encoded vmov* for sizes smaller than 64-bytes in avx512f, so we need to use workarounds, to access sse registers 16-31, which are evex-only. In avx512vl we don't need workarounds. */ if (TARGET_AVX512F && <MODE_SIZE> < 64 && !TARGET_AVX512VL && (EXT_REX_SSE_REG_P (operands[0]) || EXT_REX_SSE_REG_P (operands[1]))) { if (memory_operand (operands[0], <MODE>mode)) { if (<MODE_SIZE> == 32) return "vextract<shuffletype>64x4\t{$0x0, %g1, %0|%0, %g1, 0x0}"; else if (<MODE_SIZE> == 16) return "vextract<shuffletype>32x4\t{$0x0, %g1, %0|%0, %g1, 0x0}"; else gcc_unreachable (); } ... However, ix86_hard_regno_mode_ok has /* TODO check for QI/HI scalars. */ /* AVX512VL allows sse regs16+ for 128/256 bit modes. */ if (TARGET_AVX512VL && (mode == OImode || mode == TImode || VALID_AVX256_REG_MODE (mode) || VALID_AVX512VL_128_REG_MODE (mode))) return true; /* xmm16-xmm31 are only available for AVX-512. */ if (EXT_REX_SSE_REGNO_P (regno)) return false; if (TARGET_AVX512F && <MODE_SIZE> < 64 && !TARGET_AVX512VL && (EXT_REX_SSE_REG_P (operands[0]) || EXT_REX_SSE_REG_P (operands[1]))) is a dead code: [hjl@gnu-4 gcc]$ cat /tmp/z.c #include <immintrin.h> extern __m128 i; __m128 foo1 (void) { register __m128 xmm16 __asm ("xmm16") = i; asm volatile ("" : "+v" (xmm16)); register __m128 xmm17 __asm ("xmm17") = xmm16; asm volatile ("" : "+v" (xmm17)); return xmm17; } [hjl@gnu-4 gcc]$ /usr/gcc-5.4.1-x32/bin/gcc -S -O2 -march=knl /tmp/z.c /tmp/z.c: In function ‘foo1’: /tmp/z.c:8:19: error: register specified for ‘xmm16’ isn’t suitable for data type register __m128 xmm16 __asm ("xmm16") = i; ^ /tmp/z.c:10:19: error: register specified for ‘xmm17’ isn’t suitable for data type register __m128 xmm17 __asm ("xmm17") = xmm16; ^ [hjl@gnu-4 gcc]$