[llvm] SelectionDAG] Expand CLMUL of zero-extended all-ones operand via parallel prefix XOR (PR #207339)

Jan Schultke via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 3 00:55:13 PDT 2026


https://github.com/eisenwave created https://github.com/llvm/llvm-project/pull/207339

Fixes #204870

>From af0ecfe58c56bcfaa48b5f2db974c598d50a0ce3 Mon Sep 17 00:00:00 2001
From: Eisenwave <me at eisenwave.net>
Date: Fri, 3 Jul 2026 09:49:58 +0200
Subject: [PATCH 1/2] [SelectionDAG] Add @clmul_i32_zext_allones test

---
 llvm/test/CodeGen/X86/clmul-vector.ll | 311 ++++++++++++++++++++++++++
 llvm/test/CodeGen/X86/clmul.ll        |  73 ++++++
 2 files changed, 384 insertions(+)

diff --git a/llvm/test/CodeGen/X86/clmul-vector.ll b/llvm/test/CodeGen/X86/clmul-vector.ll
index c56bd11d8e658..91b75b150dfa7 100644
--- a/llvm/test/CodeGen/X86/clmul-vector.ll
+++ b/llvm/test/CodeGen/X86/clmul-vector.ll
@@ -6673,6 +6673,317 @@ define <4 x i32> @clmul_v4i32_allones(<4 x i32> %x) nounwind {
   ret <4 x i32> %r
 }
 
+define <4 x i32> @clmul_v4i32_zext_allones(<4 x i16> %x) nounwind {
+; SSE2-NOPCLMUL-LABEL: clmul_v4i32_zext_allones:
+; SSE2-NOPCLMUL:       # %bb.0:
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm0, %xmm0
+; SSE2-NOPCLMUL-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3]
+; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm14 = [572662306,572662306,572662306,572662306]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT:    pand %xmm14, %xmm4
+; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm2 = [4369,4369,4369,4369]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm4, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm11 = xmm4[1,1,3,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm11, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
+; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm15 = [8738,8738,8738,8738]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm8, %xmm7
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm7
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm7[0],xmm1[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7
+; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm12 = [34952,34952,34952,34952]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm7, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm9, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
+; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
+; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm13 = [17476,17476,17476,17476]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm6, %xmm10
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm10
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm10[0],xmm0[1],xmm10[1]
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pand %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm4, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm11, %xmm2
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm2
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm14 = [4369,4369,4369,4369]
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm14, %xmm2
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm8, %xmm10
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm14, %xmm10
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm10[0],xmm2[1],xmm10[1]
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm7, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm9, %xmm10
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm10
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm10[0],xmm1[1],xmm10[1]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm10
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm10
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm14 = xmm10[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm6, %xmm10
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm10
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm14 = xmm14[0],xmm10[0],xmm14[1],xmm10[1]
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm14
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm2, %xmm14
+; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm14
+; SSE2-NOPCLMUL-NEXT:    por %xmm0, %xmm14
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm4, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm11, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm2
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm7, %xmm0
+; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm10 = [4369,4369,4369,4369]
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm10, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm9, %xmm2
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm10, %xmm2
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm2
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm15 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm6, %xmm2
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm2
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm15 = xmm15[0],xmm2[0],xmm15[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm0, %xmm15
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm15
+; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm15
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm4
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm11
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm5
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm8
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm8[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm0 = [8738,8738,8738,8738]
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm0, %xmm7
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm0, %xmm9
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm10, %xmm3
+; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm10, %xmm6
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; SSE2-NOPCLMUL-NEXT:    por %xmm15, %xmm0
+; SSE2-NOPCLMUL-NEXT:    por %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT:    retq
+;
+; SSE42-NOPCLMUL-LABEL: clmul_v4i32_zext_allones:
+; SSE42-NOPCLMUL:       # %bb.0:
+; SSE42-NOPCLMUL-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
+; SSE42-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm9 = [572662306,572662306,572662306,572662306]
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm3
+; SSE42-NOPCLMUL-NEXT:    pand %xmm9, %xmm3
+; SSE42-NOPCLMUL-NEXT:    pmovsxwd {{.*#+}} xmm1 = [4369,4369,4369,4369]
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm5
+; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm1, %xmm5
+; SSE42-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm11 = [286331153,286331153,286331153,286331153]
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm2
+; SSE42-NOPCLMUL-NEXT:    pand %xmm11, %xmm2
+; SSE42-NOPCLMUL-NEXT:    pmovsxwd {{.*#+}} xmm4 = [8738,8738,8738,8738]
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm2, %xmm12
+; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm4, %xmm12
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm5, %xmm12
+; SSE42-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm8 = [1145324612,1145324612,1145324612,1145324612]
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm5
+; SSE42-NOPCLMUL-NEXT:    pand %xmm8, %xmm5
+; SSE42-NOPCLMUL-NEXT:    pmovzxwd {{.*#+}} xmm7 = [34952,34952,34952,34952]
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm13
+; SSE42-NOPCLMUL-NEXT:    pmulld %xmm7, %xmm13
+; SSE42-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm6 = [2290649224,2290649224,2290649224,2290649224]
+; SSE42-NOPCLMUL-NEXT:    pand %xmm6, %xmm0
+; SSE42-NOPCLMUL-NEXT:    pmovsxwd {{.*#+}} xmm10 = [17476,17476,17476,17476]
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm14
+; SSE42-NOPCLMUL-NEXT:    pmulld %xmm10, %xmm14
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm13, %xmm14
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm12, %xmm14
+; SSE42-NOPCLMUL-NEXT:    pand %xmm9, %xmm14
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm9
+; SSE42-NOPCLMUL-NEXT:    pmulld %xmm7, %xmm9
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm2, %xmm12
+; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm1, %xmm12
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm9, %xmm12
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm13
+; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm10, %xmm13
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm9
+; SSE42-NOPCLMUL-NEXT:    pmulld %xmm4, %xmm9
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm13, %xmm9
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm12, %xmm9
+; SSE42-NOPCLMUL-NEXT:    pand %xmm11, %xmm9
+; SSE42-NOPCLMUL-NEXT:    por %xmm14, %xmm9
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm11
+; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm4, %xmm11
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm2, %xmm12
+; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm10, %xmm12
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm11, %xmm12
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm11
+; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm1, %xmm11
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm13
+; SSE42-NOPCLMUL-NEXT:    pmulld %xmm7, %xmm13
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm11, %xmm13
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm12, %xmm13
+; SSE42-NOPCLMUL-NEXT:    pand %xmm8, %xmm13
+; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm10, %xmm3
+; SSE42-NOPCLMUL-NEXT:    pmulld %xmm7, %xmm2
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm3, %xmm2
+; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm4, %xmm5
+; SSE42-NOPCLMUL-NEXT:    pmulld %xmm1, %xmm0
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm5, %xmm0
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm2, %xmm0
+; SSE42-NOPCLMUL-NEXT:    pand %xmm6, %xmm0
+; SSE42-NOPCLMUL-NEXT:    por %xmm13, %xmm0
+; SSE42-NOPCLMUL-NEXT:    por %xmm9, %xmm0
+; SSE42-NOPCLMUL-NEXT:    retq
+;
+; SSE2-PCLMUL-LABEL: clmul_v4i32_zext_allones:
+; SSE2-PCLMUL:       # %bb.0:
+; SSE2-PCLMUL-NEXT:    pxor %xmm1, %xmm1
+; SSE2-PCLMUL-NEXT:    movl $65535, %eax # imm = 0xFFFF
+; SSE2-PCLMUL-NEXT:    movq %rax, %xmm2
+; SSE2-PCLMUL-NEXT:    pextrw $3, %xmm0, %eax
+; SSE2-PCLMUL-NEXT:    movd %eax, %xmm3
+; SSE2-PCLMUL-NEXT:    pextrw $1, %xmm0, %eax
+; SSE2-PCLMUL-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; SSE2-PCLMUL-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-PCLMUL-NEXT:    pclmulqdq $1, %xmm2, %xmm1
+; SSE2-PCLMUL-NEXT:    pclmulqdq $0, %xmm2, %xmm3
+; SSE2-PCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
+; SSE2-PCLMUL-NEXT:    pclmulqdq $0, %xmm2, %xmm0
+; SSE2-PCLMUL-NEXT:    movd %eax, %xmm3
+; SSE2-PCLMUL-NEXT:    pclmulqdq $0, %xmm2, %xmm3
+; SSE2-PCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
+; SSE2-PCLMUL-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE2-PCLMUL-NEXT:    retq
+;
+; SSE42-PCLMUL-LABEL: clmul_v4i32_zext_allones:
+; SSE42-PCLMUL:       # %bb.0:
+; SSE42-PCLMUL-NEXT:    movl $65535, %eax # imm = 0xFFFF
+; SSE42-PCLMUL-NEXT:    movq %rax, %xmm2
+; SSE42-PCLMUL-NEXT:    pextrw $1, %xmm0, %eax
+; SSE42-PCLMUL-NEXT:    movd %eax, %xmm3
+; SSE42-PCLMUL-NEXT:    pclmulqdq $0, %xmm2, %xmm3
+; SSE42-PCLMUL-NEXT:    pextrw $0, %xmm0, %eax
+; SSE42-PCLMUL-NEXT:    movd %eax, %xmm1
+; SSE42-PCLMUL-NEXT:    pclmulqdq $0, %xmm2, %xmm1
+; SSE42-PCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
+; SSE42-PCLMUL-NEXT:    pextrw $2, %xmm0, %eax
+; SSE42-PCLMUL-NEXT:    movd %eax, %xmm3
+; SSE42-PCLMUL-NEXT:    pclmulqdq $0, %xmm2, %xmm3
+; SSE42-PCLMUL-NEXT:    movq %xmm3, %rax
+; SSE42-PCLMUL-NEXT:    pinsrd $2, %eax, %xmm1
+; SSE42-PCLMUL-NEXT:    pextrw $3, %xmm0, %eax
+; SSE42-PCLMUL-NEXT:    movd %eax, %xmm0
+; SSE42-PCLMUL-NEXT:    pclmulqdq $0, %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT:    movq %xmm0, %rax
+; SSE42-PCLMUL-NEXT:    pinsrd $3, %eax, %xmm1
+; SSE42-PCLMUL-NEXT:    movdqa %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT:    retq
+;
+; AVX2-LABEL: clmul_v4i32_zext_allones:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    movl $65535, %eax # imm = 0xFFFF
+; AVX2-NEXT:    vmovq %rax, %xmm1
+; AVX2-NEXT:    vpextrw $1, %xmm0, %eax
+; AVX2-NEXT:    vmovd %eax, %xmm2
+; AVX2-NEXT:    vpclmulqdq $0, %xmm1, %xmm2, %xmm2
+; AVX2-NEXT:    vpextrw $0, %xmm0, %eax
+; AVX2-NEXT:    vmovd %eax, %xmm3
+; AVX2-NEXT:    vpclmulqdq $0, %xmm1, %xmm3, %xmm3
+; AVX2-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
+; AVX2-NEXT:    vpextrw $2, %xmm0, %eax
+; AVX2-NEXT:    vmovd %eax, %xmm3
+; AVX2-NEXT:    vpclmulqdq $0, %xmm1, %xmm3, %xmm3
+; AVX2-NEXT:    vmovq %xmm3, %rax
+; AVX2-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
+; AVX2-NEXT:    vpextrw $3, %xmm0, %eax
+; AVX2-NEXT:    vmovd %eax, %xmm0
+; AVX2-NEXT:    vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vmovq %xmm0, %rax
+; AVX2-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm0
+; AVX2-NEXT:    retq
+;
+; AVX512-LABEL: clmul_v4i32_zext_allones:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    movl $65535, %eax # imm = 0xFFFF
+; AVX512-NEXT:    vmovq %rax, %xmm1
+; AVX512-NEXT:    vpextrw $1, %xmm0, %eax
+; AVX512-NEXT:    vmovd %eax, %xmm2
+; AVX512-NEXT:    vpclmulqdq $0, %xmm1, %xmm2, %xmm2
+; AVX512-NEXT:    vpextrw $0, %xmm0, %eax
+; AVX512-NEXT:    vmovd %eax, %xmm3
+; AVX512-NEXT:    vpclmulqdq $0, %xmm1, %xmm3, %xmm3
+; AVX512-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
+; AVX512-NEXT:    vpextrw $2, %xmm0, %eax
+; AVX512-NEXT:    vmovd %eax, %xmm3
+; AVX512-NEXT:    vpclmulqdq $0, %xmm1, %xmm3, %xmm3
+; AVX512-NEXT:    vmovq %xmm3, %rax
+; AVX512-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
+; AVX512-NEXT:    vpextrw $3, %xmm0, %eax
+; AVX512-NEXT:    vmovd %eax, %xmm0
+; AVX512-NEXT:    vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vmovq %xmm0, %rax
+; AVX512-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm0
+; AVX512-NEXT:    retq
+  %x32 = zext <4 x i16> %x to <4 x i32>
+  %r = call <4 x i32> @llvm.clmul.v4i32(<4 x i32> %x32, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>)
+  ret <4 x i32> %r
+}
+
 define <2 x i64> @clmul_v2i64_allones(<2 x i64> %x) nounwind {
 ; SSE-NOPCLMUL-LABEL: clmul_v2i64_allones:
 ; SSE-NOPCLMUL:       # %bb.0:
diff --git a/llvm/test/CodeGen/X86/clmul.ll b/llvm/test/CodeGen/X86/clmul.ll
index 3394d7081a677..d675e54143b4e 100644
--- a/llvm/test/CodeGen/X86/clmul.ll
+++ b/llvm/test/CodeGen/X86/clmul.ll
@@ -2022,6 +2022,79 @@ define i32 @clmul_i32_allones(i32 %x) nounwind {
   ret i32 %r
 }
 
+define i32 @clmul_i32_zext_allones(i16 %x) nounwind {
+; SCALAR-LABEL: clmul_i32_zext_allones:
+; SCALAR:       # %bb.0:
+; SCALAR-NEXT:    movl %edi, %eax
+; SCALAR-NEXT:    andl $8738, %eax # imm = 0x2222
+; SCALAR-NEXT:    imull $4369, %eax, %edx # imm = 0x1111
+; SCALAR-NEXT:    movl %edi, %ecx
+; SCALAR-NEXT:    andl $4369, %ecx # imm = 0x1111
+; SCALAR-NEXT:    imull $8738, %ecx, %esi # imm = 0x2222
+; SCALAR-NEXT:    xorl %edx, %esi
+; SCALAR-NEXT:    movl %edi, %edx
+; SCALAR-NEXT:    andl $17476, %edx # imm = 0x4444
+; SCALAR-NEXT:    imull $34952, %edx, %r8d # imm = 0x8888
+; SCALAR-NEXT:    andl $34952, %edi # imm = 0x8888
+; SCALAR-NEXT:    imull $17476, %edi, %r9d # imm = 0x4444
+; SCALAR-NEXT:    xorl %r8d, %r9d
+; SCALAR-NEXT:    xorl %esi, %r9d
+; SCALAR-NEXT:    andl $572662306, %r9d # imm = 0x22222222
+; SCALAR-NEXT:    imull $34952, %eax, %esi # imm = 0x8888
+; SCALAR-NEXT:    imull $4369, %ecx, %r8d # imm = 0x1111
+; SCALAR-NEXT:    xorl %esi, %r8d
+; SCALAR-NEXT:    imull $17476, %edx, %esi # imm = 0x4444
+; SCALAR-NEXT:    imull $8738, %edi, %r10d # imm = 0x2222
+; SCALAR-NEXT:    xorl %esi, %r10d
+; SCALAR-NEXT:    xorl %r8d, %r10d
+; SCALAR-NEXT:    andl $286331153, %r10d # imm = 0x11111111
+; SCALAR-NEXT:    orl %r9d, %r10d
+; SCALAR-NEXT:    imull $8738, %eax, %esi # imm = 0x2222
+; SCALAR-NEXT:    imull $17476, %ecx, %r8d # imm = 0x4444
+; SCALAR-NEXT:    xorl %esi, %r8d
+; SCALAR-NEXT:    imull $4369, %edx, %esi # imm = 0x1111
+; SCALAR-NEXT:    imull $34952, %edi, %r9d # imm = 0x8888
+; SCALAR-NEXT:    xorl %esi, %r9d
+; SCALAR-NEXT:    xorl %r8d, %r9d
+; SCALAR-NEXT:    andl $1145324612, %r9d # imm = 0x44444444
+; SCALAR-NEXT:    orl %r10d, %r9d
+; SCALAR-NEXT:    imull $17476, %eax, %eax # imm = 0x4444
+; SCALAR-NEXT:    imull $34952, %ecx, %ecx # imm = 0x8888
+; SCALAR-NEXT:    xorl %eax, %ecx
+; SCALAR-NEXT:    imull $8738, %edx, %edx # imm = 0x2222
+; SCALAR-NEXT:    imull $4369, %edi, %eax # imm = 0x1111
+; SCALAR-NEXT:    xorl %edx, %eax
+; SCALAR-NEXT:    xorl %ecx, %eax
+; SCALAR-NEXT:    andl $143165576, %eax # imm = 0x8888888
+; SCALAR-NEXT:    orl %r9d, %eax
+; SCALAR-NEXT:    retq
+;
+; SSE-PCLMUL-LABEL: clmul_i32_zext_allones:
+; SSE-PCLMUL:       # %bb.0:
+; SSE-PCLMUL-NEXT:    movzwl %di, %eax
+; SSE-PCLMUL-NEXT:    movl $65535, %ecx # imm = 0xFFFF
+; SSE-PCLMUL-NEXT:    movq %rcx, %xmm0
+; SSE-PCLMUL-NEXT:    movd %eax, %xmm1
+; SSE-PCLMUL-NEXT:    pclmulqdq $0, %xmm0, %xmm1
+; SSE-PCLMUL-NEXT:    movq %xmm1, %rax
+; SSE-PCLMUL-NEXT:    # kill: def $eax killed $eax killed $rax
+; SSE-PCLMUL-NEXT:    retq
+;
+; AVX-LABEL: clmul_i32_zext_allones:
+; AVX:       # %bb.0:
+; AVX-NEXT:    movzwl %di, %eax
+; AVX-NEXT:    movl $65535, %ecx # imm = 0xFFFF
+; AVX-NEXT:    vmovq %rcx, %xmm0
+; AVX-NEXT:    vmovd %eax, %xmm1
+; AVX-NEXT:    vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT:    vmovq %xmm0, %rax
+; AVX-NEXT:    # kill: def $eax killed $eax killed $rax
+; AVX-NEXT:    retq
+  %x32 = zext i16 %x to i32
+  %r = call i32 @llvm.clmul.i32(i32 %x32, i32 65535)
+  ret i32 %r
+}
+
 define i64 @clmul_i64_allones(i64 %x) nounwind {
 ; SCALAR-LABEL: clmul_i64_allones:
 ; SCALAR:       # %bb.0:

>From fc590099f96521ac7f7d4e85981d65909d48298a Mon Sep 17 00:00:00 2001
From: Eisenwave <me at eisenwave.net>
Date: Fri, 3 Jul 2026 09:51:41 +0200
Subject: [PATCH 2/2] [SelectionDAG] expand CLMUL of zero-extended all-ones
 operand via parallel prefix XOR

---
 .../CodeGen/SelectionDAG/TargetLowering.cpp   |  34 ++-
 llvm/test/CodeGen/X86/clmul-vector.ll         | 230 ++----------------
 llvm/test/CodeGen/X86/clmul.ll                |  50 +---
 3 files changed, 59 insertions(+), 255 deletions(-)

diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 00153ef66cf2c..20494c6cc9550 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -8909,16 +8909,30 @@ SDValue TargetLowering::expandCLMUL(SDNode *Node, SelectionDAG &DAG) const {
       }
     }
 
-    // Special case: clmul(X, ~0) is equivalent to a "parallel prefix XOR" or
-    // "bitwise parity" operation.
-    if (isAllOnesOrAllOnesSplat(Y)) {
-      SDValue R = X;
-      for (unsigned I = 1; I < BW; I <<= 1) {
-        SDValue ShAmt = DAG.getShiftAmountConstant(I, VT, DL);
-        SDValue Shifted = DAG.getNode(ISD::SHL, DL, VT, R, ShAmt);
-        R = DAG.getNode(ISD::XOR, DL, VT, R, Shifted);
-      }
-      return R;
+    // Special case: clmul(X, Y) where Y is a known constant (splat) that forms
+    // a contiguous block of trailing ones (e.g. i8 0xFF, i8 0x0F, ...). In this
+    // special case, clmul(X, Y) is equivalent to a "parallel prefix XOR" or
+    // "bitwise parity" operation on X, optionally surrounded by truncation
+    // and zero-extension.
+    if (auto *C = isConstOrConstSplat(Y, /*AllowUndefs=*/true)) {
+      APInt YVal = C->getAPIntValue();
+      unsigned N = YVal.countr_one();
+      if (N > 0 && YVal.countl_zero() + N == BW) {
+        EVT LoopVT = VT;
+        SDValue R = X;
+        if (N < BW) {
+          LoopVT = VT.changeElementType(Ctx, EVT::getIntegerVT(Ctx, N));
+          R = DAG.getNode(ISD::TRUNCATE, DL, LoopVT, R);
+        }
+        for (unsigned I = 1; I < N; I <<= 1) {
+          SDValue ShAmt = DAG.getShiftAmountConstant(I, LoopVT, DL);
+          SDValue Shifted = DAG.getNode(ISD::SHL, DL, LoopVT, R, ShAmt);
+          R = DAG.getNode(ISD::XOR, DL, LoopVT, R, Shifted);
+        }
+        if (N < BW)
+          R = DAG.getNode(ISD::ZERO_EXTEND, DL, VT, R);
+        return R;
+      }
     }
 
     // NOTE: If you change this expansion, please update the cost model
diff --git a/llvm/test/CodeGen/X86/clmul-vector.ll b/llvm/test/CodeGen/X86/clmul-vector.ll
index 91b75b150dfa7..32f6cd83c1532 100644
--- a/llvm/test/CodeGen/X86/clmul-vector.ll
+++ b/llvm/test/CodeGen/X86/clmul-vector.ll
@@ -6676,218 +6676,38 @@ define <4 x i32> @clmul_v4i32_allones(<4 x i32> %x) nounwind {
 define <4 x i32> @clmul_v4i32_zext_allones(<4 x i16> %x) nounwind {
 ; SSE2-NOPCLMUL-LABEL: clmul_v4i32_zext_allones:
 ; SSE2-NOPCLMUL:       # %bb.0:
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT:    pxor %xmm0, %xmm0
-; SSE2-NOPCLMUL-NEXT:    punpcklwd {{.*#+}} xmm3 = xmm3[0],xmm0[0],xmm3[1],xmm0[1],xmm3[2],xmm0[2],xmm3[3],xmm0[3]
-; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm14 = [572662306,572662306,572662306,572662306]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT:    pand %xmm14, %xmm4
-; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm2 = [4369,4369,4369,4369]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm4, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm11 = xmm4[1,1,3,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm11, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
-; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm15 = [8738,8738,8738,8738]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[1,1,3,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm8, %xmm7
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm7
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm7[0],xmm1[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT:    pxor %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7
-; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm12 = [34952,34952,34952,34952]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm7, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm9 = xmm7[1,1,3,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm9, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
-; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm13 = [17476,17476,17476,17476]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[1,1,3,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm6, %xmm10
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm10
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm10[0],xmm0[1],xmm10[1]
-; SSE2-NOPCLMUL-NEXT:    pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT:    paddw %xmm1, %xmm1
 ; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pand %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm4, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm11, %xmm2
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm2
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm14 = [4369,4369,4369,4369]
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm14, %xmm2
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm8, %xmm10
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm14, %xmm10
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm10[0],xmm2[1],xmm10[1]
-; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm7, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm9, %xmm10
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm10
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm10[0],xmm1[1],xmm10[1]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm10
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm10
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm14 = xmm10[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm6, %xmm10
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm10
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm14 = xmm14[0],xmm10[0],xmm14[1],xmm10[1]
-; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm14
-; SSE2-NOPCLMUL-NEXT:    pxor %xmm2, %xmm14
-; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm14
-; SSE2-NOPCLMUL-NEXT:    por %xmm0, %xmm14
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm4, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm11, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm15, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm1
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm2
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT:    pxor %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm7, %xmm0
-; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm10 = [4369,4369,4369,4369]
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm10, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm9, %xmm2
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm10, %xmm2
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm2
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm15 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    movdqa %xmm6, %xmm2
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm2
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm15 = xmm15[0],xmm2[0],xmm15[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT:    pxor %xmm0, %xmm15
-; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm15
-; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm15
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm4
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm13, %xmm11
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm11[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm5
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm12, %xmm8
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm8[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT:    pxor %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm0 = [8738,8738,8738,8738]
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm0, %xmm7
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm0, %xmm9
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm9[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm10, %xmm3
-; SSE2-NOPCLMUL-NEXT:    pmuludq %xmm10, %xmm6
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT:    pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT:    psllw $2, %xmm1
 ; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE2-NOPCLMUL-NEXT:    por %xmm15, %xmm0
-; SSE2-NOPCLMUL-NEXT:    por %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT:    psllw $4, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT:    psllw $8, %xmm1
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT:    pxor %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
 ; SSE2-NOPCLMUL-NEXT:    retq
 ;
 ; SSE42-NOPCLMUL-LABEL: clmul_v4i32_zext_allones:
 ; SSE42-NOPCLMUL:       # %bb.0:
+; SSE42-NOPCLMUL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm1
+; SSE42-NOPCLMUL-NEXT:    paddw %xmm1, %xmm1
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm0, %xmm1
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm1, %xmm0
+; SSE42-NOPCLMUL-NEXT:    psllw $2, %xmm0
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm1, %xmm0
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm1
+; SSE42-NOPCLMUL-NEXT:    psllw $4, %xmm1
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm0, %xmm1
+; SSE42-NOPCLMUL-NEXT:    movdqa %xmm1, %xmm0
+; SSE42-NOPCLMUL-NEXT:    psllw $8, %xmm0
+; SSE42-NOPCLMUL-NEXT:    pxor %xmm1, %xmm0
 ; SSE42-NOPCLMUL-NEXT:    pmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
-; SSE42-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm9 = [572662306,572662306,572662306,572662306]
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NOPCLMUL-NEXT:    pand %xmm9, %xmm3
-; SSE42-NOPCLMUL-NEXT:    pmovsxwd {{.*#+}} xmm1 = [4369,4369,4369,4369]
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm1, %xmm5
-; SSE42-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm11 = [286331153,286331153,286331153,286331153]
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NOPCLMUL-NEXT:    pand %xmm11, %xmm2
-; SSE42-NOPCLMUL-NEXT:    pmovsxwd {{.*#+}} xmm4 = [8738,8738,8738,8738]
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm2, %xmm12
-; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm4, %xmm12
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm5, %xmm12
-; SSE42-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm8 = [1145324612,1145324612,1145324612,1145324612]
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm5
-; SSE42-NOPCLMUL-NEXT:    pand %xmm8, %xmm5
-; SSE42-NOPCLMUL-NEXT:    pmovzxwd {{.*#+}} xmm7 = [34952,34952,34952,34952]
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm13
-; SSE42-NOPCLMUL-NEXT:    pmulld %xmm7, %xmm13
-; SSE42-NOPCLMUL-NEXT:    movdqa {{.*#+}} xmm6 = [2290649224,2290649224,2290649224,2290649224]
-; SSE42-NOPCLMUL-NEXT:    pand %xmm6, %xmm0
-; SSE42-NOPCLMUL-NEXT:    pmovsxwd {{.*#+}} xmm10 = [17476,17476,17476,17476]
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm14
-; SSE42-NOPCLMUL-NEXT:    pmulld %xmm10, %xmm14
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm13, %xmm14
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm12, %xmm14
-; SSE42-NOPCLMUL-NEXT:    pand %xmm9, %xmm14
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm9
-; SSE42-NOPCLMUL-NEXT:    pmulld %xmm7, %xmm9
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm2, %xmm12
-; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm1, %xmm12
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm9, %xmm12
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm13
-; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm10, %xmm13
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm9
-; SSE42-NOPCLMUL-NEXT:    pmulld %xmm4, %xmm9
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm13, %xmm9
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm12, %xmm9
-; SSE42-NOPCLMUL-NEXT:    pand %xmm11, %xmm9
-; SSE42-NOPCLMUL-NEXT:    por %xmm14, %xmm9
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm3, %xmm11
-; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm4, %xmm11
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm2, %xmm12
-; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm10, %xmm12
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm11, %xmm12
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm5, %xmm11
-; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm1, %xmm11
-; SSE42-NOPCLMUL-NEXT:    movdqa %xmm0, %xmm13
-; SSE42-NOPCLMUL-NEXT:    pmulld %xmm7, %xmm13
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm11, %xmm13
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm12, %xmm13
-; SSE42-NOPCLMUL-NEXT:    pand %xmm8, %xmm13
-; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm10, %xmm3
-; SSE42-NOPCLMUL-NEXT:    pmulld %xmm7, %xmm2
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm3, %xmm2
-; SSE42-NOPCLMUL-NEXT:    pmaddwd %xmm4, %xmm5
-; SSE42-NOPCLMUL-NEXT:    pmulld %xmm1, %xmm0
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm5, %xmm0
-; SSE42-NOPCLMUL-NEXT:    pxor %xmm2, %xmm0
-; SSE42-NOPCLMUL-NEXT:    pand %xmm6, %xmm0
-; SSE42-NOPCLMUL-NEXT:    por %xmm13, %xmm0
-; SSE42-NOPCLMUL-NEXT:    por %xmm9, %xmm0
 ; SSE42-NOPCLMUL-NEXT:    retq
 ;
 ; SSE2-PCLMUL-LABEL: clmul_v4i32_zext_allones:
diff --git a/llvm/test/CodeGen/X86/clmul.ll b/llvm/test/CodeGen/X86/clmul.ll
index d675e54143b4e..0a87c876297fb 100644
--- a/llvm/test/CodeGen/X86/clmul.ll
+++ b/llvm/test/CodeGen/X86/clmul.ll
@@ -2025,48 +2025,18 @@ define i32 @clmul_i32_allones(i32 %x) nounwind {
 define i32 @clmul_i32_zext_allones(i16 %x) nounwind {
 ; SCALAR-LABEL: clmul_i32_zext_allones:
 ; SCALAR:       # %bb.0:
-; SCALAR-NEXT:    movl %edi, %eax
-; SCALAR-NEXT:    andl $8738, %eax # imm = 0x2222
-; SCALAR-NEXT:    imull $4369, %eax, %edx # imm = 0x1111
-; SCALAR-NEXT:    movl %edi, %ecx
-; SCALAR-NEXT:    andl $4369, %ecx # imm = 0x1111
-; SCALAR-NEXT:    imull $8738, %ecx, %esi # imm = 0x2222
-; SCALAR-NEXT:    xorl %edx, %esi
-; SCALAR-NEXT:    movl %edi, %edx
-; SCALAR-NEXT:    andl $17476, %edx # imm = 0x4444
-; SCALAR-NEXT:    imull $34952, %edx, %r8d # imm = 0x8888
-; SCALAR-NEXT:    andl $34952, %edi # imm = 0x8888
-; SCALAR-NEXT:    imull $17476, %edi, %r9d # imm = 0x4444
-; SCALAR-NEXT:    xorl %r8d, %r9d
-; SCALAR-NEXT:    xorl %esi, %r9d
-; SCALAR-NEXT:    andl $572662306, %r9d # imm = 0x22222222
-; SCALAR-NEXT:    imull $34952, %eax, %esi # imm = 0x8888
-; SCALAR-NEXT:    imull $4369, %ecx, %r8d # imm = 0x1111
-; SCALAR-NEXT:    xorl %esi, %r8d
-; SCALAR-NEXT:    imull $17476, %edx, %esi # imm = 0x4444
-; SCALAR-NEXT:    imull $8738, %edi, %r10d # imm = 0x2222
-; SCALAR-NEXT:    xorl %esi, %r10d
-; SCALAR-NEXT:    xorl %r8d, %r10d
-; SCALAR-NEXT:    andl $286331153, %r10d # imm = 0x11111111
-; SCALAR-NEXT:    orl %r9d, %r10d
-; SCALAR-NEXT:    imull $8738, %eax, %esi # imm = 0x2222
-; SCALAR-NEXT:    imull $17476, %ecx, %r8d # imm = 0x4444
-; SCALAR-NEXT:    xorl %esi, %r8d
-; SCALAR-NEXT:    imull $4369, %edx, %esi # imm = 0x1111
-; SCALAR-NEXT:    imull $34952, %edi, %r9d # imm = 0x8888
-; SCALAR-NEXT:    xorl %esi, %r9d
-; SCALAR-NEXT:    xorl %r8d, %r9d
-; SCALAR-NEXT:    andl $1145324612, %r9d # imm = 0x44444444
-; SCALAR-NEXT:    orl %r10d, %r9d
-; SCALAR-NEXT:    imull $17476, %eax, %eax # imm = 0x4444
-; SCALAR-NEXT:    imull $34952, %ecx, %ecx # imm = 0x8888
+; SCALAR-NEXT:    # kill: def $edi killed $edi def $rdi
+; SCALAR-NEXT:    leal (%rdi,%rdi), %eax
+; SCALAR-NEXT:    xorl %edi, %eax
+; SCALAR-NEXT:    leal (,%rax,4), %ecx
 ; SCALAR-NEXT:    xorl %eax, %ecx
-; SCALAR-NEXT:    imull $8738, %edx, %edx # imm = 0x2222
-; SCALAR-NEXT:    imull $4369, %edi, %eax # imm = 0x1111
-; SCALAR-NEXT:    xorl %edx, %eax
+; SCALAR-NEXT:    movl %ecx, %eax
+; SCALAR-NEXT:    shll $4, %eax
 ; SCALAR-NEXT:    xorl %ecx, %eax
-; SCALAR-NEXT:    andl $143165576, %eax # imm = 0x8888888
-; SCALAR-NEXT:    orl %r9d, %eax
+; SCALAR-NEXT:    movl %eax, %ecx
+; SCALAR-NEXT:    shll $8, %ecx
+; SCALAR-NEXT:    xorl %eax, %ecx
+; SCALAR-NEXT:    movzwl %cx, %eax
 ; SCALAR-NEXT:    retq
 ;
 ; SSE-PCLMUL-LABEL: clmul_i32_zext_allones:



More information about the llvm-commits mailing list