https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78794
--- Comment #5 from Uroš Bizjak <ubizjak at gmail dot com> --- diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 1cd1cd8..f718040 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -3417,7 +3417,10 @@ dimode_scalar_chain::compute_convert_gain () || GET_CODE (src) == AND) { gain += ix86_cost->add; - if (CONST_INT_P (XEXP (src, 0))) + /* Additional gain for andnot. */ + if (GET_CODE (XEXP (src, 0)) == NOT) + gain += ix86_cost->add; + else if (CONST_INT_P (XEXP (src, 0))) gain -= vector_const_cost (XEXP (src, 0)); if (CONST_INT_P (XEXP (src, 1))) gain -= vector_const_cost (XEXP (src, 1)); results in: .L4: movq (%eax), %xmm1 movdqa %xmm1, %xmm4 pandn %xmm2, %xmm4 movdqa %xmm4, %xmm0 punpcklqdq %xmm4, %xmm0 ptest %xmm0, %xmm0 jne .L3 pxor %xmm3, %xmm1 movq %xmm1, (%eax) .L3: addl $12, %eax cmpl %edx, %eax jne .L4 Please note pandn that replaces pand/pxor. Can you please test the patch on your codebase?