https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119617
--- Comment #11 from Haochen Jiang <haochen.jiang at intel dot com> --- We have two temporary solutions in GCC 14 and GCC 15 since we could not simply reject -mno-evex512. In GCC 16, since it is deprecated, no more issue for that. Plan A: Use vmovq to only clear lower 64 bit. --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -5453,7 +5453,7 @@ standard_sse_constant_opcode (rtx_insn *insn, rtx *operands) else if (TARGET_EVEX512) return "vxorps\t%g0, %g0, %g0"; else - gcc_unreachable (); + return "xor\t%%rax, %%rax\n\tvmovq\t{%%rax, %x0|%x0, %%rax}"; } else { @@ -5462,7 +5462,7 @@ standard_sse_constant_opcode (rtx_insn *insn, rtx *operands) else if (TARGET_EVEX512) return "vpxord\t%g0, %g0, %g0"; else - gcc_unreachable (); + return "xor\t%%rax, %%rax\n\tvmovq\t{%%rax, %x0|%x0, %%rax}"; } } return "vxorps\t%x0, %x0, %x0"; Plan B: Clear the whole zmm even this is under -mno-evex512 since all HW could run that code. diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index 4f8380c4a58..f1e5535bf71 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -5450,19 +5450,15 @@ standard_sse_constant_opcode (rtx_insn *insn, rtx *operands) { if (TARGET_AVX512VL) return "vxorps\t%x0, %x0, %x0"; - else if (TARGET_EVEX512) - return "vxorps\t%g0, %g0, %g0"; else - gcc_unreachable (); + return "vxorps\t%g0, %g0, %g0"; } else { if (TARGET_AVX512VL) return "vpxord\t%x0, %x0, %x0"; - else if (TARGET_EVEX512) - return "vpxord\t%g0, %g0, %g0"; else - gcc_unreachable (); + return "vpxord\t%g0, %g0, %g0"; } } return "vxorps\t%x0, %x0, %x0"; I am ok with both. Which way do you prefer?