[llvm] [SelectionDAG] Fix missed optimization for CLMUL where one operand is all ones (PR #200592)
Jan Schultke via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 3 02:55:40 PDT 2026
https://github.com/eisenwave updated https://github.com/llvm/llvm-project/pull/200592
>From 8b09bd68dc2e4deb556b11fbb326162ffb52bce7 Mon Sep 17 00:00:00 2001
From: Eisenwave <me at eisenwave.net>
Date: Sun, 31 May 2026 07:29:01 +0200
Subject: [PATCH 1/2] [SelectionDAG] Add tests for clmul with all-ones operand
---
llvm/test/CodeGen/X86/clmul-vector.ll | 6750 +++++++++++++++++++++++++
llvm/test/CodeGen/X86/clmul.ll | 2552 ++++++++++
2 files changed, 9302 insertions(+)
diff --git a/llvm/test/CodeGen/X86/clmul-vector.ll b/llvm/test/CodeGen/X86/clmul-vector.ll
index 6fd01e446897d..8278b01384c1e 100644
--- a/llvm/test/CodeGen/X86/clmul-vector.ll
+++ b/llvm/test/CodeGen/X86/clmul-vector.ll
@@ -7776,3 +7776,6753 @@ define void @mul_use_commutative_clmul_v2i64(<2 x i64> %x, <2 x i64> %y, ptr %p0
store <2 x i64> %yx, ptr %p1
ret void
}
+
+define <16 x i8> @clmul_v16i8_allones(<16 x i8> %x) nounwind {
+; SCALAR-LABEL: clmul_v16i8_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddb %xmm0, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddb %xmm0, %xmm1
+; SCALAR-NEXT: paddb %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllw $4, %xmm1
+; SCALAR-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: retq
+;
+; SSE2-LABEL: clmul_v16i8_allones:
+; SSE2: # %bb.0:
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
+; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2,u,2,u,2,u,2,u,2,u,2,u,2,u,2,u]
+; SSE2-NEXT: movdqa %xmm1, %xmm4
+; SSE2-NEXT: pmullw %xmm3, %xmm4
+; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
+; SSE2-NEXT: pand %xmm2, %xmm4
+; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
+; SSE2-NEXT: pmullw %xmm0, %xmm3
+; SSE2-NEXT: pand %xmm2, %xmm3
+; SSE2-NEXT: packuswb %xmm4, %xmm3
+; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [1,u,1,u,1,u,1,u,1,u,1,u,1,u,1,u]
+; SSE2-NEXT: movdqa %xmm1, %xmm5
+; SSE2-NEXT: pmullw %xmm4, %xmm5
+; SSE2-NEXT: pand %xmm2, %xmm5
+; SSE2-NEXT: pmullw %xmm0, %xmm4
+; SSE2-NEXT: pand %xmm2, %xmm4
+; SSE2-NEXT: packuswb %xmm5, %xmm4
+; SSE2-NEXT: pxor %xmm3, %xmm4
+; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [4,u,4,u,4,u,4,u,4,u,4,u,4,u,4,u]
+; SSE2-NEXT: movdqa %xmm1, %xmm3
+; SSE2-NEXT: pmullw %xmm5, %xmm3
+; SSE2-NEXT: pand %xmm2, %xmm3
+; SSE2-NEXT: pmullw %xmm0, %xmm5
+; SSE2-NEXT: pand %xmm2, %xmm5
+; SSE2-NEXT: packuswb %xmm3, %xmm5
+; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [8,u,8,u,8,u,8,u,8,u,8,u,8,u,8,u]
+; SSE2-NEXT: movdqa %xmm1, %xmm6
+; SSE2-NEXT: pmullw %xmm3, %xmm6
+; SSE2-NEXT: pand %xmm2, %xmm6
+; SSE2-NEXT: pmullw %xmm0, %xmm3
+; SSE2-NEXT: pand %xmm2, %xmm3
+; SSE2-NEXT: packuswb %xmm6, %xmm3
+; SSE2-NEXT: pxor %xmm5, %xmm3
+; SSE2-NEXT: pxor %xmm4, %xmm3
+; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [16,u,16,u,16,u,16,u,16,u,16,u,16,u,16,u]
+; SSE2-NEXT: movdqa %xmm1, %xmm5
+; SSE2-NEXT: pmullw %xmm4, %xmm5
+; SSE2-NEXT: pand %xmm2, %xmm5
+; SSE2-NEXT: pmullw %xmm0, %xmm4
+; SSE2-NEXT: pand %xmm2, %xmm4
+; SSE2-NEXT: packuswb %xmm5, %xmm4
+; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [32,u,32,u,32,u,32,u,32,u,32,u,32,u,32,u]
+; SSE2-NEXT: movdqa %xmm1, %xmm6
+; SSE2-NEXT: pmullw %xmm5, %xmm6
+; SSE2-NEXT: pand %xmm2, %xmm6
+; SSE2-NEXT: pmullw %xmm0, %xmm5
+; SSE2-NEXT: pand %xmm2, %xmm5
+; SSE2-NEXT: packuswb %xmm6, %xmm5
+; SSE2-NEXT: pxor %xmm4, %xmm5
+; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [64,u,64,u,64,u,64,u,64,u,64,u,64,u,64,u]
+; SSE2-NEXT: movdqa %xmm1, %xmm6
+; SSE2-NEXT: pmullw %xmm4, %xmm6
+; SSE2-NEXT: pand %xmm2, %xmm6
+; SSE2-NEXT: pmullw %xmm0, %xmm4
+; SSE2-NEXT: pand %xmm2, %xmm4
+; SSE2-NEXT: packuswb %xmm6, %xmm4
+; SSE2-NEXT: pxor %xmm5, %xmm4
+; SSE2-NEXT: pxor %xmm3, %xmm4
+; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [128,u,128,u,128,u,128,u,128,u,128,u,128,u,128,u]
+; SSE2-NEXT: pmullw %xmm3, %xmm1
+; SSE2-NEXT: pand %xmm2, %xmm1
+; SSE2-NEXT: pmullw %xmm3, %xmm0
+; SSE2-NEXT: pand %xmm2, %xmm0
+; SSE2-NEXT: packuswb %xmm1, %xmm0
+; SSE2-NEXT: pxor %xmm4, %xmm0
+; SSE2-NEXT: retq
+;
+; SSE42-LABEL: clmul_v16i8_allones:
+; SSE42: # %bb.0:
+; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
+; SSE42-NEXT: pmullw %xmm0, %xmm2
+; SSE42-NEXT: pmovzxbw {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
+; SSE42-NEXT: pand %xmm1, %xmm2
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2]
+; SSE42-NEXT: psllw $8, %xmm4
+; SSE42-NEXT: por %xmm2, %xmm4
+; SSE42-NEXT: movdqa %xmm0, %xmm2
+; SSE42-NEXT: pand %xmm1, %xmm2
+; SSE42-NEXT: movdqa %xmm0, %xmm3
+; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
+; SSE42-NEXT: psllw $8, %xmm3
+; SSE42-NEXT: por %xmm2, %xmm3
+; SSE42-NEXT: pxor %xmm4, %xmm3
+; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
+; SSE42-NEXT: pmullw %xmm0, %xmm2
+; SSE42-NEXT: pand %xmm1, %xmm2
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4]
+; SSE42-NEXT: psllw $8, %xmm4
+; SSE42-NEXT: por %xmm2, %xmm4
+; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
+; SSE42-NEXT: pmullw %xmm0, %xmm5
+; SSE42-NEXT: pand %xmm1, %xmm5
+; SSE42-NEXT: movdqa %xmm0, %xmm2
+; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8]
+; SSE42-NEXT: psllw $8, %xmm2
+; SSE42-NEXT: por %xmm5, %xmm2
+; SSE42-NEXT: pxor %xmm4, %xmm2
+; SSE42-NEXT: pxor %xmm3, %xmm2
+; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
+; SSE42-NEXT: pmullw %xmm0, %xmm3
+; SSE42-NEXT: pand %xmm1, %xmm3
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16]
+; SSE42-NEXT: psllw $8, %xmm4
+; SSE42-NEXT: por %xmm3, %xmm4
+; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
+; SSE42-NEXT: pmullw %xmm0, %xmm3
+; SSE42-NEXT: pand %xmm1, %xmm3
+; SSE42-NEXT: movdqa %xmm0, %xmm5
+; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32]
+; SSE42-NEXT: psllw $8, %xmm5
+; SSE42-NEXT: por %xmm3, %xmm5
+; SSE42-NEXT: pxor %xmm4, %xmm5
+; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
+; SSE42-NEXT: pmullw %xmm0, %xmm3
+; SSE42-NEXT: pand %xmm1, %xmm3
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64]
+; SSE42-NEXT: psllw $8, %xmm4
+; SSE42-NEXT: por %xmm3, %xmm4
+; SSE42-NEXT: pxor %xmm5, %xmm4
+; SSE42-NEXT: pxor %xmm2, %xmm4
+; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
+; SSE42-NEXT: pmullw %xmm0, %xmm2
+; SSE42-NEXT: pand %xmm1, %xmm2
+; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,128,0,128,0,128,0,128,0,128,0,128,0,128,0,128]
+; SSE42-NEXT: psllw $8, %xmm0
+; SSE42-NEXT: por %xmm2, %xmm0
+; SSE42-NEXT: pxor %xmm4, %xmm0
+; SSE42-NEXT: retq
+;
+; AVX2-LABEL: clmul_v16i8_allones:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
+; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
+; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
+; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm2
+; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm3
+; AVX2-NEXT: vpackuswb %xmm3, %xmm2, %xmm2
+; AVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm3
+; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm3
+; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm4
+; AVX2-NEXT: vpackuswb %xmm4, %xmm3, %xmm3
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
+; AVX2-NEXT: vpackuswb %xmm4, %xmm0, %xmm4
+; AVX2-NEXT: vpxor %xmm3, %xmm4, %xmm3
+; AVX2-NEXT: vpsllw $3, %ymm0, %ymm4
+; AVX2-NEXT: vpand %ymm1, %ymm4, %ymm4
+; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm5
+; AVX2-NEXT: vpackuswb %xmm5, %xmm4, %xmm4
+; AVX2-NEXT: vpxor %xmm4, %xmm2, %xmm2
+; AVX2-NEXT: vpxor %xmm2, %xmm3, %xmm2
+; AVX2-NEXT: vpsllw $4, %ymm0, %ymm3
+; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm3
+; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm4
+; AVX2-NEXT: vpackuswb %xmm4, %xmm3, %xmm3
+; AVX2-NEXT: vpsllw $5, %ymm0, %ymm4
+; AVX2-NEXT: vpand %ymm1, %ymm4, %ymm4
+; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm5
+; AVX2-NEXT: vpackuswb %xmm5, %xmm4, %xmm4
+; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
+; AVX2-NEXT: vpsllw $6, %ymm0, %ymm4
+; AVX2-NEXT: vpand %ymm1, %ymm4, %ymm4
+; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm5
+; AVX2-NEXT: vpackuswb %xmm5, %xmm4, %xmm4
+; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
+; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT: vpsllw $7, %ymm0, %ymm0
+; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: clmul_v16i8_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
+; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm2
+; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
+; AVX512-NEXT: vpmovdb %zmm2, %xmm2
+; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
+; AVX512-NEXT: vpsllw $2, %ymm1, %ymm2
+; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
+; AVX512-NEXT: vpmovdb %zmm2, %xmm2
+; AVX512-NEXT: vpsllw $3, %ymm1, %ymm3
+; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm3 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero
+; AVX512-NEXT: vpmovdb %zmm3, %xmm3
+; AVX512-NEXT: vpternlogq {{.*#+}} xmm3 = xmm3 ^ xmm0 ^ xmm2
+; AVX512-NEXT: vpsllw $4, %ymm1, %ymm0
+; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
+; AVX512-NEXT: vpmovdb %zmm0, %xmm0
+; AVX512-NEXT: vpsllw $5, %ymm1, %ymm2
+; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
+; AVX512-NEXT: vpmovdb %zmm2, %xmm2
+; AVX512-NEXT: vpternlogq {{.*#+}} xmm2 = xmm2 ^ xmm3 ^ xmm0
+; AVX512-NEXT: vpsllw $6, %ymm1, %ymm0
+; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
+; AVX512-NEXT: vpmovdb %zmm0, %xmm3
+; AVX512-NEXT: vpsllw $7, %ymm1, %ymm0
+; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
+; AVX512-NEXT: vpmovdb %zmm0, %xmm0
+; AVX512-NEXT: vpternlogq {{.*#+}} xmm0 = xmm0 ^ xmm2 ^ xmm3
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
+ %r = call <16 x i8> @llvm.clmul.v16i8(<16 x i8> %x, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
+ ret <16 x i8> %r
+}
+
+define <8 x i16> @clmul_v8i16_allones(<8 x i16> %x) nounwind {
+; SCALAR-LABEL: clmul_v8i16_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddw %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllw $2, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllw $4, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllw $8, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: retq
+;
+; SSE2-LABEL: clmul_v8i16_allones:
+; SSE2: # %bb.0:
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: paddw %xmm1, %xmm1
+; SSE2-NEXT: pxor %xmm0, %xmm1
+; SSE2-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NEXT: psllw $2, %xmm2
+; SSE2-NEXT: movdqa %xmm0, %xmm3
+; SSE2-NEXT: psllw $3, %xmm3
+; SSE2-NEXT: pxor %xmm2, %xmm3
+; SSE2-NEXT: pxor %xmm1, %xmm3
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: psllw $4, %xmm1
+; SSE2-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NEXT: psllw $5, %xmm2
+; SSE2-NEXT: pxor %xmm1, %xmm2
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: psllw $6, %xmm1
+; SSE2-NEXT: pxor %xmm2, %xmm1
+; SSE2-NEXT: pxor %xmm3, %xmm1
+; SSE2-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NEXT: psllw $7, %xmm2
+; SSE2-NEXT: movdqa %xmm0, %xmm3
+; SSE2-NEXT: psllw $8, %xmm3
+; SSE2-NEXT: pxor %xmm2, %xmm3
+; SSE2-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NEXT: psllw $9, %xmm2
+; SSE2-NEXT: pxor %xmm3, %xmm2
+; SSE2-NEXT: movdqa %xmm0, %xmm3
+; SSE2-NEXT: psllw $10, %xmm3
+; SSE2-NEXT: pxor %xmm2, %xmm3
+; SSE2-NEXT: pxor %xmm1, %xmm3
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: psllw $11, %xmm1
+; SSE2-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NEXT: psllw $12, %xmm2
+; SSE2-NEXT: pxor %xmm1, %xmm2
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: psllw $13, %xmm1
+; SSE2-NEXT: pxor %xmm2, %xmm1
+; SSE2-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NEXT: psllw $14, %xmm2
+; SSE2-NEXT: pxor %xmm1, %xmm2
+; SSE2-NEXT: psllw $15, %xmm0
+; SSE2-NEXT: pxor %xmm2, %xmm0
+; SSE2-NEXT: pxor %xmm3, %xmm0
+; SSE2-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmul_v8i16_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: paddw %xmm1, %xmm1
+; SSE-PCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE-PCLMUL-NEXT: psllw $2, %xmm2
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE-PCLMUL-NEXT: psllw $3, %xmm3
+; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: psllw $4, %xmm1
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE-PCLMUL-NEXT: psllw $5, %xmm2
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: psllw $6, %xmm1
+; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE-PCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE-PCLMUL-NEXT: psllw $7, %xmm2
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE-PCLMUL-NEXT: psllw $8, %xmm3
+; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE-PCLMUL-NEXT: psllw $9, %xmm2
+; SSE-PCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE-PCLMUL-NEXT: psllw $10, %xmm3
+; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: psllw $11, %xmm1
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE-PCLMUL-NEXT: psllw $12, %xmm2
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: psllw $13, %xmm1
+; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE-PCLMUL-NEXT: psllw $14, %xmm2
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE-PCLMUL-NEXT: psllw $15, %xmm0
+; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE-PCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX2-LABEL: clmul_v8i16_allones:
+; AVX2: # %bb.0:
+; AVX2-NEXT: movl $65535, %eax # imm = 0xFFFF
+; AVX2-NEXT: vmovq %rax, %xmm1
+; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[1,1,1,1]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX2-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX2-NEXT: vpclmulqdq $1, %xmm1, %xmm2, %xmm4
+; AVX2-NEXT: vmovq %xmm4, %rax
+; AVX2-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[3,3,3,3]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm2
+; AVX2-NEXT: vmovq %xmm2, %rax
+; AVX2-NEXT: vpinsrd $3, %eax, %xmm3, %xmm2
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,1,1]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX2-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX2-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm4
+; AVX2-NEXT: vmovq %xmm4, %rax
+; AVX2-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vmovq %xmm0, %rax
+; AVX2-NEXT: vpinsrd $3, %eax, %xmm3, %xmm0
+; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
+; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
+; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
+; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: clmul_v8i16_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: movl $65535, %eax # imm = 0xFFFF
+; AVX512-NEXT: vmovq %rax, %xmm1
+; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm2
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[1,1,1,1]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX512-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX512-NEXT: vpclmulqdq $1, %xmm1, %xmm2, %xmm4
+; AVX512-NEXT: vmovq %xmm4, %rax
+; AVX512-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[3,3,3,3]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm2
+; AVX512-NEXT: vmovq %xmm2, %rax
+; AVX512-NEXT: vpinsrd $3, %eax, %xmm3, %xmm2
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,1,1]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX512-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX512-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm4
+; AVX512-NEXT: vmovq %xmm4, %rax
+; AVX512-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: vpinsrd $3, %eax, %xmm3, %xmm0
+; AVX512-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
+; AVX512-NEXT: vpmovdw %ymm0, %xmm0
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
+ %r = call <8 x i16> @llvm.clmul.v8i16(<8 x i16> %x, <8 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
+ ret <8 x i16> %r
+}
+
+define <4 x i32> @clmul_v4i32_allones(<4 x i32> %x) nounwind {
+; SCALAR-LABEL: clmul_v4i32_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddd %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $2, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $4, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $8, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $16, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: retq
+;
+; SSE2-NOPCLMUL-LABEL: clmul_v4i32_allones:
+; SSE2-NOPCLMUL: # %bb.0:
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [4,4,4,4]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [8,8,8,8]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [16,16,16,16]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [32,32,32,32]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [64,64,64,64]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [256,256,256,256]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [512,512,512,512]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [1024,1024,1024,1024]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [2048,2048,2048,2048]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [4096,4096,4096,4096]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [8192,8192,8192,8192]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [16384,16384,16384,16384]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [65536,65536,65536,65536]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [131072,131072,131072,131072]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [262144,262144,262144,262144]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [524288,524288,524288,524288]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [1048576,1048576,1048576,1048576]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [2097152,2097152,2097152,2097152]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [4194304,4194304,4194304,4194304]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [8388608,8388608,8388608,8388608]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [16777216,16777216,16777216,16777216]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [33554432,33554432,33554432,33554432]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [67108864,67108864,67108864,67108864]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [134217728,134217728,134217728,134217728]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [268435456,268435456,268435456,268435456]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [536870912,536870912,536870912,536870912]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [1073741824,1073741824,1073741824,1073741824]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; 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: pxor %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: retq
+;
+; SSE2-PCLMUL-LABEL: clmul_v4i32_allones:
+; SSE2-PCLMUL: # %bb.0:
+; SSE2-PCLMUL-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; SSE2-PCLMUL-NEXT: movq %rax, %xmm1
+; SSE2-PCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm0[3,3,3,3]
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm1, %xmm2
+; SSE2-PCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE2-PCLMUL-NEXT: pclmulqdq $1, %xmm1, %xmm3
+; SSE2-PCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
+; SSE2-PCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm1, %xmm2
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm1, %xmm0
+; SSE2-PCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
+; SSE2-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
+; SSE2-PCLMUL-NEXT: retq
+;
+; SSE42-LABEL: clmul_v4i32_allones:
+; SSE42: # %bb.0:
+; SSE42-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; SSE42-NEXT: movq %rax, %xmm2
+; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm1
+; SSE42-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
+; SSE42-NEXT: pshufd {{.*#+}} xmm3 = xmm0[3,3,3,3]
+; SSE42-NEXT: pclmulqdq $1, %xmm2, %xmm0
+; SSE42-NEXT: movq %xmm0, %rax
+; SSE42-NEXT: pinsrd $2, %eax, %xmm1
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-NEXT: movq %xmm3, %rax
+; SSE42-NEXT: pinsrd $3, %eax, %xmm1
+; SSE42-NEXT: movdqa %xmm1, %xmm0
+; SSE42-NEXT: retq
+;
+; AVX2-LABEL: clmul_v4i32_allones:
+; AVX2: # %bb.0:
+; AVX2-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; AVX2-NEXT: vmovq %rax, %xmm1
+; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm2
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm3
+; AVX2-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
+; AVX2-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm3
+; AVX2-NEXT: vmovq %xmm3, %rax
+; AVX2-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
+; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; 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_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; AVX512-NEXT: vmovq %rax, %xmm1
+; AVX512-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm2
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm3
+; AVX512-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
+; AVX512-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm3
+; AVX512-NEXT: vmovq %xmm3, %rax
+; AVX512-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
+; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0
+; AVX512-NEXT: retq
+; SSE42-PCLMUL-LABEL: clmul_v4i32_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; SSE42-PCLMUL-NEXT: movq %rax, %xmm2
+; SSE42-PCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm1
+; SSE42-PCLMUL-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
+; SSE42-PCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm0[3,3,3,3]
+; SSE42-PCLMUL-NEXT: pclmulqdq $1, %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: movq %xmm0, %rax
+; SSE42-PCLMUL-NEXT: pinsrd $2, %eax, %xmm1
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-PCLMUL-NEXT: movq %xmm3, %rax
+; SSE42-PCLMUL-NEXT: pinsrd $3, %eax, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: retq
+; AVX-LABEL: clmul_v4i32_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; AVX-NEXT: vmovq %rax, %xmm1
+; AVX-NEXT: vpshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
+; AVX-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm2
+; AVX-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm3
+; AVX-NEXT: vpunpckldq {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
+; AVX-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm3
+; AVX-NEXT: vmovq %xmm3, %rax
+; AVX-NEXT: vpinsrd $2, %eax, %xmm2, %xmm2
+; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; AVX-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rax
+; AVX-NEXT: vpinsrd $3, %eax, %xmm2, %xmm0
+; AVX-NEXT: retq
+ %r = call <4 x i32> @llvm.clmul.v4i32(<4 x i32> %x, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>)
+ ret <4 x i32> %r
+}
+
+define <2 x i64> @clmul_v2i64_allones(<2 x i64> %x) nounwind {
+; SCALAR-LABEL: clmul_v2i64_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddq %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $2, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $4, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $8, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $16, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $32, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: retq
+;
+; SSE2-NOPCLMUL-LABEL: clmul_v2i64_allones:
+; SSE2-NOPCLMUL: # %bb.0:
+; SSE2-NOPCLMUL-NEXT: subq $200, %rsp
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm15
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4,4]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm14
+; SSE2-NOPCLMUL-NEXT: psrlq $32, %xmm14
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [2,2]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: por %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [8,8]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16,16]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [32,32]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [64,64]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [128,128]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [256,256]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [512,512]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm4
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: por %xmm1, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [1024,1024]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2048,2048]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [4096,4096]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, (%rsp) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8192,8192]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [16384,16384]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm4
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: por %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [65536,65536]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [131072,131072]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [262144,262144]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [524288,524288]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [1048576,1048576]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm13
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm13
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm13, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2097152,2097152]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm12
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm12
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: por %xmm12, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4194304,4194304]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm11
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm11
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm11, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [8388608,8388608]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm10
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm10
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: por %xmm10, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16777216,16777216]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm9
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm9
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm9, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [33554432,33554432]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm8
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm8
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: por %xmm8, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [67108864,67108864]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [134217728,134217728]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm7
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: por %xmm7, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [268435456,268435456]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm2
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: por %xmm6, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [536870912,536870912]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: por %xmm5, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [1073741824,1073741824]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: por %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm14
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm14
+; SSE2-NOPCLMUL-NEXT: por %xmm1, %xmm14
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm14
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm15
+; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm15
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm15
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm15
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm15
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm15
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm15
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm15
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm13
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm13
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm12
+; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm12
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm11
+; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm11
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm10
+; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm10
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm9
+; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm9
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm8
+; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm8
+; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm15
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm7
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm7
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm6
+; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm5
+; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm5
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm15
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm0
+; SSE2-NOPCLMUL-NEXT: addq $200, %rsp
+; SSE2-NOPCLMUL-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmul_v2i64_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movq $-1, %rax
+; SSE-PCLMUL-NEXT: movq %rax, %xmm1
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE-PCLMUL-NEXT: pclmulqdq $1, %xmm1, %xmm2
+; SSE-PCLMUL-NEXT: pclmulqdq $0, %xmm1, %xmm0
+; SSE-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX2-LABEL: clmul_v2i64_allones:
+; AVX2: # %bb.0:
+; AVX2-NEXT: movq $-1, %rax
+; AVX2-NEXT: vmovq %rax, %xmm1
+; AVX2-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm2
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: clmul_v2i64_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: movq $-1, %rax
+; AVX512-NEXT: vmovq %rax, %xmm1
+; AVX512-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm2
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
+; AVX512-NEXT: retq
+; AVX-LABEL: clmul_v2i64_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movq $-1, %rax
+; AVX-NEXT: vmovq %rax, %xmm1
+; AVX-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm2
+; AVX-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
+; AVX-NEXT: retq
+ %r = call <2 x i64> @llvm.clmul.v2i64(<2 x i64> %x, <2 x i64> <i64 -1, i64 -1>)
+ ret <2 x i64> %r
+}
+
+define <16 x i8> @clmulr_v16i8_allones(<16 x i8> %x) nounwind {
+; SCALAR-LABEL: clmulr_v16i8_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: pxor %xmm1, %xmm1
+; SCALAR-NEXT: movdqa %xmm0, %xmm2
+; SCALAR-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
+; SCALAR-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddw %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm0, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm0
+; SCALAR-NEXT: psllw $2, %xmm0
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllw $4, %xmm1
+; SCALAR-NEXT: pxor %xmm0, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm3
+; SCALAR-NEXT: psllw $8, %xmm3
+; SCALAR-NEXT: pxor %xmm1, %xmm3
+; SCALAR-NEXT: movdqa %xmm2, %xmm0
+; SCALAR-NEXT: paddw %xmm0, %xmm0
+; SCALAR-NEXT: pxor %xmm2, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllw $2, %xmm1
+; SCALAR-NEXT: pxor %xmm0, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: psllw $4, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: movdqa %xmm2, %xmm0
+; SCALAR-NEXT: psllw $8, %xmm0
+; SCALAR-NEXT: pxor %xmm2, %xmm0
+; SCALAR-NEXT: psrlw $7, %xmm0
+; SCALAR-NEXT: psrlw $7, %xmm3
+; SCALAR-NEXT: movdqa {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
+; SCALAR-NEXT: pand %xmm1, %xmm3
+; SCALAR-NEXT: pand %xmm1, %xmm0
+; SCALAR-NEXT: packuswb %xmm3, %xmm0
+; SCALAR-NEXT: retq
+;
+; SSE2-LABEL: clmulr_v16i8_allones:
+; SSE2: # %bb.0:
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: pxor %xmm3, %xmm3
+; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
+; SSE2-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
+; SSE2-NEXT: movdqa %xmm2, %xmm4
+; SSE2-NEXT: paddw %xmm4, %xmm4
+; SSE2-NEXT: pxor %xmm2, %xmm4
+; SSE2-NEXT: movdqa %xmm2, %xmm5
+; SSE2-NEXT: psllw $2, %xmm5
+; SSE2-NEXT: movdqa %xmm2, %xmm6
+; SSE2-NEXT: psllw $3, %xmm6
+; SSE2-NEXT: pxor %xmm5, %xmm6
+; SSE2-NEXT: pxor %xmm4, %xmm6
+; SSE2-NEXT: movdqa %xmm2, %xmm4
+; SSE2-NEXT: psllw $4, %xmm4
+; SSE2-NEXT: movdqa %xmm2, %xmm5
+; SSE2-NEXT: psllw $5, %xmm5
+; SSE2-NEXT: pxor %xmm4, %xmm5
+; SSE2-NEXT: movdqa %xmm2, %xmm4
+; SSE2-NEXT: psllw $6, %xmm4
+; SSE2-NEXT: pxor %xmm5, %xmm4
+; SSE2-NEXT: pxor %xmm6, %xmm4
+; SSE2-NEXT: movdqa %xmm2, %xmm5
+; SSE2-NEXT: psllw $7, %xmm5
+; SSE2-NEXT: pxor %xmm6, %xmm6
+; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15]
+; SSE2-NEXT: pxor %xmm5, %xmm6
+; SSE2-NEXT: movdqa %xmm2, %xmm5
+; SSE2-NEXT: psllw $9, %xmm5
+; SSE2-NEXT: pxor %xmm6, %xmm5
+; SSE2-NEXT: movdqa %xmm2, %xmm6
+; SSE2-NEXT: psllw $10, %xmm6
+; SSE2-NEXT: pxor %xmm5, %xmm6
+; SSE2-NEXT: pxor %xmm4, %xmm6
+; SSE2-NEXT: movdqa %xmm2, %xmm4
+; SSE2-NEXT: psllw $11, %xmm4
+; SSE2-NEXT: movdqa %xmm2, %xmm5
+; SSE2-NEXT: psllw $12, %xmm5
+; SSE2-NEXT: pxor %xmm4, %xmm5
+; SSE2-NEXT: movdqa %xmm2, %xmm4
+; SSE2-NEXT: psllw $13, %xmm4
+; SSE2-NEXT: pxor %xmm5, %xmm4
+; SSE2-NEXT: psllw $14, %xmm2
+; SSE2-NEXT: pxor %xmm4, %xmm2
+; SSE2-NEXT: pxor %xmm6, %xmm2
+; SSE2-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NEXT: paddw %xmm4, %xmm4
+; SSE2-NEXT: pxor %xmm0, %xmm4
+; SSE2-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NEXT: psllw $2, %xmm5
+; SSE2-NEXT: movdqa %xmm0, %xmm6
+; SSE2-NEXT: psllw $3, %xmm6
+; SSE2-NEXT: pxor %xmm5, %xmm6
+; SSE2-NEXT: pxor %xmm4, %xmm6
+; SSE2-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NEXT: psllw $4, %xmm4
+; SSE2-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NEXT: psllw $5, %xmm5
+; SSE2-NEXT: pxor %xmm4, %xmm5
+; SSE2-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NEXT: psllw $6, %xmm4
+; SSE2-NEXT: pxor %xmm5, %xmm4
+; SSE2-NEXT: pxor %xmm6, %xmm4
+; SSE2-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NEXT: psllw $7, %xmm5
+; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
+; SSE2-NEXT: pxor %xmm5, %xmm3
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: psllw $9, %xmm1
+; SSE2-NEXT: pxor %xmm3, %xmm1
+; SSE2-NEXT: movdqa %xmm0, %xmm3
+; SSE2-NEXT: psllw $10, %xmm3
+; SSE2-NEXT: pxor %xmm1, %xmm3
+; SSE2-NEXT: pxor %xmm4, %xmm3
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: psllw $11, %xmm1
+; SSE2-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NEXT: psllw $12, %xmm4
+; SSE2-NEXT: pxor %xmm1, %xmm4
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: psllw $13, %xmm1
+; SSE2-NEXT: pxor %xmm4, %xmm1
+; SSE2-NEXT: psllw $14, %xmm0
+; SSE2-NEXT: pxor %xmm1, %xmm0
+; SSE2-NEXT: pxor %xmm3, %xmm0
+; SSE2-NEXT: psrlw $7, %xmm0
+; SSE2-NEXT: psrlw $7, %xmm2
+; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
+; SSE2-NEXT: pand %xmm1, %xmm2
+; SSE2-NEXT: pand %xmm1, %xmm0
+; SSE2-NEXT: packuswb %xmm2, %xmm0
+; SSE2-NEXT: retq
+;
+; SSE42-LABEL: clmulr_v16i8_allones:
+; SSE42: # %bb.0:
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: pxor %xmm3, %xmm3
+; SSE42-NEXT: movdqa %xmm0, %xmm2
+; SSE42-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
+; SSE42-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; SSE42-NEXT: movdqa %xmm2, %xmm4
+; SSE42-NEXT: paddw %xmm4, %xmm4
+; SSE42-NEXT: pxor %xmm2, %xmm4
+; SSE42-NEXT: movdqa %xmm2, %xmm5
+; SSE42-NEXT: psllw $2, %xmm5
+; SSE42-NEXT: movdqa %xmm2, %xmm6
+; SSE42-NEXT: psllw $3, %xmm6
+; SSE42-NEXT: pxor %xmm5, %xmm6
+; SSE42-NEXT: pxor %xmm4, %xmm6
+; SSE42-NEXT: movdqa %xmm2, %xmm4
+; SSE42-NEXT: psllw $4, %xmm4
+; SSE42-NEXT: movdqa %xmm2, %xmm5
+; SSE42-NEXT: psllw $5, %xmm5
+; SSE42-NEXT: pxor %xmm4, %xmm5
+; SSE42-NEXT: movdqa %xmm2, %xmm4
+; SSE42-NEXT: psllw $6, %xmm4
+; SSE42-NEXT: pxor %xmm5, %xmm4
+; SSE42-NEXT: pxor %xmm6, %xmm4
+; SSE42-NEXT: movdqa %xmm2, %xmm5
+; SSE42-NEXT: psllw $7, %xmm5
+; SSE42-NEXT: pxor %xmm6, %xmm6
+; SSE42-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15]
+; SSE42-NEXT: pxor %xmm5, %xmm6
+; SSE42-NEXT: movdqa %xmm2, %xmm5
+; SSE42-NEXT: psllw $9, %xmm5
+; SSE42-NEXT: pxor %xmm6, %xmm5
+; SSE42-NEXT: movdqa %xmm2, %xmm6
+; SSE42-NEXT: psllw $10, %xmm6
+; SSE42-NEXT: pxor %xmm5, %xmm6
+; SSE42-NEXT: pxor %xmm4, %xmm6
+; SSE42-NEXT: movdqa %xmm2, %xmm4
+; SSE42-NEXT: psllw $11, %xmm4
+; SSE42-NEXT: movdqa %xmm2, %xmm5
+; SSE42-NEXT: psllw $12, %xmm5
+; SSE42-NEXT: pxor %xmm4, %xmm5
+; SSE42-NEXT: movdqa %xmm2, %xmm4
+; SSE42-NEXT: psllw $13, %xmm4
+; SSE42-NEXT: pxor %xmm5, %xmm4
+; SSE42-NEXT: psllw $14, %xmm2
+; SSE42-NEXT: pxor %xmm4, %xmm2
+; SSE42-NEXT: pxor %xmm6, %xmm2
+; SSE42-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: paddw %xmm1, %xmm1
+; SSE42-NEXT: pxor %xmm0, %xmm1
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: psllw $2, %xmm4
+; SSE42-NEXT: movdqa %xmm0, %xmm5
+; SSE42-NEXT: psllw $3, %xmm5
+; SSE42-NEXT: pxor %xmm4, %xmm5
+; SSE42-NEXT: pxor %xmm1, %xmm5
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: psllw $4, %xmm1
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: psllw $5, %xmm4
+; SSE42-NEXT: pxor %xmm1, %xmm4
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: psllw $6, %xmm1
+; SSE42-NEXT: pxor %xmm4, %xmm1
+; SSE42-NEXT: pxor %xmm5, %xmm1
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: psllw $7, %xmm4
+; SSE42-NEXT: pxor %xmm3, %xmm4
+; SSE42-NEXT: movdqa %xmm0, %xmm3
+; SSE42-NEXT: psllw $9, %xmm3
+; SSE42-NEXT: pxor %xmm4, %xmm3
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: psllw $10, %xmm4
+; SSE42-NEXT: pxor %xmm3, %xmm4
+; SSE42-NEXT: pxor %xmm1, %xmm4
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: psllw $11, %xmm1
+; SSE42-NEXT: movdqa %xmm0, %xmm3
+; SSE42-NEXT: psllw $12, %xmm3
+; SSE42-NEXT: pxor %xmm1, %xmm3
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: psllw $13, %xmm1
+; SSE42-NEXT: pxor %xmm3, %xmm1
+; SSE42-NEXT: psllw $14, %xmm0
+; SSE42-NEXT: pxor %xmm1, %xmm0
+; SSE42-NEXT: pxor %xmm4, %xmm0
+; SSE42-NEXT: psrlw $7, %xmm0
+; SSE42-NEXT: psrlw $7, %xmm2
+; SSE42-NEXT: pmovzxbw {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
+; SSE42-NEXT: pand %xmm1, %xmm2
+; SSE42-NEXT: pand %xmm1, %xmm0
+; SSE42-NEXT: packuswb %xmm2, %xmm0
+; SSE42-NEXT: retq
+;
+; AVX2-LABEL: clmulr_v16i8_allones:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
+; AVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm1
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1
+; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
+; AVX2-NEXT: vpsllw $3, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
+; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
+; AVX2-NEXT: vpsllw $5, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpsllw $6, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
+; AVX2-NEXT: vpsllw $7, %ymm0, %ymm2
+; AVX2-NEXT: vpsllw $8, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpsllw $9, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpsllw $10, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
+; AVX2-NEXT: vpsllw $11, %ymm0, %ymm2
+; AVX2-NEXT: vpsllw $12, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpsllw $13, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpsllw $14, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0
+; AVX2-NEXT: vpxor %ymm0, %ymm1, %ymm0
+; AVX2-NEXT: vpsrlw $7, %ymm0, %ymm0
+; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: clmulr_v16i8_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
+; AVX512-NEXT: vpaddw %ymm0, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm0 ^ ymm1
+; AVX512-NEXT: vpsllw $3, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $4, %ymm0, %ymm3
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm2 ^ ymm1
+; AVX512-NEXT: vpsllw $5, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $6, %ymm0, %ymm2
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm3 ^ ymm1
+; AVX512-NEXT: vpsllw $7, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $8, %ymm0, %ymm3
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm2 ^ ymm1
+; AVX512-NEXT: vpsllw $9, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $10, %ymm0, %ymm2
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm3 ^ ymm1
+; AVX512-NEXT: vpsllw $11, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $12, %ymm0, %ymm3
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm2 ^ ymm1
+; AVX512-NEXT: vpsllw $13, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $14, %ymm0, %ymm0
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm0 = ymm0 ^ ymm3 ^ ymm1
+; AVX512-NEXT: vpsrlw $7, %ymm0, %ymm0
+; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
+; AVX512-NEXT: vpmovdb %zmm0, %xmm0
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
+; SSE42-PCLMUL-LABEL: clmulr_v16i8_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm1
+; SSE42-PCLMUL-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; SSE42-PCLMUL-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: paddw %xmm1, %xmm1
+; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: psllw $2, %xmm0
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: psllw $4, %xmm1
+; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm3
+; SSE42-PCLMUL-NEXT: psllw $8, %xmm3
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE42-PCLMUL-NEXT: movdqa %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: paddw %xmm0, %xmm0
+; SSE42-PCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: psllw $2, %xmm1
+; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm2
+; SSE42-PCLMUL-NEXT: psllw $4, %xmm2
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE42-PCLMUL-NEXT: movdqa %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: psllw $8, %xmm0
+; SSE42-PCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: psrlw $7, %xmm3
+; SSE42-PCLMUL-NEXT: psrlw $7, %xmm0
+; SSE42-PCLMUL-NEXT: pmovzxbw {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
+; SSE42-PCLMUL-NEXT: pand %xmm1, %xmm3
+; SSE42-PCLMUL-NEXT: pand %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: packuswb %xmm3, %xmm0
+; SSE42-PCLMUL-NEXT: retq
+ %x.ext = zext <16 x i8> %x to <16 x i16>
+ %clmul = call <16 x i16> @llvm.clmul.v16i16(<16 x i16> %x.ext, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
+ %res.ext = lshr <16 x i16> %clmul, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
+ %res = trunc <16 x i16> %res.ext to <16 x i8>
+ ret <16 x i8> %res
+}
+
+define <8 x i16> @clmulr_v8i16_allones(<8 x i16> %x) nounwind {
+; SCALAR-LABEL: clmulr_v8i16_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: pxor %xmm1, %xmm1
+; SCALAR-NEXT: movdqa %xmm0, %xmm2
+; SCALAR-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
+; SCALAR-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddd %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $2, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $4, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $8, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $16, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: paddd %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: pslld $2, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: pslld $4, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: pslld $8, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: pslld $16, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: paddd %xmm1, %xmm1
+; SCALAR-NEXT: psrad $16, %xmm1
+; SCALAR-NEXT: paddd %xmm0, %xmm0
+; SCALAR-NEXT: psrad $16, %xmm0
+; SCALAR-NEXT: packssdw %xmm1, %xmm0
+; SCALAR-NEXT: retq
+;
+; SSE2-NOPCLMUL-LABEL: clmulr_v8i16_allones:
+; SSE2-NOPCLMUL: # %bb.0:
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm8
+; SSE2-NOPCLMUL-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4],xmm1[4],xmm8[5],xmm1[5],xmm8[6],xmm1[6],xmm8[7],xmm1[7]
+; SSE2-NOPCLMUL-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4,4,4,4]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2,2,2,2]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8,8,8,8]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16,16,16,16]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [32,32,32,32]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [64,64,64,64]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [128,128,128,128]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [256,256,256,256]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [512,512,512,512]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [1024,1024,1024,1024]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2048,2048,2048,2048]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4096,4096,4096,4096]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8192,8192,8192,8192]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16384,16384,16384,16384]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm4[0],xmm6[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [32768,32768,32768,32768]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [65536,65536,65536,65536]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [131072,131072,131072,131072]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [262144,262144,262144,262144]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [524288,524288,524288,524288]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm13 = [1048576,1048576,1048576,1048576]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2097152,2097152,2097152,2097152]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4194304,4194304,4194304,4194304]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8388608,8388608,8388608,8388608]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm15 = [16777216,16777216,16777216,16777216]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm14 = [33554432,33554432,33554432,33554432]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm12 = [67108864,67108864,67108864,67108864]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm11 = [134217728,134217728,134217728,134217728]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm10 = [268435456,268435456,268435456,268435456]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm9 = [536870912,536870912,536870912,536870912]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [1073741824,1073741824,1073741824,1073741824]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %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: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [4,4,4,4]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [2,2,2,2]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [8,8,8,8]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [16,16,16,16]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [32,32,32,32]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [64,64,64,64]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [128,128,128,128]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [256,256,256,256]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [512,512,512,512]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm0[0],xmm7[1],xmm0[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm7
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [1024,1024,1024,1024]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [2048,2048,2048,2048]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [4096,4096,4096,4096]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [8192,8192,8192,8192]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [16384,16384,16384,16384]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [65536,65536,65536,65536]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [131072,131072,131072,131072]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [262144,262144,262144,262144]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [524288,524288,524288,524288]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm13
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm13[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2097152,2097152,2097152,2097152]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm13 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm13 = xmm13[0],xmm5[0],xmm13[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm13
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm13
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [4194304,4194304,4194304,4194304]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [8388608,8388608,8388608,8388608]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm15
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm15[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm14
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm14[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm12
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm12[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm11
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm11[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm10
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm10[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm9
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm9[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm8
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm8[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: paddd %xmm2, %xmm2
+; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm2
+; SSE2-NOPCLMUL-NEXT: paddd %xmm6, %xmm6
+; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm6
+; SSE2-NOPCLMUL-NEXT: packssdw %xmm2, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm6, %xmm0
+; SSE2-NOPCLMUL-NEXT: retq
+;
+; SSE2-PCLMUL-LABEL: clmulr_v8i16_allones:
+; SSE2-PCLMUL: # %bb.0:
+; SSE2-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-PCLMUL-NEXT: pxor %xmm3, %xmm3
+; SSE2-PCLMUL-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; SSE2-PCLMUL-NEXT: movq %rax, %xmm2
+; SSE2-PCLMUL-NEXT: pextrw $3, %xmm0, %eax
+; SSE2-PCLMUL-NEXT: movd %eax, %xmm4
+; SSE2-PCLMUL-NEXT: pextrw $1, %xmm0, %eax
+; SSE2-PCLMUL-NEXT: movd %eax, %xmm5
+; SSE2-PCLMUL-NEXT: pextrw $7, %xmm0, %eax
+; SSE2-PCLMUL-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
+; SSE2-PCLMUL-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
+; SSE2-PCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE2-PCLMUL-NEXT: pclmulqdq $1, %xmm2, %xmm3
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
+; SSE2-PCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm0
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm5
+; SSE2-PCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
+; SSE2-PCLMUL-NEXT: movdqa %xmm1, %xmm3
+; SSE2-PCLMUL-NEXT: pclmulqdq $1, %xmm2, %xmm3
+; SSE2-PCLMUL-NEXT: movd %eax, %xmm4
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
+; SSE2-PCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-PCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,1,1]
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm1
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
+; SSE2-PCLMUL-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
+; SSE2-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
+; SSE2-PCLMUL-NEXT: paddd %xmm1, %xmm1
+; SSE2-PCLMUL-NEXT: psrad $16, %xmm1
+; SSE2-PCLMUL-NEXT: paddd %xmm0, %xmm0
+; SSE2-PCLMUL-NEXT: psrad $16, %xmm0
+; SSE2-PCLMUL-NEXT: packssdw %xmm1, %xmm0
+; SSE2-PCLMUL-NEXT: retq
+;
+; SSE42-LABEL: clmulr_v8i16_allones:
+; SSE42: # %bb.0:
+; SSE42-NEXT: pxor %xmm2, %xmm2
+; SSE42-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; SSE42-NEXT: movq %rax, %xmm4
+; SSE42-NEXT: pextrw $5, %xmm0, %eax
+; SSE42-NEXT: movd %eax, %xmm1
+; SSE42-NEXT: pclmulqdq $0, %xmm4, %xmm1
+; SSE42-NEXT: pextrw $4, %xmm0, %eax
+; SSE42-NEXT: movd %eax, %xmm3
+; SSE42-NEXT: pclmulqdq $0, %xmm4, %xmm3
+; SSE42-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
+; SSE42-NEXT: pextrw $6, %xmm0, %eax
+; SSE42-NEXT: movd %eax, %xmm1
+; SSE42-NEXT: pclmulqdq $0, %xmm4, %xmm1
+; SSE42-NEXT: movq %xmm1, %rax
+; SSE42-NEXT: pinsrd $2, %eax, %xmm3
+; SSE42-NEXT: pextrw $7, %xmm0, %eax
+; SSE42-NEXT: movd %eax, %xmm1
+; SSE42-NEXT: pclmulqdq $0, %xmm4, %xmm1
+; SSE42-NEXT: movq %xmm1, %rax
+; SSE42-NEXT: pinsrd $3, %eax, %xmm3
+; SSE42-NEXT: pextrw $1, %xmm0, %eax
+; SSE42-NEXT: movd %eax, %xmm5
+; SSE42-NEXT: pclmulqdq $0, %xmm4, %xmm5
+; SSE42-NEXT: pextrw $0, %xmm0, %eax
+; SSE42-NEXT: movd %eax, %xmm1
+; SSE42-NEXT: pclmulqdq $0, %xmm4, %xmm1
+; SSE42-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1]
+; SSE42-NEXT: pextrw $2, %xmm0, %eax
+; SSE42-NEXT: movd %eax, %xmm5
+; SSE42-NEXT: pclmulqdq $0, %xmm4, %xmm5
+; SSE42-NEXT: movq %xmm5, %rax
+; SSE42-NEXT: pinsrd $2, %eax, %xmm1
+; SSE42-NEXT: pextrw $3, %xmm0, %eax
+; SSE42-NEXT: movd %eax, %xmm0
+; SSE42-NEXT: pclmulqdq $0, %xmm4, %xmm0
+; SSE42-NEXT: movq %xmm0, %rax
+; SSE42-NEXT: pinsrd $3, %eax, %xmm1
+; SSE42-NEXT: psrld $15, %xmm1
+; SSE42-NEXT: psrld $15, %xmm3
+; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1],xmm3[2],xmm2[3],xmm3[4],xmm2[5],xmm3[6],xmm2[7]
+; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
+; SSE42-NEXT: packusdw %xmm3, %xmm1
+; SSE42-NEXT: movdqa %xmm1, %xmm0
+; SSE42-NEXT: retq
+;
+; AVX2-LABEL: clmulr_v8i16_allones:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; AVX2-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; AVX2-NEXT: vmovq %rax, %xmm1
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[1,1,1,1]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX2-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX2-NEXT: vpclmulqdq $1, %xmm1, %xmm2, %xmm4
+; AVX2-NEXT: vmovq %xmm4, %rax
+; AVX2-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[3,3,3,3]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm2
+; AVX2-NEXT: vmovq %xmm2, %rax
+; AVX2-NEXT: vpinsrd $3, %eax, %xmm3, %xmm2
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,1,1]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX2-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX2-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm4
+; AVX2-NEXT: vmovq %xmm4, %rax
+; AVX2-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vmovq %xmm0, %rax
+; AVX2-NEXT: vpinsrd $3, %eax, %xmm3, %xmm0
+; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
+; AVX2-NEXT: vpsrld $15, %ymm0, %ymm0
+; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]
+; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]
+; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: clmulr_v8i16_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; AVX512-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; AVX512-NEXT: vmovq %rax, %xmm1
+; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm2
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[1,1,1,1]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX512-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX512-NEXT: vpclmulqdq $1, %xmm1, %xmm2, %xmm4
+; AVX512-NEXT: vmovq %xmm4, %rax
+; AVX512-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[3,3,3,3]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm2
+; AVX512-NEXT: vmovq %xmm2, %rax
+; AVX512-NEXT: vpinsrd $3, %eax, %xmm3, %xmm2
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,1,1]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX512-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX512-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm4
+; AVX512-NEXT: vmovq %xmm4, %rax
+; AVX512-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: vpinsrd $3, %eax, %xmm3, %xmm0
+; AVX512-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
+; AVX512-NEXT: vpsrld $15, %ymm0, %ymm0
+; AVX512-NEXT: vpmovdw %ymm0, %xmm0
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
+; SSE42-PCLMUL-LABEL: clmulr_v8i16_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: pxor %xmm2, %xmm2
+; SSE42-PCLMUL-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; SSE42-PCLMUL-NEXT: movq %rax, %xmm4
+; SSE42-PCLMUL-NEXT: pextrw $5, %xmm0, %eax
+; SSE42-PCLMUL-NEXT: movd %eax, %xmm1
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm4, %xmm1
+; SSE42-PCLMUL-NEXT: pextrw $4, %xmm0, %eax
+; SSE42-PCLMUL-NEXT: movd %eax, %xmm3
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm4, %xmm3
+; SSE42-PCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1]
+; SSE42-PCLMUL-NEXT: pextrw $6, %xmm0, %eax
+; SSE42-PCLMUL-NEXT: movd %eax, %xmm1
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm4, %xmm1
+; SSE42-PCLMUL-NEXT: movq %xmm1, %rax
+; SSE42-PCLMUL-NEXT: pinsrd $2, %eax, %xmm3
+; SSE42-PCLMUL-NEXT: pextrw $7, %xmm0, %eax
+; SSE42-PCLMUL-NEXT: movd %eax, %xmm1
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm4, %xmm1
+; SSE42-PCLMUL-NEXT: movq %xmm1, %rax
+; SSE42-PCLMUL-NEXT: pinsrd $3, %eax, %xmm3
+; SSE42-PCLMUL-NEXT: pextrw $1, %xmm0, %eax
+; SSE42-PCLMUL-NEXT: movd %eax, %xmm5
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm4, %xmm5
+; SSE42-PCLMUL-NEXT: pextrw $0, %xmm0, %eax
+; SSE42-PCLMUL-NEXT: movd %eax, %xmm1
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm4, %xmm1
+; SSE42-PCLMUL-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm5[0],xmm1[1],xmm5[1]
+; SSE42-PCLMUL-NEXT: pextrw $2, %xmm0, %eax
+; SSE42-PCLMUL-NEXT: movd %eax, %xmm5
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm4, %xmm5
+; SSE42-PCLMUL-NEXT: movq %xmm5, %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, %xmm4, %xmm0
+; SSE42-PCLMUL-NEXT: movq %xmm0, %rax
+; SSE42-PCLMUL-NEXT: pinsrd $3, %eax, %xmm1
+; SSE42-PCLMUL-NEXT: psrld $15, %xmm1
+; SSE42-PCLMUL-NEXT: psrld $15, %xmm3
+; SSE42-PCLMUL-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1],xmm3[2],xmm2[3],xmm3[4],xmm2[5],xmm3[6],xmm2[7]
+; SSE42-PCLMUL-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
+; SSE42-PCLMUL-NEXT: packusdw %xmm3, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: retq
+ %x.ext = zext <8 x i16> %x to <8 x i32>
+ %clmul = call <8 x i32> @llvm.clmul.v8i32(<8 x i32> %x.ext, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>)
+ %res.ext = lshr <8 x i32> %clmul, <i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15, i32 15>
+ %res = trunc <8 x i32> %res.ext to <8 x i16>
+ ret <8 x i16> %res
+}
+
+define <4 x i32> @clmulr_v4i32_allones(<4 x i32> %x) nounwind {
+; SCALAR-LABEL: clmulr_v4i32_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: pxor %xmm1, %xmm1
+; SCALAR-NEXT: movdqa %xmm0, %xmm2
+; SCALAR-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
+; SCALAR-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddq %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $2, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $4, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $8, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $16, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $32, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: paddq %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: psllq $2, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: psllq $4, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: psllq $8, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: psllq $16, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: psllq $32, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: psrlq $31, %xmm2
+; SCALAR-NEXT: psrlq $31, %xmm0
+; SCALAR-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
+; SCALAR-NEXT: retq
+;
+; SSE2-NOPCLMUL-LABEL: clmulr_v4i32_allones:
+; SSE2-NOPCLMUL: # %bb.0:
+; SSE2-NOPCLMUL-NEXT: subq $200, %rsp
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm14
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm14 = xmm14[0],xmm1[0],xmm14[1],xmm1[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2,2]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [4,4]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [8,8]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,16]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32,32]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [64,64]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [128,128]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, (%rsp) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [256,256]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [512,512]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1024,1024]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2048,2048]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4096,4096]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [8192,8192]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [16384,16384]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32768,32768]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [65536,65536]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [131072,131072]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm15
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm15 # [262144,262144]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm13
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm13 # [524288,524288]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm12
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12 # [1048576,1048576]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm11
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11 # [2097152,2097152]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4194304,4194304]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm10
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm10 # [8388608,8388608]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm9
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm9 # [16777216,16777216]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm8
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm8 # [33554432,33554432]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm7
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7 # [67108864,67108864]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6 # [134217728,134217728]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [268435456,268435456]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [536870912,536870912]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [1073741824,1073741824]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm14 # [2147483648,2147483648]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm0
+; SSE2-NOPCLMUL-NEXT: punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
+; SSE2-NOPCLMUL-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa (%rsp), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm15
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm15
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm13
+; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm13
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm12
+; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm12
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm11
+; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm11
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm11
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm10
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm10
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm9
+; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm9
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm8
+; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm8
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm7
+; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm7
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm6
+; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm5
+; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm5
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm14
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm14
+; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm14
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm0
+; SSE2-NOPCLMUL-NEXT: punpckhdq {{.*#+}} xmm14 = xmm14[2],xmm0[2],xmm14[3],xmm0[3]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [2,2]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [4,4]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [8,8]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm5
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [16,16]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm11 = [32,32]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm11
+; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [64,64]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm7
+; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [128,128]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm8 = [256,256]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm8
+; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm9 = [512,512]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm9
+; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm10 = [1024,1024]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm10
+; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [2048,2048]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4096,4096]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm13 = [8192,8192]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm13
+; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm15 = [16384,16384]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm15
+; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [32768,32768]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [65536,65536]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [131072,131072]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [262144,262144]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [524288,524288]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [1048576,1048576]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2097152,2097152]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm6 = [4194304,4194304]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8388608,8388608]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm6, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16777216,16777216]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [33554432,33554432]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [67108864,67108864]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [134217728,134217728]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [268435456,268435456]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [536870912,536870912]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm12 = [1073741824,1073741824]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm12
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm14 # [2147483648,2147483648]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm3
+; SSE2-NOPCLMUL-NEXT: punpckhdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Folded Reload
+; SSE2-NOPCLMUL-NEXT: # xmm3 = xmm3[2],mem[2],xmm3[3],mem[3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm5
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm11
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm7
+; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm7
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm2
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm8
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm8
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm9
+; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm9
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm10
+; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm10
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm13
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm15
+; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm15
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa (%rsp), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm12
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm12
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm14
+; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm14
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm14
+; SSE2-NOPCLMUL-NEXT: psrlq $31, %xmm14
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psrlq $31, %xmm0
+; SSE2-NOPCLMUL-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm14[0,2]
+; SSE2-NOPCLMUL-NEXT: addq $200, %rsp
+; SSE2-NOPCLMUL-NEXT: retq
+;
+; SSE2-PCLMUL-LABEL: clmulr_v4i32_allones:
+; SSE2-PCLMUL: # %bb.0:
+; SSE2-PCLMUL-NEXT: xorps %xmm1, %xmm1
+; SSE2-PCLMUL-NEXT: movaps %xmm0, %xmm2
+; SSE2-PCLMUL-NEXT: unpckhps {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
+; SSE2-PCLMUL-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
+; SSE2-PCLMUL-NEXT: movq $-1, %rax
+; SSE2-PCLMUL-NEXT: movq %rax, %xmm3
+; SSE2-PCLMUL-NEXT: movaps %xmm0, %xmm4
+; SSE2-PCLMUL-NEXT: psrlq $32, %xmm4
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm3, %xmm4
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm3, %xmm1
+; SSE2-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm4[0]
+; SSE2-PCLMUL-NEXT: psrldq {{.*#+}} xmm0 = xmm0[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm3, %xmm0
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm3, %xmm2
+; SSE2-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0]
+; SSE2-PCLMUL-NEXT: psrlq $31, %xmm2
+; SSE2-PCLMUL-NEXT: psrlq $31, %xmm1
+; SSE2-PCLMUL-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm2[0,2]
+; SSE2-PCLMUL-NEXT: movaps %xmm1, %xmm0
+; SSE2-PCLMUL-NEXT: retq
+;
+; SSE42-LABEL: clmulr_v4i32_allones:
+; SSE42: # %bb.0:
+; SSE42-NEXT: movq $-1, %rax
+; SSE42-NEXT: movq %rax, %xmm2
+; SSE42-NEXT: movdqa %xmm0, %xmm3
+; SSE42-NEXT: psrlq $32, %xmm3
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-NEXT: pxor %xmm4, %xmm4
+; SSE42-NEXT: pxor %xmm1, %xmm1
+; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm1
+; SSE42-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
+; SSE42-NEXT: movdqa %xmm0, %xmm3
+; SSE42-NEXT: psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm4[2],xmm0[3],xmm4[3]
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm0
+; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
+; SSE42-NEXT: psrlq $31, %xmm0
+; SSE42-NEXT: psrlq $31, %xmm1
+; SSE42-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[0,2]
+; SSE42-NEXT: movaps %xmm1, %xmm0
+; SSE42-NEXT: retq
+;
+; AVX512-LABEL: clmulr_v4i32_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
+; AVX512-NEXT: movq $-1, %rax
+; AVX512-NEXT: vpbroadcastq %rax, %ymm1
+; AVX512-NEXT: vpclmulqdq $1, %ymm1, %ymm0, %ymm2
+; AVX512-NEXT: vpclmulqdq $0, %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm2[0],ymm0[2],ymm2[2]
+; AVX512-NEXT: vpsrlq $31, %ymm0, %ymm0
+; AVX512-NEXT: vpmovqd %ymm0, %xmm0
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
+; SSE42-PCLMUL-LABEL: clmulr_v4i32_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: movq $-1, %rax
+; SSE42-PCLMUL-NEXT: movq %rax, %xmm2
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE42-PCLMUL-NEXT: psrlq $32, %xmm3
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-PCLMUL-NEXT: pxor %xmm4, %xmm4
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm1
+; SSE42-PCLMUL-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm1
+; SSE42-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE42-PCLMUL-NEXT: psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-PCLMUL-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm4[2],xmm0[3],xmm4[3]
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
+; SSE42-PCLMUL-NEXT: psrlq $31, %xmm0
+; SSE42-PCLMUL-NEXT: psrlq $31, %xmm1
+; SSE42-PCLMUL-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[0,2]
+; SSE42-PCLMUL-NEXT: movaps %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: retq
+ %x.ext = zext <4 x i32> %x to <4 x i64>
+ %clmul = call <4 x i64> @llvm.clmul.v4i64(<4 x i64> %x.ext, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>)
+ %res.ext = lshr <4 x i64> %clmul, <i64 31, i64 31, i64 31, i64 31>
+ %res = trunc <4 x i64> %res.ext to <4 x i32>
+ ret <4 x i32> %res
+}
+
+define <2 x i64> @clmulr_v2i64_allones(<2 x i64> %x) nounwind {
+; SCALAR-LABEL: clmulr_v2i64_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; SCALAR-NEXT: movq %xmm1, %rax
+; SCALAR-NEXT: movq %xmm0, %rsi
+; SCALAR-NEXT: leaq (%rsi,%rsi), %r8
+; SCALAR-NEXT: xorq %rsi, %r8
+; SCALAR-NEXT: bswapq %rsi
+; SCALAR-NEXT: movq %rsi, %rcx
+; SCALAR-NEXT: shrq $4, %rcx
+; SCALAR-NEXT: movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F
+; SCALAR-NEXT: andq %rdx, %rcx
+; SCALAR-NEXT: andq %rdx, %rsi
+; SCALAR-NEXT: shlq $4, %rsi
+; SCALAR-NEXT: orq %rcx, %rsi
+; SCALAR-NEXT: movabsq $3689348814741910323, %rcx # imm = 0x3333333333333333
+; SCALAR-NEXT: movq %rsi, %rdi
+; SCALAR-NEXT: andq %rcx, %rdi
+; SCALAR-NEXT: shrq $2, %rsi
+; SCALAR-NEXT: andq %rcx, %rsi
+; SCALAR-NEXT: leaq (%rsi,%rdi,4), %rdi
+; SCALAR-NEXT: movabsq $6148914691236517205, %rsi # imm = 0x5555555555555555
+; SCALAR-NEXT: movq %rdi, %r9
+; SCALAR-NEXT: andq %rsi, %r9
+; SCALAR-NEXT: shrq %rdi
+; SCALAR-NEXT: andq %rsi, %rdi
+; SCALAR-NEXT: leaq (%rdi,%r9,2), %rdi
+; SCALAR-NEXT: leaq (%rdi,%rdi), %r9
+; SCALAR-NEXT: xorq %rdi, %r9
+; SCALAR-NEXT: leaq (,%r9,4), %rdi
+; SCALAR-NEXT: xorq %r9, %rdi
+; SCALAR-NEXT: movq %rdi, %r9
+; SCALAR-NEXT: shlq $4, %r9
+; SCALAR-NEXT: xorq %rdi, %r9
+; SCALAR-NEXT: movq %r9, %rdi
+; SCALAR-NEXT: shlq $8, %rdi
+; SCALAR-NEXT: xorq %r9, %rdi
+; SCALAR-NEXT: movq %rdi, %r9
+; SCALAR-NEXT: shlq $16, %r9
+; SCALAR-NEXT: xorq %rdi, %r9
+; SCALAR-NEXT: movq %r9, %rdi
+; SCALAR-NEXT: shlq $32, %rdi
+; SCALAR-NEXT: xorq %r9, %rdi
+; SCALAR-NEXT: bswapq %rdi
+; SCALAR-NEXT: movq %rdi, %r9
+; SCALAR-NEXT: shrq $4, %r9
+; SCALAR-NEXT: andq %rdx, %r9
+; SCALAR-NEXT: andq %rdx, %rdi
+; SCALAR-NEXT: shlq $4, %rdi
+; SCALAR-NEXT: orq %r9, %rdi
+; SCALAR-NEXT: movq %rdi, %r9
+; SCALAR-NEXT: andq %rcx, %r9
+; SCALAR-NEXT: shrq $2, %rdi
+; SCALAR-NEXT: andq %rcx, %rdi
+; SCALAR-NEXT: leaq (%rdi,%r9,4), %rdi
+; SCALAR-NEXT: movq %rdi, %r10
+; SCALAR-NEXT: andq %rsi, %r10
+; SCALAR-NEXT: shrq %rdi
+; SCALAR-NEXT: movabsq $6148914691236517204, %r9 # imm = 0x5555555555555554
+; SCALAR-NEXT: andq %r9, %rdi
+; SCALAR-NEXT: leaq (%rdi,%r10,2), %rdi
+; SCALAR-NEXT: shrq %rdi
+; SCALAR-NEXT: leaq (,%r8,4), %r10
+; SCALAR-NEXT: xorq %r8, %r10
+; SCALAR-NEXT: movq %r10, %r8
+; SCALAR-NEXT: shlq $4, %r8
+; SCALAR-NEXT: xorq %r10, %r8
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $8, %r10
+; SCALAR-NEXT: xorq %r8, %r10
+; SCALAR-NEXT: movq %r10, %r11
+; SCALAR-NEXT: shlq $16, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r11, %r8
+; SCALAR-NEXT: shlq $32, %r8
+; SCALAR-NEXT: xorq %r11, %r8
+; SCALAR-NEXT: xorq %r8, %rdi
+; SCALAR-NEXT: leaq (%rax,%rax), %r10
+; SCALAR-NEXT: xorq %rax, %r10
+; SCALAR-NEXT: bswapq %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: shrq $4, %r11
+; SCALAR-NEXT: andq %rdx, %r11
+; SCALAR-NEXT: andq %rdx, %rax
+; SCALAR-NEXT: shlq $4, %rax
+; SCALAR-NEXT: orq %r11, %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: andq %rcx, %r11
+; SCALAR-NEXT: shrq $2, %rax
+; SCALAR-NEXT: andq %rcx, %rax
+; SCALAR-NEXT: leaq (%rax,%r11,4), %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: andq %rsi, %r11
+; SCALAR-NEXT: shrq %rax
+; SCALAR-NEXT: andq %rsi, %rax
+; SCALAR-NEXT: leaq (%rax,%r11,2), %rax
+; SCALAR-NEXT: leaq (%rax,%rax), %r11
+; SCALAR-NEXT: xorq %rax, %r11
+; SCALAR-NEXT: leaq (,%r11,4), %rax
+; SCALAR-NEXT: xorq %r11, %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: shlq $4, %r11
+; SCALAR-NEXT: xorq %rax, %r11
+; SCALAR-NEXT: movq %r11, %rax
+; SCALAR-NEXT: shlq $8, %rax
+; SCALAR-NEXT: xorq %r11, %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: shlq $16, %r11
+; SCALAR-NEXT: xorq %rax, %r11
+; SCALAR-NEXT: movq %r11, %rax
+; SCALAR-NEXT: shlq $32, %rax
+; SCALAR-NEXT: xorq %r11, %rax
+; SCALAR-NEXT: bswapq %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: shrq $4, %r11
+; SCALAR-NEXT: andq %rdx, %r11
+; SCALAR-NEXT: andq %rdx, %rax
+; SCALAR-NEXT: shlq $4, %rax
+; SCALAR-NEXT: orq %r11, %rax
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: andq %rcx, %rdx
+; SCALAR-NEXT: shrq $2, %rax
+; SCALAR-NEXT: andq %rcx, %rax
+; SCALAR-NEXT: leaq (%rax,%rdx,4), %rax
+; SCALAR-NEXT: andq %rax, %rsi
+; SCALAR-NEXT: shrq %rax
+; SCALAR-NEXT: andq %r9, %rax
+; SCALAR-NEXT: leaq (%rax,%rsi,2), %rax
+; SCALAR-NEXT: shrq %rax
+; SCALAR-NEXT: leaq (,%r10,4), %rcx
+; SCALAR-NEXT: xorq %r10, %rcx
+; SCALAR-NEXT: movq %rcx, %rdx
+; SCALAR-NEXT: shlq $4, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdx, %rcx
+; SCALAR-NEXT: shlq $8, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rcx, %rdx
+; SCALAR-NEXT: shlq $16, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdx, %rcx
+; SCALAR-NEXT: shlq $32, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: shldq $1, %rcx, %rax
+; SCALAR-NEXT: shldq $1, %r8, %rdi
+; SCALAR-NEXT: movq %rdi, %xmm0
+; SCALAR-NEXT: movq %rax, %xmm1
+; SCALAR-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SCALAR-NEXT: retq
+;
+; SSE2-NOPCLMUL-LABEL: clmulr_v2i64_allones:
+; SSE2-NOPCLMUL: # %bb.0:
+; SSE2-NOPCLMUL-NEXT: pushq %r15
+; SSE2-NOPCLMUL-NEXT: pushq %r14
+; SSE2-NOPCLMUL-NEXT: pushq %r13
+; SSE2-NOPCLMUL-NEXT: pushq %r12
+; SSE2-NOPCLMUL-NEXT: pushq %rbx
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; SSE2-NOPCLMUL-NEXT: movq %xmm1, %rax
+; SSE2-NOPCLMUL-NEXT: movq %xmm0, %rcx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rsi
+; SSE2-NOPCLMUL-NEXT: bswapq %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rsi, %rdx
+; SSE2-NOPCLMUL-NEXT: shrq $4, %rdx
+; SSE2-NOPCLMUL-NEXT: movabsq $1085102592571150095, %rdi # imm = 0xF0F0F0F0F0F0F0F
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %rdx
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rsi
+; SSE2-NOPCLMUL-NEXT: orq %rdx, %rsi
+; SSE2-NOPCLMUL-NEXT: movabsq $3689348814741910323, %rdx # imm = 0x3333333333333333
+; SSE2-NOPCLMUL-NEXT: movq %rsi, %r8
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r8
+; SSE2-NOPCLMUL-NEXT: shrq $2, %rsi
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rsi
+; SSE2-NOPCLMUL-NEXT: leaq (%rsi,%r8,4), %r8
+; SSE2-NOPCLMUL-NEXT: movabsq $6148914691236517205, %rsi # imm = 0x5555555555555555
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %r9
+; SSE2-NOPCLMUL-NEXT: shrq %r8
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r10
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: leaq (%r10,%r9,2), %r9
+; SSE2-NOPCLMUL-NEXT: leaq (%r9,%r9), %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: leaq (,%r9,4), %r11
+; SSE2-NOPCLMUL-NEXT: leaq (,%r9,8), %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $5, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $6, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $7, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $8, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $9, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $10, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $11, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $12, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $13, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $15, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $16, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $17, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $18, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $19, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $20, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $21, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $22, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $23, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $24, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $25, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $26, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $27, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $28, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $29, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $30, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $31, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $32, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $33, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $34, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $35, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $36, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $37, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $38, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $39, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $40, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $41, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $42, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $43, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $44, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $45, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $46, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $47, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $48, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $49, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $50, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $51, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $52, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $53, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $54, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $55, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $56, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $57, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $58, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $59, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $60, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $61, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $62, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $63, %r8
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r8
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r8
+; SSE2-NOPCLMUL-NEXT: bswapq %r8
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
+; SSE2-NOPCLMUL-NEXT: shrq $4, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %r8
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r8
+; SSE2-NOPCLMUL-NEXT: orq %r9, %r8
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r9
+; SSE2-NOPCLMUL-NEXT: shrq $2, %r8
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r8
+; SSE2-NOPCLMUL-NEXT: leaq (%r8,%r9,4), %r8
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %r9
+; SSE2-NOPCLMUL-NEXT: shrq %r8
+; SSE2-NOPCLMUL-NEXT: movabsq $6148914691236517204, %r10 # imm = 0x5555555555555554
+; SSE2-NOPCLMUL-NEXT: andq %r10, %r8
+; SSE2-NOPCLMUL-NEXT: leaq (%r8,%r9,2), %r8
+; SSE2-NOPCLMUL-NEXT: shrq %r8
+; SSE2-NOPCLMUL-NEXT: leaq (%rcx,%rcx), %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: leaq (,%rcx,4), %r11
+; SSE2-NOPCLMUL-NEXT: leaq (,%rcx,8), %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $5, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $6, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $7, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $8, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $9, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $10, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $11, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $12, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $13, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $15, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $16, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $17, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $18, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $19, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $20, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $21, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $22, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $23, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $24, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $25, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $26, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $27, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $28, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $29, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $30, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $31, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $32, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $33, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $34, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $35, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $36, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $37, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $38, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $39, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $40, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $41, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $42, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $43, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $44, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $45, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $46, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $47, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $48, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $49, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $50, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $51, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $52, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $53, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $54, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $55, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $56, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $57, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $58, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $59, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $60, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $61, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $62, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r8
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: bswapq %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: shrq $4, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r11
+; SSE2-NOPCLMUL-NEXT: orq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rbx
+; SSE2-NOPCLMUL-NEXT: shrq $2, %r11
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r11
+; SSE2-NOPCLMUL-NEXT: leaq (%r11,%rbx,4), %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %rbx
+; SSE2-NOPCLMUL-NEXT: shrq %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %r14
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %r14
+; SSE2-NOPCLMUL-NEXT: leaq (%r14,%rbx,2), %rbx
+; SSE2-NOPCLMUL-NEXT: leaq (%rbx,%rbx), %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: leaq (,%rbx,4), %r15
+; SSE2-NOPCLMUL-NEXT: leaq (,%rbx,8), %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $5, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $6, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $7, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $8, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $9, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $10, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $11, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $12, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $13, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $14, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $15, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $16, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $17, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $18, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $19, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
+; SSE2-NOPCLMUL-NEXT: shlq $20, %r13
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $21, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $22, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $23, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $24, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $25, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $26, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $27, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $28, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $29, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $30, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $31, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $32, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $33, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $34, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
+; SSE2-NOPCLMUL-NEXT: shlq $35, %r13
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $36, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $37, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $38, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $39, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $40, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $41, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $42, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $43, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $44, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $45, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $46, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $47, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $48, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $49, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $50, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $51, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $52, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $53, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
+; SSE2-NOPCLMUL-NEXT: shlq $54, %r13
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $55, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $56, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $57, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $58, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $59, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $60, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $61, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $62, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $63, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r11
+; SSE2-NOPCLMUL-NEXT: bswapq %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: shrq $4, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r11
+; SSE2-NOPCLMUL-NEXT: orq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rdi
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rdi
+; SSE2-NOPCLMUL-NEXT: shrq $2, %r11
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r11
+; SSE2-NOPCLMUL-NEXT: leaq (%r11,%rdi,4), %rdx
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rsi
+; SSE2-NOPCLMUL-NEXT: shrq %rdx
+; SSE2-NOPCLMUL-NEXT: andq %r10, %rdx
+; SSE2-NOPCLMUL-NEXT: leaq (%rdx,%rsi,2), %rdx
+; SSE2-NOPCLMUL-NEXT: shrq %rdx
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rax), %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: leaq (,%rax,4), %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (,%rax,8), %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $5, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $6, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $7, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $8, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $9, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $10, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $11, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $12, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $13, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $14, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $15, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $16, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $17, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $18, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $19, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $20, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $21, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $22, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $23, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $24, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $25, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $26, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $27, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $28, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $29, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $30, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $31, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $32, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $33, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $34, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $35, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $36, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $37, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $38, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $39, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $40, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $41, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $42, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $43, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $44, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $45, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $46, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $47, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $48, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $49, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $50, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $51, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $52, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $53, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $54, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $55, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $56, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $57, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $58, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $59, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $60, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $61, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $62, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdx
+; SSE2-NOPCLMUL-NEXT: shlq $63, %rcx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rcx
+; SSE2-NOPCLMUL-NEXT: shrdq $63, %r8, %rcx
+; SSE2-NOPCLMUL-NEXT: shlq $63, %rax
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rax
+; SSE2-NOPCLMUL-NEXT: shrdq $63, %rdx, %rax
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %xmm0
+; SSE2-NOPCLMUL-NEXT: movq %rax, %xmm1
+; SSE2-NOPCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE2-NOPCLMUL-NEXT: popq %rbx
+; SSE2-NOPCLMUL-NEXT: popq %r12
+; SSE2-NOPCLMUL-NEXT: popq %r13
+; SSE2-NOPCLMUL-NEXT: popq %r14
+; SSE2-NOPCLMUL-NEXT: popq %r15
+; SSE2-NOPCLMUL-NEXT: retq
+;
+; SSE2-PCLMUL-LABEL: clmulr_v2i64_allones:
+; SSE2-PCLMUL: # %bb.0:
+; SSE2-PCLMUL-NEXT: movq $-1, %rax
+; SSE2-PCLMUL-NEXT: movq %rax, %xmm1
+; SSE2-PCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE2-PCLMUL-NEXT: pclmulqdq $1, %xmm1, %xmm2
+; SSE2-PCLMUL-NEXT: movq %xmm2, %rax
+; SSE2-PCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
+; SSE2-PCLMUL-NEXT: movq %xmm2, %rcx
+; SSE2-PCLMUL-NEXT: xorq %rax, %rcx
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm1, %xmm0
+; SSE2-PCLMUL-NEXT: movq %xmm0, %rdx
+; SSE2-PCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; SSE2-PCLMUL-NEXT: movq %xmm0, %rsi
+; SSE2-PCLMUL-NEXT: xorq %rdx, %rsi
+; SSE2-PCLMUL-NEXT: shldq $1, %rdx, %rsi
+; SSE2-PCLMUL-NEXT: shldq $1, %rax, %rcx
+; SSE2-PCLMUL-NEXT: movq %rcx, %xmm1
+; SSE2-PCLMUL-NEXT: movq %rsi, %xmm0
+; SSE2-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE2-PCLMUL-NEXT: retq
+;
+; SSE42-LABEL: clmulr_v2i64_allones:
+; SSE42: # %bb.0:
+; SSE42-NEXT: movq $-1, %rax
+; SSE42-NEXT: movq %rax, %xmm1
+; SSE42-NEXT: movdqa %xmm0, %xmm2
+; SSE42-NEXT: pclmulqdq $1, %xmm1, %xmm2
+; SSE42-NEXT: movq %xmm2, %rax
+; SSE42-NEXT: pextrq $1, %xmm2, %rcx
+; SSE42-NEXT: xorq %rax, %rcx
+; SSE42-NEXT: pclmulqdq $0, %xmm1, %xmm0
+; SSE42-NEXT: movq %xmm0, %rdx
+; SSE42-NEXT: pextrq $1, %xmm0, %rsi
+; SSE42-NEXT: xorq %rdx, %rsi
+; SSE42-NEXT: shldq $1, %rdx, %rsi
+; SSE42-NEXT: shldq $1, %rax, %rcx
+; SSE42-NEXT: movq %rcx, %xmm1
+; SSE42-NEXT: movq %rsi, %xmm0
+; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE42-NEXT: retq
+;
+; AVX2-LABEL: clmulr_v2i64_allones:
+; AVX2: # %bb.0:
+; AVX2-NEXT: movq $-1, %rax
+; AVX2-NEXT: vmovq %rax, %xmm1
+; AVX2-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm2
+; AVX2-NEXT: vmovq %xmm2, %rax
+; AVX2-NEXT: vpextrq $1, %xmm2, %rcx
+; AVX2-NEXT: xorq %rax, %rcx
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vmovq %xmm0, %rdx
+; AVX2-NEXT: vpextrq $1, %xmm0, %rsi
+; AVX2-NEXT: xorq %rdx, %rsi
+; AVX2-NEXT: shldq $1, %rdx, %rsi
+; AVX2-NEXT: shldq $1, %rax, %rcx
+; AVX2-NEXT: vmovq %rcx, %xmm0
+; AVX2-NEXT: vmovq %rsi, %xmm1
+; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: clmulr_v2i64_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: movq $-1, %rax
+; AVX512-NEXT: vmovq %rax, %xmm1
+; AVX512-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm2
+; AVX512-NEXT: vmovq %xmm2, %rax
+; AVX512-NEXT: vpextrq $1, %xmm2, %rcx
+; AVX512-NEXT: xorq %rax, %rcx
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: vmovq %xmm0, %rdx
+; AVX512-NEXT: vpextrq $1, %xmm0, %rsi
+; AVX512-NEXT: xorq %rdx, %rsi
+; AVX512-NEXT: shldq $1, %rdx, %rsi
+; AVX512-NEXT: shldq $1, %rax, %rcx
+; AVX512-NEXT: vmovq %rcx, %xmm0
+; AVX512-NEXT: vmovq %rsi, %xmm1
+; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
+; AVX512-NEXT: retq
+; SSE42-PCLMUL-LABEL: clmulr_v2i64_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: movq $-1, %rax
+; SSE42-PCLMUL-NEXT: movq %rax, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE42-PCLMUL-NEXT: pclmulqdq $1, %xmm1, %xmm2
+; SSE42-PCLMUL-NEXT: movq %xmm2, %rax
+; SSE42-PCLMUL-NEXT: pextrq $1, %xmm2, %rcx
+; SSE42-PCLMUL-NEXT: xorq %rax, %rcx
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: movq %xmm0, %rdx
+; SSE42-PCLMUL-NEXT: pextrq $1, %xmm0, %rsi
+; SSE42-PCLMUL-NEXT: xorq %rdx, %rsi
+; SSE42-PCLMUL-NEXT: shldq $1, %rdx, %rsi
+; SSE42-PCLMUL-NEXT: shldq $1, %rax, %rcx
+; SSE42-PCLMUL-NEXT: movq %rcx, %xmm1
+; SSE42-PCLMUL-NEXT: movq %rsi, %xmm0
+; SSE42-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE42-PCLMUL-NEXT: retq
+; AVX-LABEL: clmulr_v2i64_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movq $-1, %rax
+; AVX-NEXT: vmovq %rax, %xmm1
+; AVX-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm2
+; AVX-NEXT: vmovq %xmm2, %rax
+; AVX-NEXT: vpextrq $1, %xmm2, %rcx
+; AVX-NEXT: xorq %rax, %rcx
+; AVX-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rdx
+; AVX-NEXT: vpextrq $1, %xmm0, %rsi
+; AVX-NEXT: xorq %rdx, %rsi
+; AVX-NEXT: shldq $1, %rdx, %rsi
+; AVX-NEXT: shldq $1, %rax, %rcx
+; AVX-NEXT: vmovq %rcx, %xmm0
+; AVX-NEXT: vmovq %rsi, %xmm1
+; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
+; AVX-NEXT: retq
+ %x.ext = zext <2 x i64> %x to <2 x i128>
+ %clmul = call <2 x i128> @llvm.clmul.v2i128(<2 x i128> %x.ext, <2 x i128> <i128 -1, i128 -1>)
+ %res.ext = lshr <2 x i128> %clmul, <i128 63, i128 63>
+ %res = trunc <2 x i128> %res.ext to <2 x i64>
+ ret <2 x i64> %res
+}
+
+define <16 x i8> @clmulh_v16i8_allones(<16 x i8> %x) nounwind {
+; SCALAR-LABEL: clmulh_v16i8_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: pxor %xmm1, %xmm1
+; SCALAR-NEXT: movdqa %xmm0, %xmm2
+; SCALAR-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
+; SCALAR-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddw %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllw $2, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllw $4, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllw $8, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: paddw %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: psllw $2, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: psllw $4, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: psllw $8, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: psrlw $8, %xmm2
+; SCALAR-NEXT: psrlw $8, %xmm0
+; SCALAR-NEXT: packuswb %xmm2, %xmm0
+; SCALAR-NEXT: retq
+;
+; SSE2-LABEL: clmulh_v16i8_allones:
+; SSE2: # %bb.0:
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: pxor %xmm3, %xmm3
+; SSE2-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
+; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
+; SSE2-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NEXT: paddw %xmm4, %xmm4
+; SSE2-NEXT: pxor %xmm0, %xmm4
+; SSE2-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NEXT: psllw $2, %xmm5
+; SSE2-NEXT: movdqa %xmm0, %xmm6
+; SSE2-NEXT: psllw $3, %xmm6
+; SSE2-NEXT: pxor %xmm5, %xmm6
+; SSE2-NEXT: pxor %xmm4, %xmm6
+; SSE2-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NEXT: psllw $4, %xmm4
+; SSE2-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NEXT: psllw $5, %xmm5
+; SSE2-NEXT: pxor %xmm4, %xmm5
+; SSE2-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NEXT: psllw $6, %xmm4
+; SSE2-NEXT: pxor %xmm5, %xmm4
+; SSE2-NEXT: pxor %xmm6, %xmm4
+; SSE2-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NEXT: psllw $7, %xmm5
+; SSE2-NEXT: pxor %xmm6, %xmm6
+; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1],xmm6[2],xmm1[2],xmm6[3],xmm1[3],xmm6[4],xmm1[4],xmm6[5],xmm1[5],xmm6[6],xmm1[6],xmm6[7],xmm1[7]
+; SSE2-NEXT: pxor %xmm5, %xmm6
+; SSE2-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NEXT: psllw $9, %xmm5
+; SSE2-NEXT: pxor %xmm6, %xmm5
+; SSE2-NEXT: movdqa %xmm0, %xmm6
+; SSE2-NEXT: psllw $10, %xmm6
+; SSE2-NEXT: pxor %xmm5, %xmm6
+; SSE2-NEXT: pxor %xmm4, %xmm6
+; SSE2-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NEXT: psllw $11, %xmm4
+; SSE2-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NEXT: psllw $12, %xmm5
+; SSE2-NEXT: pxor %xmm4, %xmm5
+; SSE2-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NEXT: psllw $13, %xmm4
+; SSE2-NEXT: pxor %xmm5, %xmm4
+; SSE2-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NEXT: psllw $14, %xmm5
+; SSE2-NEXT: pxor %xmm4, %xmm5
+; SSE2-NEXT: psllw $15, %xmm0
+; SSE2-NEXT: pxor %xmm5, %xmm0
+; SSE2-NEXT: pxor %xmm6, %xmm0
+; SSE2-NEXT: movdqa %xmm2, %xmm4
+; SSE2-NEXT: paddw %xmm4, %xmm4
+; SSE2-NEXT: pxor %xmm2, %xmm4
+; SSE2-NEXT: movdqa %xmm2, %xmm5
+; SSE2-NEXT: psllw $2, %xmm5
+; SSE2-NEXT: movdqa %xmm2, %xmm6
+; SSE2-NEXT: psllw $3, %xmm6
+; SSE2-NEXT: pxor %xmm5, %xmm6
+; SSE2-NEXT: pxor %xmm4, %xmm6
+; SSE2-NEXT: movdqa %xmm2, %xmm4
+; SSE2-NEXT: psllw $4, %xmm4
+; SSE2-NEXT: movdqa %xmm2, %xmm5
+; SSE2-NEXT: psllw $5, %xmm5
+; SSE2-NEXT: pxor %xmm4, %xmm5
+; SSE2-NEXT: movdqa %xmm2, %xmm4
+; SSE2-NEXT: psllw $6, %xmm4
+; SSE2-NEXT: pxor %xmm5, %xmm4
+; SSE2-NEXT: pxor %xmm6, %xmm4
+; SSE2-NEXT: movdqa %xmm2, %xmm5
+; SSE2-NEXT: psllw $7, %xmm5
+; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
+; SSE2-NEXT: pxor %xmm5, %xmm3
+; SSE2-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NEXT: psllw $9, %xmm1
+; SSE2-NEXT: pxor %xmm3, %xmm1
+; SSE2-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NEXT: psllw $10, %xmm3
+; SSE2-NEXT: pxor %xmm1, %xmm3
+; SSE2-NEXT: pxor %xmm4, %xmm3
+; SSE2-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NEXT: psllw $11, %xmm1
+; SSE2-NEXT: movdqa %xmm2, %xmm4
+; SSE2-NEXT: psllw $12, %xmm4
+; SSE2-NEXT: pxor %xmm1, %xmm4
+; SSE2-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NEXT: psllw $13, %xmm1
+; SSE2-NEXT: pxor %xmm4, %xmm1
+; SSE2-NEXT: movdqa %xmm2, %xmm4
+; SSE2-NEXT: psllw $14, %xmm4
+; SSE2-NEXT: pxor %xmm1, %xmm4
+; SSE2-NEXT: psllw $15, %xmm2
+; SSE2-NEXT: pxor %xmm4, %xmm2
+; SSE2-NEXT: pxor %xmm3, %xmm2
+; SSE2-NEXT: psrlw $8, %xmm2
+; SSE2-NEXT: psrlw $8, %xmm0
+; SSE2-NEXT: packuswb %xmm2, %xmm0
+; SSE2-NEXT: retq
+;
+; SSE42-LABEL: clmulh_v16i8_allones:
+; SSE42: # %bb.0:
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: pxor %xmm3, %xmm3
+; SSE42-NEXT: movdqa %xmm0, %xmm2
+; SSE42-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
+; SSE42-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; SSE42-NEXT: pxor %xmm4, %xmm4
+; SSE42-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
+; SSE42-NEXT: movdqa %xmm0, %xmm5
+; SSE42-NEXT: paddw %xmm5, %xmm5
+; SSE42-NEXT: pxor %xmm0, %xmm5
+; SSE42-NEXT: movdqa %xmm0, %xmm6
+; SSE42-NEXT: psllw $2, %xmm6
+; SSE42-NEXT: movdqa %xmm0, %xmm7
+; SSE42-NEXT: psllw $3, %xmm7
+; SSE42-NEXT: pxor %xmm6, %xmm7
+; SSE42-NEXT: pxor %xmm5, %xmm7
+; SSE42-NEXT: movdqa %xmm0, %xmm5
+; SSE42-NEXT: psllw $4, %xmm5
+; SSE42-NEXT: movdqa %xmm0, %xmm6
+; SSE42-NEXT: psllw $5, %xmm6
+; SSE42-NEXT: pxor %xmm5, %xmm6
+; SSE42-NEXT: movdqa %xmm0, %xmm5
+; SSE42-NEXT: psllw $6, %xmm5
+; SSE42-NEXT: pxor %xmm6, %xmm5
+; SSE42-NEXT: pxor %xmm7, %xmm5
+; SSE42-NEXT: movdqa %xmm0, %xmm6
+; SSE42-NEXT: psllw $7, %xmm6
+; SSE42-NEXT: pxor %xmm4, %xmm6
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: psllw $9, %xmm4
+; SSE42-NEXT: pxor %xmm6, %xmm4
+; SSE42-NEXT: movdqa %xmm0, %xmm6
+; SSE42-NEXT: psllw $10, %xmm6
+; SSE42-NEXT: pxor %xmm4, %xmm6
+; SSE42-NEXT: pxor %xmm5, %xmm6
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: psllw $11, %xmm4
+; SSE42-NEXT: movdqa %xmm0, %xmm5
+; SSE42-NEXT: psllw $12, %xmm5
+; SSE42-NEXT: pxor %xmm4, %xmm5
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: psllw $13, %xmm4
+; SSE42-NEXT: pxor %xmm5, %xmm4
+; SSE42-NEXT: movdqa %xmm0, %xmm5
+; SSE42-NEXT: psllw $14, %xmm5
+; SSE42-NEXT: pxor %xmm4, %xmm5
+; SSE42-NEXT: psllw $15, %xmm0
+; SSE42-NEXT: pxor %xmm5, %xmm0
+; SSE42-NEXT: pxor %xmm6, %xmm0
+; SSE42-NEXT: movdqa %xmm2, %xmm4
+; SSE42-NEXT: paddw %xmm4, %xmm4
+; SSE42-NEXT: pxor %xmm2, %xmm4
+; SSE42-NEXT: movdqa %xmm2, %xmm5
+; SSE42-NEXT: psllw $2, %xmm5
+; SSE42-NEXT: movdqa %xmm2, %xmm6
+; SSE42-NEXT: psllw $3, %xmm6
+; SSE42-NEXT: pxor %xmm5, %xmm6
+; SSE42-NEXT: pxor %xmm4, %xmm6
+; SSE42-NEXT: movdqa %xmm2, %xmm4
+; SSE42-NEXT: psllw $4, %xmm4
+; SSE42-NEXT: movdqa %xmm2, %xmm5
+; SSE42-NEXT: psllw $5, %xmm5
+; SSE42-NEXT: pxor %xmm4, %xmm5
+; SSE42-NEXT: movdqa %xmm2, %xmm4
+; SSE42-NEXT: psllw $6, %xmm4
+; SSE42-NEXT: pxor %xmm5, %xmm4
+; SSE42-NEXT: pxor %xmm6, %xmm4
+; SSE42-NEXT: movdqa %xmm2, %xmm5
+; SSE42-NEXT: psllw $7, %xmm5
+; SSE42-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
+; SSE42-NEXT: pxor %xmm5, %xmm3
+; SSE42-NEXT: movdqa %xmm2, %xmm1
+; SSE42-NEXT: psllw $9, %xmm1
+; SSE42-NEXT: pxor %xmm3, %xmm1
+; SSE42-NEXT: movdqa %xmm2, %xmm3
+; SSE42-NEXT: psllw $10, %xmm3
+; SSE42-NEXT: pxor %xmm1, %xmm3
+; SSE42-NEXT: pxor %xmm4, %xmm3
+; SSE42-NEXT: movdqa %xmm2, %xmm1
+; SSE42-NEXT: psllw $11, %xmm1
+; SSE42-NEXT: movdqa %xmm2, %xmm4
+; SSE42-NEXT: psllw $12, %xmm4
+; SSE42-NEXT: pxor %xmm1, %xmm4
+; SSE42-NEXT: movdqa %xmm2, %xmm1
+; SSE42-NEXT: psllw $13, %xmm1
+; SSE42-NEXT: pxor %xmm4, %xmm1
+; SSE42-NEXT: movdqa %xmm2, %xmm4
+; SSE42-NEXT: psllw $14, %xmm4
+; SSE42-NEXT: pxor %xmm1, %xmm4
+; SSE42-NEXT: psllw $15, %xmm2
+; SSE42-NEXT: pxor %xmm4, %xmm2
+; SSE42-NEXT: pxor %xmm3, %xmm2
+; SSE42-NEXT: psrlw $8, %xmm2
+; SSE42-NEXT: psrlw $8, %xmm0
+; SSE42-NEXT: packuswb %xmm2, %xmm0
+; SSE42-NEXT: retq
+;
+; AVX2-LABEL: clmulh_v16i8_allones:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
+; AVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm1
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1
+; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
+; AVX2-NEXT: vpsllw $3, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
+; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
+; AVX2-NEXT: vpsllw $5, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpsllw $6, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
+; AVX2-NEXT: vpsllw $7, %ymm0, %ymm2
+; AVX2-NEXT: vpsllw $8, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpsllw $9, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpsllw $10, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
+; AVX2-NEXT: vpsllw $11, %ymm0, %ymm2
+; AVX2-NEXT: vpsllw $12, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpsllw $13, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpsllw $14, %ymm0, %ymm3
+; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
+; AVX2-NEXT: vpsllw $15, %ymm0, %ymm0
+; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0
+; AVX2-NEXT: vpxor %ymm0, %ymm1, %ymm0
+; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: clmulh_v16i8_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
+; AVX512-NEXT: vpaddw %ymm0, %ymm0, %ymm1
+; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2
+; AVX512-NEXT: vpsllw $3, %ymm0, %ymm3
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm1 ^ ymm2
+; AVX512-NEXT: vpsllw $4, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $5, %ymm0, %ymm2
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm3 ^ ymm1
+; AVX512-NEXT: vpsllw $6, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $7, %ymm0, %ymm3
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm2 ^ ymm1
+; AVX512-NEXT: vpsllw $8, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $9, %ymm0, %ymm2
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm3 ^ ymm1
+; AVX512-NEXT: vpsllw $10, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $11, %ymm0, %ymm3
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm2 ^ ymm1
+; AVX512-NEXT: vpsllw $12, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $13, %ymm0, %ymm2
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm3 ^ ymm1
+; AVX512-NEXT: vpsllw $14, %ymm0, %ymm1
+; AVX512-NEXT: vpsllw $15, %ymm0, %ymm0
+; AVX512-NEXT: vpternlogq {{.*#+}} ymm0 = ymm0 ^ ymm2 ^ ymm1
+; AVX512-NEXT: vpsrlw $8, %ymm0, %ymm0
+; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
+; AVX512-NEXT: vpmovdb %zmm0, %xmm0
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
+; SSE42-PCLMUL-LABEL: clmulh_v16i8_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm1
+; SSE42-PCLMUL-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; SSE42-PCLMUL-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: paddw %xmm1, %xmm1
+; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: psllw $2, %xmm0
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: psllw $4, %xmm1
+; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm3
+; SSE42-PCLMUL-NEXT: psllw $8, %xmm3
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE42-PCLMUL-NEXT: movdqa %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: paddw %xmm0, %xmm0
+; SSE42-PCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: psllw $2, %xmm1
+; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm2
+; SSE42-PCLMUL-NEXT: psllw $4, %xmm2
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE42-PCLMUL-NEXT: movdqa %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: psllw $8, %xmm0
+; SSE42-PCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: psrlw $8, %xmm3
+; SSE42-PCLMUL-NEXT: psrlw $8, %xmm0
+; SSE42-PCLMUL-NEXT: packuswb %xmm3, %xmm0
+; SSE42-PCLMUL-NEXT: retq
+ %x.ext = zext <16 x i8> %x to <16 x i16>
+ %clmul = call <16 x i16> @llvm.clmul.v16i16(<16 x i16> %x.ext, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
+ %res.ext = lshr <16 x i16> %clmul, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
+ %res = trunc <16 x i16> %res.ext to <16 x i8>
+ ret <16 x i8> %res
+}
+
+define <8 x i16> @clmulh_v8i16_allones(<8 x i16> %x) nounwind {
+; SCALAR-LABEL: clmulh_v8i16_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: pxor %xmm1, %xmm1
+; SCALAR-NEXT: movdqa %xmm0, %xmm2
+; SCALAR-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
+; SCALAR-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddd %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $2, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $4, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $8, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $16, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: paddd %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: pslld $2, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: pslld $4, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: pslld $8, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: pslld $16, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: psrad $16, %xmm1
+; SCALAR-NEXT: psrad $16, %xmm0
+; SCALAR-NEXT: packssdw %xmm1, %xmm0
+; SCALAR-NEXT: retq
+;
+; SSE2-NOPCLMUL-LABEL: clmulh_v8i16_allones:
+; SSE2-NOPCLMUL: # %bb.0:
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm8
+; SSE2-NOPCLMUL-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4],xmm1[4],xmm8[5],xmm1[5],xmm8[6],xmm1[6],xmm8[7],xmm1[7]
+; SSE2-NOPCLMUL-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4,4,4,4]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2,2,2,2]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8,8,8,8]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16,16,16,16]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [32,32,32,32]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [64,64,64,64]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [128,128,128,128]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [256,256,256,256]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [512,512,512,512]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [1024,1024,1024,1024]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2048,2048,2048,2048]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4096,4096,4096,4096]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8192,8192,8192,8192]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16384,16384,16384,16384]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm4[0],xmm6[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [32768,32768,32768,32768]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [65536,65536,65536,65536]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [131072,131072,131072,131072]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [262144,262144,262144,262144]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [524288,524288,524288,524288]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm13 = [1048576,1048576,1048576,1048576]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2097152,2097152,2097152,2097152]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4194304,4194304,4194304,4194304]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8388608,8388608,8388608,8388608]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm15 = [16777216,16777216,16777216,16777216]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm14 = [33554432,33554432,33554432,33554432]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm12 = [67108864,67108864,67108864,67108864]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm11 = [134217728,134217728,134217728,134217728]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm10 = [268435456,268435456,268435456,268435456]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm6
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm9 = [536870912,536870912,536870912,536870912]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [1073741824,1073741824,1073741824,1073741824]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %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: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm6
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [4,4,4,4]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [2,2,2,2]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [8,8,8,8]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [16,16,16,16]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [32,32,32,32]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [64,64,64,64]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [128,128,128,128]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [256,256,256,256]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [512,512,512,512]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm0[0],xmm7[1],xmm0[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm7
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [1024,1024,1024,1024]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [2048,2048,2048,2048]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [4096,4096,4096,4096]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [8192,8192,8192,8192]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [16384,16384,16384,16384]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [65536,65536,65536,65536]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [131072,131072,131072,131072]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [262144,262144,262144,262144]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [524288,524288,524288,524288]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm13
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm13[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2097152,2097152,2097152,2097152]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm13 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm13 = xmm13[0],xmm5[0],xmm13[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm13
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm13
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [4194304,4194304,4194304,4194304]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [8388608,8388608,8388608,8388608]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm15
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm15[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm14
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm14[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm12
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm12[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm11
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm11[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm0
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm10
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm10[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm2
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm9
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm9[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm8
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm8[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm2
+; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm6
+; SSE2-NOPCLMUL-NEXT: packssdw %xmm2, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm6, %xmm0
+; SSE2-NOPCLMUL-NEXT: retq
+;
+; SSE2-PCLMUL-LABEL: clmulh_v8i16_allones:
+; SSE2-PCLMUL: # %bb.0:
+; SSE2-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-PCLMUL-NEXT: pxor %xmm3, %xmm3
+; SSE2-PCLMUL-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; SSE2-PCLMUL-NEXT: movq %rax, %xmm2
+; SSE2-PCLMUL-NEXT: pextrw $3, %xmm0, %eax
+; SSE2-PCLMUL-NEXT: movd %eax, %xmm4
+; SSE2-PCLMUL-NEXT: pextrw $1, %xmm0, %eax
+; SSE2-PCLMUL-NEXT: movd %eax, %xmm5
+; SSE2-PCLMUL-NEXT: pextrw $7, %xmm0, %eax
+; SSE2-PCLMUL-NEXT: punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm3[4],xmm1[5],xmm3[5],xmm1[6],xmm3[6],xmm1[7],xmm3[7]
+; SSE2-PCLMUL-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3]
+; SSE2-PCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE2-PCLMUL-NEXT: pclmulqdq $1, %xmm2, %xmm3
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
+; SSE2-PCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm0
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm5
+; SSE2-PCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
+; SSE2-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm3[0]
+; SSE2-PCLMUL-NEXT: movdqa %xmm1, %xmm3
+; SSE2-PCLMUL-NEXT: pclmulqdq $1, %xmm2, %xmm3
+; SSE2-PCLMUL-NEXT: movd %eax, %xmm4
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
+; SSE2-PCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; SSE2-PCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,1,1]
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm1
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
+; SSE2-PCLMUL-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm4[0],xmm1[1],xmm4[1]
+; SSE2-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm3[0]
+; SSE2-PCLMUL-NEXT: psrad $16, %xmm1
+; SSE2-PCLMUL-NEXT: psrad $16, %xmm0
+; SSE2-PCLMUL-NEXT: packssdw %xmm1, %xmm0
+; SSE2-PCLMUL-NEXT: retq
+;
+; SSE42-LABEL: clmulh_v8i16_allones:
+; SSE42: # %bb.0:
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; SSE42-NEXT: movq %rax, %xmm2
+; SSE42-NEXT: pextrw $1, %xmm0, %eax
+; SSE42-NEXT: movd %eax, %xmm3
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-NEXT: pextrw $0, %xmm0, %eax
+; SSE42-NEXT: movd %eax, %xmm0
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm0
+; SSE42-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
+; SSE42-NEXT: pextrw $2, %xmm1, %eax
+; SSE42-NEXT: movd %eax, %xmm3
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-NEXT: movq %xmm3, %rax
+; SSE42-NEXT: pinsrd $2, %eax, %xmm0
+; SSE42-NEXT: pextrw $3, %xmm1, %eax
+; SSE42-NEXT: movd %eax, %xmm3
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-NEXT: movq %xmm3, %rax
+; SSE42-NEXT: pinsrd $3, %eax, %xmm0
+; SSE42-NEXT: pextrw $5, %xmm1, %eax
+; SSE42-NEXT: movd %eax, %xmm3
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-NEXT: pextrw $4, %xmm1, %eax
+; SSE42-NEXT: movd %eax, %xmm4
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm4
+; SSE42-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
+; SSE42-NEXT: pextrw $6, %xmm1, %eax
+; SSE42-NEXT: movd %eax, %xmm3
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-NEXT: movq %xmm3, %rax
+; SSE42-NEXT: pinsrd $2, %eax, %xmm4
+; SSE42-NEXT: pextrw $7, %xmm1, %eax
+; SSE42-NEXT: movd %eax, %xmm1
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm1
+; SSE42-NEXT: movq %xmm1, %rax
+; SSE42-NEXT: pinsrd $3, %eax, %xmm4
+; SSE42-NEXT: psrld $16, %xmm4
+; SSE42-NEXT: psrld $16, %xmm0
+; SSE42-NEXT: packusdw %xmm4, %xmm0
+; SSE42-NEXT: retq
+;
+; AVX2-LABEL: clmulh_v8i16_allones:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; AVX2-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; AVX2-NEXT: vmovq %rax, %xmm1
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[1,1,1,1]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX2-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX2-NEXT: vpclmulqdq $1, %xmm1, %xmm2, %xmm4
+; AVX2-NEXT: vmovq %xmm4, %rax
+; AVX2-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[3,3,3,3]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm2
+; AVX2-NEXT: vmovq %xmm2, %rax
+; AVX2-NEXT: vpinsrd $3, %eax, %xmm3, %xmm2
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,1,1]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX2-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX2-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm4
+; AVX2-NEXT: vmovq %xmm4, %rax
+; AVX2-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vmovq %xmm0, %rax
+; AVX2-NEXT: vpinsrd $3, %eax, %xmm3, %xmm0
+; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
+; AVX2-NEXT: vpsrld $16, %ymm0, %ymm0
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: clmulh_v8i16_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; AVX512-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; AVX512-NEXT: vmovq %rax, %xmm1
+; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm2
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm2[1,1,1,1]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX512-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX512-NEXT: vpclmulqdq $1, %xmm1, %xmm2, %xmm4
+; AVX512-NEXT: vmovq %xmm4, %rax
+; AVX512-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[3,3,3,3]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm2, %xmm2
+; AVX512-NEXT: vmovq %xmm2, %rax
+; AVX512-NEXT: vpinsrd $3, %eax, %xmm3, %xmm2
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm4 = xmm0[1,1,1,1]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm4, %xmm4
+; AVX512-NEXT: vpunpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
+; AVX512-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm4
+; AVX512-NEXT: vmovq %xmm4, %rax
+; AVX512-NEXT: vpinsrd $2, %eax, %xmm3, %xmm3
+; AVX512-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,3,3,3]
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: vpinsrd $3, %eax, %xmm3, %xmm0
+; AVX512-NEXT: vinserti128 $1, %xmm2, %ymm0, %ymm0
+; AVX512-NEXT: vpsrld $16, %ymm0, %ymm0
+; AVX512-NEXT: vpmovdw %ymm0, %xmm0
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
+; SSE42-PCLMUL-LABEL: clmulh_v8i16_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; 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, %xmm0
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
+; SSE42-PCLMUL-NEXT: pextrw $2, %xmm1, %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, %xmm0
+; SSE42-PCLMUL-NEXT: pextrw $3, %xmm1, %eax
+; SSE42-PCLMUL-NEXT: movd %eax, %xmm3
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-PCLMUL-NEXT: movq %xmm3, %rax
+; SSE42-PCLMUL-NEXT: pinsrd $3, %eax, %xmm0
+; SSE42-PCLMUL-NEXT: pextrw $5, %xmm1, %eax
+; SSE42-PCLMUL-NEXT: movd %eax, %xmm3
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-PCLMUL-NEXT: pextrw $4, %xmm1, %eax
+; SSE42-PCLMUL-NEXT: movd %eax, %xmm4
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
+; SSE42-PCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
+; SSE42-PCLMUL-NEXT: pextrw $6, %xmm1, %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, %xmm4
+; SSE42-PCLMUL-NEXT: pextrw $7, %xmm1, %eax
+; SSE42-PCLMUL-NEXT: movd %eax, %xmm1
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm1
+; SSE42-PCLMUL-NEXT: movq %xmm1, %rax
+; SSE42-PCLMUL-NEXT: pinsrd $3, %eax, %xmm4
+; SSE42-PCLMUL-NEXT: psrld $16, %xmm4
+; SSE42-PCLMUL-NEXT: psrld $16, %xmm0
+; SSE42-PCLMUL-NEXT: packusdw %xmm4, %xmm0
+; SSE42-PCLMUL-NEXT: retq
+ %x.ext = zext <8 x i16> %x to <8 x i32>
+ %clmul = call <8 x i32> @llvm.clmul.v8i32(<8 x i32> %x.ext, <8 x i32> <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>)
+ %res.ext = lshr <8 x i32> %clmul, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
+ %res = trunc <8 x i32> %res.ext to <8 x i16>
+ ret <8 x i16> %res
+}
+
+define <4 x i32> @clmulh_v4i32_allones(<4 x i32> %x) nounwind {
+; SCALAR-LABEL: clmulh_v4i32_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: pxor %xmm1, %xmm1
+; SCALAR-NEXT: movdqa %xmm0, %xmm2
+; SCALAR-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
+; SCALAR-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddq %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm0, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm0
+; SCALAR-NEXT: psllq $2, %xmm0
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $4, %xmm1
+; SCALAR-NEXT: pxor %xmm0, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm0
+; SCALAR-NEXT: psllq $8, %xmm0
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $16, %xmm1
+; SCALAR-NEXT: pxor %xmm0, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm3
+; SCALAR-NEXT: psllq $32, %xmm3
+; SCALAR-NEXT: pxor %xmm1, %xmm3
+; SCALAR-NEXT: movdqa %xmm2, %xmm0
+; SCALAR-NEXT: paddq %xmm0, %xmm0
+; SCALAR-NEXT: pxor %xmm2, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $2, %xmm1
+; SCALAR-NEXT: pxor %xmm0, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm0
+; SCALAR-NEXT: psllq $4, %xmm0
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: psllq $8, %xmm1
+; SCALAR-NEXT: pxor %xmm0, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: psllq $16, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: movdqa %xmm2, %xmm0
+; SCALAR-NEXT: psllq $32, %xmm0
+; SCALAR-NEXT: pxor %xmm2, %xmm0
+; SCALAR-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[1,3]
+; SCALAR-NEXT: retq
+;
+; SSE2-NOPCLMUL-LABEL: clmulh_v4i32_allones:
+; SSE2-NOPCLMUL: # %bb.0:
+; SSE2-NOPCLMUL-NEXT: subq $200, %rsp
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2,2]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4,4]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [8,8]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,16]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [32,32]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [64,64]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [128,128]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, (%rsp) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [256,256]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [512,512]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [1024,1024]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2048,2048]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [4096,4096]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [8192,8192]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [16384,16384]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [32768,32768]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [65536,65536]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [131072,131072]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm15
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm15 # [262144,262144]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm14
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm14 # [524288,524288]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm13
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm13 # [1048576,1048576]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm12
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12 # [2097152,2097152]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4194304,4194304]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm11
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11 # [8388608,8388608]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm10
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm10 # [16777216,16777216]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm9
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm9 # [33554432,33554432]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm8
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm8 # [67108864,67108864]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm7
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7 # [134217728,134217728]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm6
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6 # [268435456,268435456]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [536870912,536870912]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [1073741824,1073741824]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [2147483648,2147483648]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm0
+; SSE2-NOPCLMUL-NEXT: punpckhdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
+; SSE2-NOPCLMUL-NEXT: # xmm0 = xmm0[2],mem[2],xmm0[3],mem[3]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa (%rsp), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm15
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm15
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm14
+; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm14
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm13
+; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm13
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm12
+; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm12
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm12
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm11
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm11
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm10
+; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm10
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm9
+; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm9
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm8
+; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm8
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm7
+; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm7
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm6
+; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm6
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm4
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm5
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm0
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [2,2]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [4,4]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [8,8]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm5
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16,16]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm12 = [32,32]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm12
+; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [64,64]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm7
+; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [128,128]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm9 = [256,256]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm9
+; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm10 = [512,512]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm10
+; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm11 = [1024,1024]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm11
+; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2048,2048]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [4096,4096]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm14 = [8192,8192]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm14
+; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm15 = [16384,16384]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm15
+; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [32768,32768]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [65536,65536]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [131072,131072]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [262144,262144]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [524288,524288]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [1048576,1048576]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2097152,2097152]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm6 = [4194304,4194304]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [8388608,8388608]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm6, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [16777216,16777216]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, (%rsp) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [33554432,33554432]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [67108864,67108864]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [134217728,134217728]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [268435456,268435456]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [536870912,536870912]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm13 = [1073741824,1073741824]
+; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm13
+; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [2147483648,2147483648]
+; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm8
+; SSE2-NOPCLMUL-NEXT: punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Folded Reload
+; SSE2-NOPCLMUL-NEXT: # xmm8 = xmm8[0],mem[0],xmm8[1],mem[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm8
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm5
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm5
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm12
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm7
+; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm7
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm9
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm9
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm10
+; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm10
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm11
+; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm11
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm14
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm15
+; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm15
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm6
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa (%rsp), %xmm4 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
+; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
+; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm13
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm13
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: shufps $221, {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload
+; SSE2-NOPCLMUL-NEXT: # xmm2 = xmm2[1,3],mem[1,3]
+; SSE2-NOPCLMUL-NEXT: movaps %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: addq $200, %rsp
+; SSE2-NOPCLMUL-NEXT: retq
+;
+; SSE2-PCLMUL-LABEL: clmulh_v4i32_allones:
+; SSE2-PCLMUL: # %bb.0:
+; SSE2-PCLMUL-NEXT: xorps %xmm1, %xmm1
+; SSE2-PCLMUL-NEXT: movaps %xmm0, %xmm2
+; SSE2-PCLMUL-NEXT: unpckhps {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
+; SSE2-PCLMUL-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
+; SSE2-PCLMUL-NEXT: movq $-1, %rax
+; SSE2-PCLMUL-NEXT: movq %rax, %xmm3
+; SSE2-PCLMUL-NEXT: movaps %xmm0, %xmm4
+; SSE2-PCLMUL-NEXT: psrldq {{.*#+}} xmm4 = xmm4[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm3, %xmm4
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm3, %xmm2
+; SSE2-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm4[0]
+; SSE2-PCLMUL-NEXT: psrlq $32, %xmm0
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm3, %xmm0
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm3, %xmm1
+; SSE2-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
+; SSE2-PCLMUL-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm2[1,3]
+; SSE2-PCLMUL-NEXT: movaps %xmm1, %xmm0
+; SSE2-PCLMUL-NEXT: retq
+;
+; SSE42-LABEL: clmulh_v4i32_allones:
+; SSE42: # %bb.0:
+; SSE42-NEXT: movq $-1, %rax
+; SSE42-NEXT: movq %rax, %xmm2
+; SSE42-NEXT: movdqa %xmm0, %xmm3
+; SSE42-NEXT: psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-NEXT: pxor %xmm1, %xmm1
+; SSE42-NEXT: movdqa %xmm0, %xmm4
+; SSE42-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm1[2],xmm4[3],xmm1[3]
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm4
+; SSE42-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm3[0]
+; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
+; SSE42-NEXT: psrlq $32, %xmm0
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm0
+; SSE42-NEXT: pclmulqdq $0, %xmm2, %xmm1
+; SSE42-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
+; SSE42-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm4[1,3]
+; SSE42-NEXT: movaps %xmm1, %xmm0
+; SSE42-NEXT: retq
+;
+; AVX512-LABEL: clmulh_v4i32_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
+; AVX512-NEXT: movq $-1, %rax
+; AVX512-NEXT: vpbroadcastq %rax, %ymm1
+; AVX512-NEXT: vpclmulqdq $1, %ymm1, %ymm0, %ymm2
+; AVX512-NEXT: vpclmulqdq $0, %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vpunpcklqdq {{.*#+}} ymm0 = ymm0[0],ymm2[0],ymm0[2],ymm2[2]
+; AVX512-NEXT: vpsrlq $32, %ymm0, %ymm0
+; AVX512-NEXT: vpmovqd %ymm0, %xmm0
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
+; SSE42-PCLMUL-LABEL: clmulh_v4i32_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: movq $-1, %rax
+; SSE42-PCLMUL-NEXT: movq %rax, %xmm2
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm3
+; SSE42-PCLMUL-NEXT: psrldq {{.*#+}} xmm3 = xmm3[12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm3
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm4
+; SSE42-PCLMUL-NEXT: punpckhdq {{.*#+}} xmm4 = xmm4[2],xmm1[2],xmm4[3],xmm1[3]
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm4
+; SSE42-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm4 = xmm4[0],xmm3[0]
+; SSE42-PCLMUL-NEXT: pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
+; SSE42-PCLMUL-NEXT: psrlq $32, %xmm0
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm2, %xmm1
+; SSE42-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
+; SSE42-PCLMUL-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3],xmm4[1,3]
+; SSE42-PCLMUL-NEXT: movaps %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: retq
+ %x.ext = zext <4 x i32> %x to <4 x i64>
+ %clmul = call <4 x i64> @llvm.clmul.v4i64(<4 x i64> %x.ext, <4 x i64> <i64 -1, i64 -1, i64 -1, i64 -1>)
+ %res.ext = lshr <4 x i64> %clmul, <i64 32, i64 32, i64 32, i64 32>
+ %res = trunc <4 x i64> %res.ext to <4 x i32>
+ ret <4 x i32> %res
+}
+
+define <2 x i64> @clmulh_v2i64_allones(<2 x i64> %x) nounwind {
+; SCALAR-LABEL: clmulh_v2i64_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; SCALAR-NEXT: movq %xmm1, %rax
+; SCALAR-NEXT: movq %xmm0, %rsi
+; SCALAR-NEXT: leaq (%rsi,%rsi), %r8
+; SCALAR-NEXT: xorq %rsi, %r8
+; SCALAR-NEXT: bswapq %rsi
+; SCALAR-NEXT: movq %rsi, %rcx
+; SCALAR-NEXT: shrq $4, %rcx
+; SCALAR-NEXT: movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F
+; SCALAR-NEXT: andq %rdx, %rcx
+; SCALAR-NEXT: andq %rdx, %rsi
+; SCALAR-NEXT: shlq $4, %rsi
+; SCALAR-NEXT: orq %rcx, %rsi
+; SCALAR-NEXT: movabsq $3689348814741910323, %rcx # imm = 0x3333333333333333
+; SCALAR-NEXT: movq %rsi, %rdi
+; SCALAR-NEXT: andq %rcx, %rdi
+; SCALAR-NEXT: shrq $2, %rsi
+; SCALAR-NEXT: andq %rcx, %rsi
+; SCALAR-NEXT: leaq (%rsi,%rdi,4), %rdi
+; SCALAR-NEXT: movabsq $6148914691236517205, %rsi # imm = 0x5555555555555555
+; SCALAR-NEXT: movq %rdi, %r9
+; SCALAR-NEXT: andq %rsi, %r9
+; SCALAR-NEXT: shrq %rdi
+; SCALAR-NEXT: andq %rsi, %rdi
+; SCALAR-NEXT: leaq (%rdi,%r9,2), %rdi
+; SCALAR-NEXT: leaq (%rdi,%rdi), %r9
+; SCALAR-NEXT: xorq %rdi, %r9
+; SCALAR-NEXT: leaq (,%r9,4), %rdi
+; SCALAR-NEXT: xorq %r9, %rdi
+; SCALAR-NEXT: movq %rdi, %r9
+; SCALAR-NEXT: shlq $4, %r9
+; SCALAR-NEXT: xorq %rdi, %r9
+; SCALAR-NEXT: movq %r9, %rdi
+; SCALAR-NEXT: shlq $8, %rdi
+; SCALAR-NEXT: xorq %r9, %rdi
+; SCALAR-NEXT: movq %rdi, %r9
+; SCALAR-NEXT: shlq $16, %r9
+; SCALAR-NEXT: xorq %rdi, %r9
+; SCALAR-NEXT: movq %r9, %rdi
+; SCALAR-NEXT: shlq $32, %rdi
+; SCALAR-NEXT: xorq %r9, %rdi
+; SCALAR-NEXT: bswapq %rdi
+; SCALAR-NEXT: movq %rdi, %r9
+; SCALAR-NEXT: shrq $4, %r9
+; SCALAR-NEXT: andq %rdx, %r9
+; SCALAR-NEXT: andq %rdx, %rdi
+; SCALAR-NEXT: shlq $4, %rdi
+; SCALAR-NEXT: orq %r9, %rdi
+; SCALAR-NEXT: movq %rdi, %r9
+; SCALAR-NEXT: andq %rcx, %r9
+; SCALAR-NEXT: shrq $2, %rdi
+; SCALAR-NEXT: andq %rcx, %rdi
+; SCALAR-NEXT: leaq (%rdi,%r9,4), %rdi
+; SCALAR-NEXT: movq %rdi, %r10
+; SCALAR-NEXT: andq %rsi, %r10
+; SCALAR-NEXT: shrq %rdi
+; SCALAR-NEXT: movabsq $6148914691236517204, %r9 # imm = 0x5555555555555554
+; SCALAR-NEXT: andq %r9, %rdi
+; SCALAR-NEXT: leaq (%rdi,%r10,2), %rdi
+; SCALAR-NEXT: shrq %rdi
+; SCALAR-NEXT: leaq (,%r8,4), %r10
+; SCALAR-NEXT: xorq %r8, %r10
+; SCALAR-NEXT: movq %r10, %r8
+; SCALAR-NEXT: shlq $4, %r8
+; SCALAR-NEXT: xorq %r10, %r8
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $8, %r10
+; SCALAR-NEXT: xorq %r8, %r10
+; SCALAR-NEXT: movq %r10, %r11
+; SCALAR-NEXT: shlq $16, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r11, %r8
+; SCALAR-NEXT: shlq $32, %r8
+; SCALAR-NEXT: xorq %r11, %r8
+; SCALAR-NEXT: xorq %r8, %rdi
+; SCALAR-NEXT: leaq (%rax,%rax), %r10
+; SCALAR-NEXT: xorq %rax, %r10
+; SCALAR-NEXT: bswapq %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: shrq $4, %r11
+; SCALAR-NEXT: andq %rdx, %r11
+; SCALAR-NEXT: andq %rdx, %rax
+; SCALAR-NEXT: shlq $4, %rax
+; SCALAR-NEXT: orq %r11, %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: andq %rcx, %r11
+; SCALAR-NEXT: shrq $2, %rax
+; SCALAR-NEXT: andq %rcx, %rax
+; SCALAR-NEXT: leaq (%rax,%r11,4), %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: andq %rsi, %r11
+; SCALAR-NEXT: shrq %rax
+; SCALAR-NEXT: andq %rsi, %rax
+; SCALAR-NEXT: leaq (%rax,%r11,2), %rax
+; SCALAR-NEXT: leaq (%rax,%rax), %r11
+; SCALAR-NEXT: xorq %rax, %r11
+; SCALAR-NEXT: leaq (,%r11,4), %rax
+; SCALAR-NEXT: xorq %r11, %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: shlq $4, %r11
+; SCALAR-NEXT: xorq %rax, %r11
+; SCALAR-NEXT: movq %r11, %rax
+; SCALAR-NEXT: shlq $8, %rax
+; SCALAR-NEXT: xorq %r11, %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: shlq $16, %r11
+; SCALAR-NEXT: xorq %rax, %r11
+; SCALAR-NEXT: movq %r11, %rax
+; SCALAR-NEXT: shlq $32, %rax
+; SCALAR-NEXT: xorq %r11, %rax
+; SCALAR-NEXT: bswapq %rax
+; SCALAR-NEXT: movq %rax, %r11
+; SCALAR-NEXT: shrq $4, %r11
+; SCALAR-NEXT: andq %rdx, %r11
+; SCALAR-NEXT: andq %rdx, %rax
+; SCALAR-NEXT: shlq $4, %rax
+; SCALAR-NEXT: orq %r11, %rax
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: andq %rcx, %rdx
+; SCALAR-NEXT: shrq $2, %rax
+; SCALAR-NEXT: andq %rcx, %rax
+; SCALAR-NEXT: leaq (%rax,%rdx,4), %rax
+; SCALAR-NEXT: andq %rax, %rsi
+; SCALAR-NEXT: shrq %rax
+; SCALAR-NEXT: andq %r9, %rax
+; SCALAR-NEXT: leaq (%rax,%rsi,2), %rax
+; SCALAR-NEXT: shrq %rax
+; SCALAR-NEXT: leaq (,%r10,4), %rcx
+; SCALAR-NEXT: xorq %r10, %rcx
+; SCALAR-NEXT: movq %rcx, %rdx
+; SCALAR-NEXT: shlq $4, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdx, %rcx
+; SCALAR-NEXT: shlq $8, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rcx, %rdx
+; SCALAR-NEXT: shlq $16, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdx, %rcx
+; SCALAR-NEXT: shlq $32, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: shldq $1, %rcx, %rax
+; SCALAR-NEXT: shldq $1, %r8, %rdi
+; SCALAR-NEXT: movq %rdi, %xmm0
+; SCALAR-NEXT: movq %rax, %xmm1
+; SCALAR-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SCALAR-NEXT: retq
+;
+; SSE2-NOPCLMUL-LABEL: clmulh_v2i64_allones:
+; SSE2-NOPCLMUL: # %bb.0:
+; SSE2-NOPCLMUL-NEXT: pushq %r15
+; SSE2-NOPCLMUL-NEXT: pushq %r14
+; SSE2-NOPCLMUL-NEXT: pushq %r13
+; SSE2-NOPCLMUL-NEXT: pushq %r12
+; SSE2-NOPCLMUL-NEXT: pushq %rbx
+; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; SSE2-NOPCLMUL-NEXT: movq %xmm1, %rax
+; SSE2-NOPCLMUL-NEXT: movq %xmm0, %rcx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rsi
+; SSE2-NOPCLMUL-NEXT: bswapq %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rsi, %rdx
+; SSE2-NOPCLMUL-NEXT: shrq $4, %rdx
+; SSE2-NOPCLMUL-NEXT: movabsq $1085102592571150095, %rdi # imm = 0xF0F0F0F0F0F0F0F
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %rdx
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rsi
+; SSE2-NOPCLMUL-NEXT: orq %rdx, %rsi
+; SSE2-NOPCLMUL-NEXT: movabsq $3689348814741910323, %rdx # imm = 0x3333333333333333
+; SSE2-NOPCLMUL-NEXT: movq %rsi, %r8
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r8
+; SSE2-NOPCLMUL-NEXT: shrq $2, %rsi
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rsi
+; SSE2-NOPCLMUL-NEXT: leaq (%rsi,%r8,4), %r8
+; SSE2-NOPCLMUL-NEXT: movabsq $6148914691236517205, %rsi # imm = 0x5555555555555555
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %r9
+; SSE2-NOPCLMUL-NEXT: shrq %r8
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r10
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: leaq (%r10,%r9,2), %r9
+; SSE2-NOPCLMUL-NEXT: leaq (%r9,%r9), %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: leaq (,%r9,4), %r11
+; SSE2-NOPCLMUL-NEXT: leaq (,%r9,8), %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $5, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $6, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $7, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $8, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $9, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $10, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $11, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $12, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $13, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $15, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $16, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $17, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $18, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $19, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $20, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $21, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $22, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $23, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $24, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $25, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $26, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $27, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $28, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $29, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $30, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $31, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $32, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $33, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $34, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $35, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $36, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $37, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $38, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $39, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $40, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $41, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $42, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $43, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $44, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $45, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $46, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $47, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $48, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $49, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $50, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $51, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $52, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $53, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $54, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $55, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $56, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $57, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $58, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $59, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $60, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $61, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $62, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $63, %r8
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r8
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r8
+; SSE2-NOPCLMUL-NEXT: bswapq %r8
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
+; SSE2-NOPCLMUL-NEXT: shrq $4, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %r8
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r8
+; SSE2-NOPCLMUL-NEXT: orq %r9, %r8
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r9
+; SSE2-NOPCLMUL-NEXT: shrq $2, %r8
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r8
+; SSE2-NOPCLMUL-NEXT: leaq (%r8,%r9,4), %r8
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %r9
+; SSE2-NOPCLMUL-NEXT: shrq %r8
+; SSE2-NOPCLMUL-NEXT: movabsq $6148914691236517204, %r10 # imm = 0x5555555555555554
+; SSE2-NOPCLMUL-NEXT: andq %r10, %r8
+; SSE2-NOPCLMUL-NEXT: leaq (%r8,%r9,2), %r8
+; SSE2-NOPCLMUL-NEXT: shrq %r8
+; SSE2-NOPCLMUL-NEXT: leaq (%rcx,%rcx), %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: leaq (,%rcx,4), %r11
+; SSE2-NOPCLMUL-NEXT: leaq (,%rcx,8), %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $5, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $6, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $7, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $8, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $9, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $10, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $11, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $12, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $13, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $15, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $16, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $17, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $18, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $19, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $20, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $21, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $22, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $23, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $24, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $25, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $26, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $27, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $28, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $29, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $30, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $31, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $32, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $33, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $34, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $35, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $36, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $37, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $38, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $39, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $40, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $41, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $42, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $43, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $44, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $45, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $46, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $47, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $48, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $49, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $50, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $51, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $52, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $53, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $54, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $55, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $56, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $57, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $58, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $59, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $60, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $61, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $62, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %r8
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: bswapq %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: shrq $4, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r11
+; SSE2-NOPCLMUL-NEXT: orq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rbx
+; SSE2-NOPCLMUL-NEXT: shrq $2, %r11
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r11
+; SSE2-NOPCLMUL-NEXT: leaq (%r11,%rbx,4), %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %rbx
+; SSE2-NOPCLMUL-NEXT: shrq %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %r14
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %r14
+; SSE2-NOPCLMUL-NEXT: leaq (%r14,%rbx,2), %rbx
+; SSE2-NOPCLMUL-NEXT: leaq (%rbx,%rbx), %r14
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: leaq (,%rbx,4), %r15
+; SSE2-NOPCLMUL-NEXT: leaq (,%rbx,8), %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $5, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $6, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $7, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $8, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $9, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $10, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $11, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $12, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $13, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $14, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $15, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $16, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $17, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $18, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $19, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
+; SSE2-NOPCLMUL-NEXT: shlq $20, %r13
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $21, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $22, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $23, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $24, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $25, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $26, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $27, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $28, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $29, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $30, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $31, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $32, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $33, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $34, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
+; SSE2-NOPCLMUL-NEXT: shlq $35, %r13
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $36, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $37, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $38, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $39, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $40, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $41, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $42, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $43, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $44, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $45, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $46, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $47, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $48, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $49, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $50, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $51, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $52, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $53, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
+; SSE2-NOPCLMUL-NEXT: shlq $54, %r13
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
+; SSE2-NOPCLMUL-NEXT: shlq $55, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $56, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $57, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $58, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $59, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
+; SSE2-NOPCLMUL-NEXT: shlq $60, %r14
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
+; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $61, %r12
+; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
+; SSE2-NOPCLMUL-NEXT: shlq $62, %rbx
+; SSE2-NOPCLMUL-NEXT: xorq %r12, %rbx
+; SSE2-NOPCLMUL-NEXT: shlq $63, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r15, %r11
+; SSE2-NOPCLMUL-NEXT: bswapq %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
+; SSE2-NOPCLMUL-NEXT: shrq $4, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %rbx
+; SSE2-NOPCLMUL-NEXT: andq %rdi, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r11
+; SSE2-NOPCLMUL-NEXT: orq %rbx, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rdi
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rdi
+; SSE2-NOPCLMUL-NEXT: shrq $2, %r11
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r11
+; SSE2-NOPCLMUL-NEXT: leaq (%r11,%rdi,4), %rdx
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rsi
+; SSE2-NOPCLMUL-NEXT: shrq %rdx
+; SSE2-NOPCLMUL-NEXT: andq %r10, %rdx
+; SSE2-NOPCLMUL-NEXT: leaq (%rdx,%rsi,2), %rdx
+; SSE2-NOPCLMUL-NEXT: shrq %rdx
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rax), %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: leaq (,%rax,4), %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (,%rax,8), %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $5, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $6, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $7, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $8, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $9, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $10, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $11, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $12, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $13, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $14, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $15, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $16, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $17, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $18, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $19, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $20, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $21, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $22, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $23, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $24, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $25, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $26, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $27, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $28, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $29, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $30, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $31, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $32, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $33, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $34, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $35, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $36, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $37, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $38, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $39, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $40, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $41, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $42, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $43, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $44, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $45, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $46, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $47, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $48, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $49, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $50, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $51, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $52, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $53, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $54, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $55, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $56, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $57, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $58, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $59, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $60, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $61, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shlq $62, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdx
+; SSE2-NOPCLMUL-NEXT: shlq $63, %rcx
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rcx
+; SSE2-NOPCLMUL-NEXT: shrdq $63, %r8, %rcx
+; SSE2-NOPCLMUL-NEXT: shlq $63, %rax
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rax
+; SSE2-NOPCLMUL-NEXT: shrdq $63, %rdx, %rax
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %xmm0
+; SSE2-NOPCLMUL-NEXT: movq %rax, %xmm1
+; SSE2-NOPCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE2-NOPCLMUL-NEXT: popq %rbx
+; SSE2-NOPCLMUL-NEXT: popq %r12
+; SSE2-NOPCLMUL-NEXT: popq %r13
+; SSE2-NOPCLMUL-NEXT: popq %r14
+; SSE2-NOPCLMUL-NEXT: popq %r15
+; SSE2-NOPCLMUL-NEXT: retq
+;
+; SSE2-PCLMUL-LABEL: clmulh_v2i64_allones:
+; SSE2-PCLMUL: # %bb.0:
+; SSE2-PCLMUL-NEXT: movq $-1, %rax
+; SSE2-PCLMUL-NEXT: movq %rax, %xmm1
+; SSE2-PCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE2-PCLMUL-NEXT: pclmulqdq $1, %xmm1, %xmm2
+; SSE2-PCLMUL-NEXT: movq %xmm2, %rax
+; SSE2-PCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[2,3,2,3]
+; SSE2-PCLMUL-NEXT: movq %xmm2, %rcx
+; SSE2-PCLMUL-NEXT: xorq %rax, %rcx
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm1, %xmm0
+; SSE2-PCLMUL-NEXT: movq %xmm0, %rdx
+; SSE2-PCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; SSE2-PCLMUL-NEXT: movq %xmm0, %rsi
+; SSE2-PCLMUL-NEXT: xorq %rdx, %rsi
+; SSE2-PCLMUL-NEXT: shldq $1, %rdx, %rsi
+; SSE2-PCLMUL-NEXT: shldq $1, %rax, %rcx
+; SSE2-PCLMUL-NEXT: movq %rcx, %xmm1
+; SSE2-PCLMUL-NEXT: movq %rsi, %xmm0
+; SSE2-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE2-PCLMUL-NEXT: retq
+;
+; SSE42-LABEL: clmulh_v2i64_allones:
+; SSE42: # %bb.0:
+; SSE42-NEXT: movq $-1, %rax
+; SSE42-NEXT: movq %rax, %xmm1
+; SSE42-NEXT: movdqa %xmm0, %xmm2
+; SSE42-NEXT: pclmulqdq $1, %xmm1, %xmm2
+; SSE42-NEXT: movq %xmm2, %rax
+; SSE42-NEXT: pextrq $1, %xmm2, %rcx
+; SSE42-NEXT: xorq %rax, %rcx
+; SSE42-NEXT: pclmulqdq $0, %xmm1, %xmm0
+; SSE42-NEXT: movq %xmm0, %rdx
+; SSE42-NEXT: pextrq $1, %xmm0, %rsi
+; SSE42-NEXT: xorq %rdx, %rsi
+; SSE42-NEXT: shldq $1, %rdx, %rsi
+; SSE42-NEXT: shldq $1, %rax, %rcx
+; SSE42-NEXT: movq %rcx, %xmm1
+; SSE42-NEXT: movq %rsi, %xmm0
+; SSE42-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE42-NEXT: retq
+;
+; AVX2-LABEL: clmulh_v2i64_allones:
+; AVX2: # %bb.0:
+; AVX2-NEXT: movq $-1, %rax
+; AVX2-NEXT: vmovq %rax, %xmm1
+; AVX2-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm2
+; AVX2-NEXT: vmovq %xmm2, %rax
+; AVX2-NEXT: vpextrq $1, %xmm2, %rcx
+; AVX2-NEXT: xorq %rax, %rcx
+; AVX2-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vmovq %xmm0, %rdx
+; AVX2-NEXT: vpextrq $1, %xmm0, %rsi
+; AVX2-NEXT: xorq %rdx, %rsi
+; AVX2-NEXT: shldq $1, %rdx, %rsi
+; AVX2-NEXT: shldq $1, %rax, %rcx
+; AVX2-NEXT: vmovq %rcx, %xmm0
+; AVX2-NEXT: vmovq %rsi, %xmm1
+; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: clmulh_v2i64_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: movq $-1, %rax
+; AVX512-NEXT: vmovq %rax, %xmm1
+; AVX512-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm2
+; AVX512-NEXT: vmovq %xmm2, %rax
+; AVX512-NEXT: vpextrq $1, %xmm2, %rcx
+; AVX512-NEXT: xorq %rax, %rcx
+; AVX512-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: vmovq %xmm0, %rdx
+; AVX512-NEXT: vpextrq $1, %xmm0, %rsi
+; AVX512-NEXT: xorq %rdx, %rsi
+; AVX512-NEXT: shldq $1, %rdx, %rsi
+; AVX512-NEXT: shldq $1, %rax, %rcx
+; AVX512-NEXT: vmovq %rcx, %xmm0
+; AVX512-NEXT: vmovq %rsi, %xmm1
+; AVX512-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
+; AVX512-NEXT: retq
+; SSE42-PCLMUL-LABEL: clmulh_v2i64_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: movq $-1, %rax
+; SSE42-PCLMUL-NEXT: movq %rax, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE42-PCLMUL-NEXT: pclmulqdq $1, %xmm1, %xmm2
+; SSE42-PCLMUL-NEXT: movq %xmm2, %rax
+; SSE42-PCLMUL-NEXT: pextrq $1, %xmm2, %rcx
+; SSE42-PCLMUL-NEXT: xorq %rax, %rcx
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: movq %xmm0, %rdx
+; SSE42-PCLMUL-NEXT: pextrq $1, %xmm0, %rsi
+; SSE42-PCLMUL-NEXT: xorq %rdx, %rsi
+; SSE42-PCLMUL-NEXT: shldq $1, %rdx, %rsi
+; SSE42-PCLMUL-NEXT: shldq $1, %rax, %rcx
+; SSE42-PCLMUL-NEXT: movq %rcx, %xmm1
+; SSE42-PCLMUL-NEXT: movq %rsi, %xmm0
+; SSE42-PCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
+; SSE42-PCLMUL-NEXT: retq
+; AVX-LABEL: clmulh_v2i64_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movq $-1, %rax
+; AVX-NEXT: vmovq %rax, %xmm1
+; AVX-NEXT: vpclmulqdq $1, %xmm1, %xmm0, %xmm2
+; AVX-NEXT: vmovq %xmm2, %rax
+; AVX-NEXT: vpextrq $1, %xmm2, %rcx
+; AVX-NEXT: xorq %rax, %rcx
+; AVX-NEXT: vpclmulqdq $0, %xmm1, %xmm0, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rdx
+; AVX-NEXT: vpextrq $1, %xmm0, %rsi
+; AVX-NEXT: xorq %rdx, %rsi
+; AVX-NEXT: shldq $1, %rdx, %rsi
+; AVX-NEXT: shldq $1, %rax, %rcx
+; AVX-NEXT: vmovq %rcx, %xmm0
+; AVX-NEXT: vmovq %rsi, %xmm1
+; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
+; AVX-NEXT: retq
+ %x.ext = zext <2 x i64> %x to <2 x i128>
+ %clmul = call <2 x i128> @llvm.clmul.v2i128(<2 x i128> %x.ext, <2 x i128> <i128 -1, i128 -1>)
+ %res.ext = lshr <2 x i128> %clmul, <i128 63, i128 63>
+ %res = trunc <2 x i128> %res.ext to <2 x i64>
+ ret <2 x i64> %res
+}
+
diff --git a/llvm/test/CodeGen/X86/clmul.ll b/llvm/test/CodeGen/X86/clmul.ll
index d8f522ae06e62..1a59ce2bb3ea0 100644
--- a/llvm/test/CodeGen/X86/clmul.ll
+++ b/llvm/test/CodeGen/X86/clmul.ll
@@ -3611,3 +3611,2555 @@ define void @mul_use_commutative_clmul_i8(i8 %x, i8 %y, ptr %p0, ptr %p1) nounwi
store i8 %yx, ptr %p1
ret void
}
+
+; Special case: clmul(X, ~0) / clmul(~0, X) expands to a parallel-prefix
+; XOR in O(log BW) shift-xor pairs rather than the O(BW) general fallback.
+
+define i8 @clmul_i8_allones(i8 %x) nounwind {
+; SCALAR-LABEL: clmul_i8_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
+; SCALAR-NEXT: leal (%rdi,%rdi), %eax
+; SCALAR-NEXT: xorb %dil, %al
+; SCALAR-NEXT: leal (,%rdi,4), %ecx
+; SCALAR-NEXT: leal (,%rdi,8), %edx
+; SCALAR-NEXT: xorb %cl, %dl
+; SCALAR-NEXT: xorb %al, %dl
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shlb $4, %al
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shlb $5, %cl
+; SCALAR-NEXT: xorb %al, %cl
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shlb $6, %al
+; SCALAR-NEXT: xorb %cl, %al
+; SCALAR-NEXT: xorb %dl, %al
+; SCALAR-NEXT: shlb $7, %dil
+; SCALAR-NEXT: xorb %dil, %al
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmul_i8_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movl $255, %eax
+; SSE-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE-PCLMUL-NEXT: movd %edi, %xmm1
+; SSE-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: movq %xmm1, %rax
+; SSE-PCLMUL-NEXT: # kill: def $al killed $al killed $rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmul_i8_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movl $255, %eax
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovd %edi, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rax
+; AVX-NEXT: # kill: def $al killed $al killed $rax
+; AVX-NEXT: retq
+ %r = call i8 @llvm.clmul.i8(i8 %x, i8 -1)
+ ret i8 %r
+}
+
+define i16 @clmul_i16_allones(i16 %x) nounwind {
+; SCALAR-LABEL: clmul_i16_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
+; SCALAR-NEXT: leal (%rdi,%rdi), %eax
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: leal (,%rdi,4), %ecx
+; SCALAR-NEXT: leal (,%rdi,8), %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $4, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $5, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $6, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $7, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $8, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $9, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $10, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $11, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $12, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %esi
+; SCALAR-NEXT: shll $13, %esi
+; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $14, %eax
+; SCALAR-NEXT: xorl %esi, %eax
+; SCALAR-NEXT: shll $15, %edi
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: # kill: def $ax killed $ax killed $eax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmul_i16_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movl $65535, %eax # imm = 0xFFFF
+; SSE-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE-PCLMUL-NEXT: movd %edi, %xmm1
+; SSE-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: movq %xmm1, %rax
+; SSE-PCLMUL-NEXT: # kill: def $ax killed $ax killed $rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmul_i16_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movl $65535, %eax # imm = 0xFFFF
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovd %edi, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rax
+; AVX-NEXT: # kill: def $ax killed $ax killed $rax
+; AVX-NEXT: retq
+ %r = call i16 @llvm.clmul.i16(i16 %x, i16 -1)
+ ret i16 %r
+}
+
+define i32 @clmul_i32_allones(i32 %x) nounwind {
+; SCALAR-LABEL: clmul_i32_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
+; SCALAR-NEXT: leal (%rdi,%rdi), %eax
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: leal (,%rdi,4), %ecx
+; SCALAR-NEXT: leal (,%rdi,8), %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $4, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $5, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $6, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $7, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $8, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $9, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $10, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $11, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $12, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $13, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $14, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %esi
+; SCALAR-NEXT: shll $15, %esi
+; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: xorl %edx, %esi
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $16, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $17, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $18, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $19, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $20, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $21, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: xorl %esi, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $22, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $23, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $24, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $25, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $26, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $27, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $28, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $29, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $30, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: shll $31, %edi
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmul_i32_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; SSE-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE-PCLMUL-NEXT: movd %edi, %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_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movl $4294967295, %eax # imm = 0xFFFFFFFF
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovd %edi, %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
+ %r = call i32 @llvm.clmul.i32(i32 %x, i32 -1)
+ ret i32 %r
+}
+
+define i64 @clmul_i64_allones(i64 %x) nounwind {
+; SCALAR-LABEL: clmul_i64_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: leaq (%rdi,%rdi), %rax
+; SCALAR-NEXT: xorq %rdi, %rax
+; SCALAR-NEXT: leaq (,%rdi,4), %rcx
+; SCALAR-NEXT: leaq (,%rdi,8), %rdx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $4, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $5, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $6, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $7, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $8, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $9, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $10, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $11, %rax
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $12, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $13, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $14, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $15, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $16, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $17, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $18, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $19, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $20, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $21, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $22, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $23, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $24, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $25, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $26, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $27, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $28, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $29, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $30, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $31, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $32, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $33, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $34, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $35, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $36, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $37, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $38, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $39, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $40, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $41, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $42, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $43, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $44, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $45, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $46, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $47, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $48, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $49, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $50, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $51, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $52, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $53, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $54, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $55, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $56, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $57, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $58, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $59, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $60, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $61, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $62, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: shlq $63, %rdi
+; SCALAR-NEXT: xorq %rdi, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmul_i64_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movq $-1, %rax
+; SSE-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE-PCLMUL-NEXT: movq %rdi, %xmm1
+; SSE-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: movq %xmm1, %rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmul_i64_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movq $-1, %rax
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovq %rdi, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rax
+; AVX-NEXT: retq
+ %r = call i64 @llvm.clmul.i64(i64 %x, i64 -1)
+ ret i64 %r
+}
+
+define i7 @clmul_i7_allones(i7 %x) nounwind {
+; SCALAR-LABEL: clmul_i7_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
+; SCALAR-NEXT: leal (%rdi,%rdi), %eax
+; SCALAR-NEXT: xorb %dil, %al
+; SCALAR-NEXT: leal (,%rdi,4), %ecx
+; SCALAR-NEXT: leal (,%rdi,8), %edx
+; SCALAR-NEXT: xorb %cl, %dl
+; SCALAR-NEXT: xorb %al, %dl
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shlb $4, %cl
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shlb $5, %al
+; SCALAR-NEXT: xorb %cl, %al
+; SCALAR-NEXT: shlb $6, %dil
+; SCALAR-NEXT: xorb %dil, %al
+; SCALAR-NEXT: xorb %dl, %al
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmul_i7_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movl $127, %eax
+; SSE-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE-PCLMUL-NEXT: movd %edi, %xmm1
+; SSE-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: movq %xmm1, %rax
+; SSE-PCLMUL-NEXT: # kill: def $al killed $al killed $rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmul_i7_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movl $127, %eax
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovd %edi, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rax
+; AVX-NEXT: # kill: def $al killed $al killed $rax
+; AVX-NEXT: retq
+ %r = call i7 @llvm.clmul.i7(i7 %x, i7 -1)
+ ret i7 %r
+}
+
+define i10 @clmul_i10_allones(i10 %x) nounwind {
+; SCALAR-LABEL: clmul_i10_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
+; SCALAR-NEXT: leal (%rdi,%rdi), %eax
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: leal (,%rdi,4), %ecx
+; SCALAR-NEXT: leal (,%rdi,8), %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $4, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $5, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %esi
+; SCALAR-NEXT: shll $6, %esi
+; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: xorl %edx, %esi
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $7, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $8, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: shll $9, %edi
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: xorl %esi, %eax
+; SCALAR-NEXT: # kill: def $ax killed $ax killed $eax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmul_i10_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movl $1023, %eax # imm = 0x3FF
+; SSE-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE-PCLMUL-NEXT: movd %edi, %xmm1
+; SSE-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: movq %xmm1, %rax
+; SSE-PCLMUL-NEXT: # kill: def $ax killed $ax killed $rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmul_i10_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movl $1023, %eax # imm = 0x3FF
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovd %edi, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rax
+; AVX-NEXT: # kill: def $ax killed $ax killed $rax
+; AVX-NEXT: retq
+ %r = call i10 @llvm.clmul.i10(i10 %x, i10 -1)
+ ret i10 %r
+}
+
+define i25 @clmul_i25_allones(i25 %x) nounwind {
+; SCALAR-LABEL: clmul_i25_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
+; SCALAR-NEXT: leal (%rdi,%rdi), %eax
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: leal (,%rdi,4), %ecx
+; SCALAR-NEXT: leal (,%rdi,8), %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $4, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $5, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $6, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $7, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $8, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $9, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $10, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $11, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $12, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $13, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $14, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $15, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $16, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $17, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $18, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $19, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $20, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $21, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $22, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $23, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: shll $24, %edi
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmul_i25_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movl $33554431, %eax # imm = 0x1FFFFFF
+; SSE-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE-PCLMUL-NEXT: movd %edi, %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_i25_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movl $33554431, %eax # imm = 0x1FFFFFF
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovd %edi, %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
+ %r = call i25 @llvm.clmul.i25(i25 %x, i25 -1)
+ ret i25 %r
+}
+
+define i44 @clmul_i44_allones(i44 %x) nounwind {
+; SCALAR-LABEL: clmul_i44_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: leaq (%rdi,%rdi), %rax
+; SCALAR-NEXT: xorq %rdi, %rax
+; SCALAR-NEXT: leaq (,%rdi,4), %rcx
+; SCALAR-NEXT: leaq (,%rdi,8), %rdx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $4, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $5, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $6, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $7, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $8, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $9, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $10, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $11, %rax
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $12, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $13, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $14, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $15, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $16, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $17, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $18, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $19, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $20, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $21, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $22, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $23, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $24, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $25, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $26, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $27, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $28, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $29, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $30, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $31, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $32, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $33, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $34, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $35, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rcx
+; SCALAR-NEXT: shlq $36, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $37, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $38, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $39, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $40, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $41, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $42, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: shlq $43, %rdi
+; SCALAR-NEXT: xorq %rdi, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmul_i44_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movabsq $17592186044415, %rax # imm = 0xFFFFFFFFFFF
+; SSE-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE-PCLMUL-NEXT: movq %rdi, %xmm1
+; SSE-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: movq %xmm1, %rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmul_i44_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movabsq $17592186044415, %rax # imm = 0xFFFFFFFFFFF
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovq %rdi, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rax
+; AVX-NEXT: retq
+ %r = call i44 @llvm.clmul.i44(i44 %x, i44 -1)
+ ret i44 %r
+}
+
+define i8 @clmulr_i8_allones(i8 %x) nounwind {
+; SCALAR-LABEL: clmulr_i8_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: movzbl %dil, %eax
+; SCALAR-NEXT: leal (%rax,%rax), %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: leal (,%rax,4), %edx
+; SCALAR-NEXT: leal (,%rax,8), %esi
+; SCALAR-NEXT: xorl %edx, %esi
+; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $4, %ecx
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $5, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $6, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: xorl %esi, %ecx
+; SCALAR-NEXT: shll $7, %eax
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $8, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $9, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $10, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $11, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $12, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $13, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: shll $14, %edi
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: shrl $7, %eax
+; SCALAR-NEXT: # kill: def $al killed $al killed $eax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmulr_i8_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movzbl %dil, %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: shrl $7, %eax
+; SSE-PCLMUL-NEXT: # kill: def $al killed $al killed $rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmulr_i8_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movzbl %dil, %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: shrl $7, %eax
+; AVX-NEXT: # kill: def $al killed $al killed $rax
+; AVX-NEXT: retq
+ %x.ext = zext i8 %x to i16
+ %clmul = call i16 @llvm.clmul.i16(i16 %x.ext, i16 -1)
+ %res.ext = lshr i16 %clmul, 7
+ %res = trunc i16 %res.ext to i8
+ ret i8 %res
+}
+
+define i16 @clmulr_i16_allones(i16 %x) nounwind {
+; SCALAR-LABEL: clmulr_i16_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: movzwl %di, %eax
+; SCALAR-NEXT: leal (%rax,%rax), %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: leal (,%rax,4), %edx
+; SCALAR-NEXT: leal (,%rax,8), %esi
+; SCALAR-NEXT: xorl %edx, %esi
+; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $4, %ecx
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $5, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $6, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: xorl %esi, %ecx
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $7, %edx
+; SCALAR-NEXT: movl %eax, %esi
+; SCALAR-NEXT: shll $8, %esi
+; SCALAR-NEXT: xorl %edx, %esi
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $9, %edx
+; SCALAR-NEXT: xorl %esi, %edx
+; SCALAR-NEXT: movl %eax, %esi
+; SCALAR-NEXT: shll $10, %esi
+; SCALAR-NEXT: xorl %edx, %esi
+; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $11, %ecx
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $12, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $13, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $14, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: shll $15, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: xorl %esi, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $16, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $17, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $18, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $19, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $20, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $21, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $22, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $23, %eax
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $24, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $25, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $26, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $27, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $28, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $29, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: shll $30, %edi
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: shrl $15, %eax
+; SCALAR-NEXT: # kill: def $ax killed $ax killed $eax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmulr_i16_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movzwl %di, %eax
+; SSE-PCLMUL-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF
+; 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: shrl $15, %eax
+; SSE-PCLMUL-NEXT: # kill: def $ax killed $ax killed $rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmulr_i16_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movzwl %di, %eax
+; AVX-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF
+; AVX-NEXT: vmovq %rcx, %xmm0
+; AVX-NEXT: vmovd %eax, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rax
+; AVX-NEXT: shrl $15, %eax
+; AVX-NEXT: # kill: def $ax killed $ax killed $rax
+; AVX-NEXT: retq
+ %x.ext = zext i16 %x to i32
+ %clmul = call i32 @llvm.clmul.i32(i32 %x.ext, i32 -1)
+ %res.ext = lshr i32 %clmul, 15
+ %res = trunc i32 %res.ext to i16
+ ret i16 %res
+}
+
+define i32 @clmulr_i32_allones(i32 %x) nounwind {
+; SCALAR-LABEL: clmulr_i32_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: leaq (%rax,%rax), %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: leaq (,%rax,4), %rdx
+; SCALAR-NEXT: leaq (,%rax,8), %rsi
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $4, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $5, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $6, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $7, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $8, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $9, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $10, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $11, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $12, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $13, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $14, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $15, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $16, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $17, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $18, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $19, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdi
+; SCALAR-NEXT: shlq $20, %rdi
+; SCALAR-NEXT: xorq %rsi, %rdi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $21, %rdx
+; SCALAR-NEXT: xorq %rdi, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $22, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $23, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $24, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $25, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $26, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $27, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $28, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $29, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $30, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $31, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $32, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $33, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $34, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdi
+; SCALAR-NEXT: shlq $35, %rdi
+; SCALAR-NEXT: xorq %rsi, %rdi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $36, %rdx
+; SCALAR-NEXT: xorq %rdi, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $37, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $38, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $39, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $40, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $41, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $42, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $43, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $44, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $45, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $46, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $47, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $48, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $49, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $50, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $51, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $52, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $53, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdi
+; SCALAR-NEXT: shlq $54, %rdi
+; SCALAR-NEXT: xorq %rsi, %rdi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $55, %rdx
+; SCALAR-NEXT: xorq %rdi, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $56, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $57, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $58, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $59, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $60, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $61, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: shlq $62, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: shrq $31, %rax
+; SCALAR-NEXT: # kill: def $eax killed $eax killed $rax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmulr_i32_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movq $-1, %rax
+; SSE-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE-PCLMUL-NEXT: movd %edi, %xmm1
+; SSE-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: movq %xmm1, %rax
+; SSE-PCLMUL-NEXT: shrq $31, %rax
+; SSE-PCLMUL-NEXT: # kill: def $eax killed $eax killed $rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmulr_i32_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movq $-1, %rax
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovd %edi, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rax
+; AVX-NEXT: shrq $31, %rax
+; AVX-NEXT: # kill: def $eax killed $eax killed $rax
+; AVX-NEXT: retq
+ %x.ext = zext i32 %x to i64
+ %clmul = call i64 @llvm.clmul.i64(i64 %x.ext, i64 -1)
+ %res.ext = lshr i64 %clmul, 31
+ %res = trunc i64 %res.ext to i32
+ ret i32 %res
+}
+
+define i64 @clmulr_i64_allones(i64 %x) nounwind {
+; SCALAR-LABEL: clmulr_i64_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: pushq %rbx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: bswapq %rax
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shrq $4, %rcx
+; SCALAR-NEXT: movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F
+; SCALAR-NEXT: andq %rdx, %rcx
+; SCALAR-NEXT: andq %rdx, %rax
+; SCALAR-NEXT: shlq $4, %rax
+; SCALAR-NEXT: orq %rcx, %rax
+; SCALAR-NEXT: movabsq $3689348814741910323, %rcx # imm = 0x3333333333333333
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: andq %rcx, %rsi
+; SCALAR-NEXT: shrq $2, %rax
+; SCALAR-NEXT: andq %rcx, %rax
+; SCALAR-NEXT: leaq (%rax,%rsi,4), %rsi
+; SCALAR-NEXT: movabsq $6148914691236517205, %rax # imm = 0x5555555555555555
+; SCALAR-NEXT: movq %rsi, %r8
+; SCALAR-NEXT: andq %rax, %r8
+; SCALAR-NEXT: shrq %rsi
+; SCALAR-NEXT: movq %rsi, %r9
+; SCALAR-NEXT: andq %rax, %r9
+; SCALAR-NEXT: leaq (%r9,%r8,2), %r8
+; SCALAR-NEXT: leaq (%r8,%r8), %r9
+; SCALAR-NEXT: xorq %r8, %r9
+; SCALAR-NEXT: leaq (,%r8,4), %r10
+; SCALAR-NEXT: leaq (,%r8,8), %r11
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $4, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $5, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $6, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: xorq %r10, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $7, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $8, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $9, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $10, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $11, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $12, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $13, %r9
+; SCALAR-NEXT: xorq %r10, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $14, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $15, %r9
+; SCALAR-NEXT: xorq %r10, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $16, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $17, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $18, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $19, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %rbx
+; SCALAR-NEXT: shlq $20, %rbx
+; SCALAR-NEXT: xorq %r11, %rbx
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $21, %r10
+; SCALAR-NEXT: xorq %rbx, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $22, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $23, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $24, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $25, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $26, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $27, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $28, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: xorq %r10, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $29, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $30, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $31, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $32, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $33, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $34, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %rbx
+; SCALAR-NEXT: shlq $35, %rbx
+; SCALAR-NEXT: xorq %r11, %rbx
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $36, %r10
+; SCALAR-NEXT: xorq %rbx, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $37, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $38, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $39, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $40, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $41, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $42, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $43, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $44, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $45, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: xorq %r10, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $46, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $47, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $48, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $49, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $50, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $51, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $52, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $53, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %rbx
+; SCALAR-NEXT: shlq $54, %rbx
+; SCALAR-NEXT: xorq %r11, %rbx
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $55, %r10
+; SCALAR-NEXT: xorq %rbx, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $56, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $57, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $58, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $59, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $60, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $61, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: shlq $62, %r8
+; SCALAR-NEXT: xorq %r11, %r8
+; SCALAR-NEXT: shlq $63, %rsi
+; SCALAR-NEXT: xorq %r8, %rsi
+; SCALAR-NEXT: xorq %r10, %rsi
+; SCALAR-NEXT: bswapq %rsi
+; SCALAR-NEXT: movq %rsi, %r8
+; SCALAR-NEXT: shrq $4, %r8
+; SCALAR-NEXT: andq %rdx, %r8
+; SCALAR-NEXT: andq %rdx, %rsi
+; SCALAR-NEXT: shlq $4, %rsi
+; SCALAR-NEXT: orq %r8, %rsi
+; SCALAR-NEXT: movq %rsi, %rdx
+; SCALAR-NEXT: andq %rcx, %rdx
+; SCALAR-NEXT: shrq $2, %rsi
+; SCALAR-NEXT: andq %rcx, %rsi
+; SCALAR-NEXT: leaq (%rsi,%rdx,4), %rcx
+; SCALAR-NEXT: andq %rcx, %rax
+; SCALAR-NEXT: shrq %rcx
+; SCALAR-NEXT: movabsq $6148914691236517204, %rdx # imm = 0x5555555555555554
+; SCALAR-NEXT: andq %rcx, %rdx
+; SCALAR-NEXT: leaq (%rdx,%rax,2), %rcx
+; SCALAR-NEXT: shrq %rcx
+; SCALAR-NEXT: leaq (%rdi,%rdi), %rax
+; SCALAR-NEXT: xorq %rdi, %rax
+; SCALAR-NEXT: leaq (,%rdi,4), %rdx
+; SCALAR-NEXT: leaq (,%rdi,8), %rsi
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $4, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $5, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $6, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $7, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $8, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $9, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $10, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $11, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $12, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $13, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $14, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $15, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $16, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $17, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $18, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $19, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %r8
+; SCALAR-NEXT: shlq $20, %r8
+; SCALAR-NEXT: xorq %rsi, %r8
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $21, %rdx
+; SCALAR-NEXT: xorq %r8, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $22, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $23, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $24, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $25, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $26, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $27, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $28, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $29, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $30, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $31, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $32, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $33, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $34, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %r8
+; SCALAR-NEXT: shlq $35, %r8
+; SCALAR-NEXT: xorq %rsi, %r8
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $36, %rdx
+; SCALAR-NEXT: xorq %r8, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $37, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $38, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $39, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $40, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $41, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $42, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $43, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $44, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $45, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $46, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $47, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $48, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $49, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $50, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $51, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $52, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $53, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %r8
+; SCALAR-NEXT: shlq $54, %r8
+; SCALAR-NEXT: xorq %rsi, %r8
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $55, %rdx
+; SCALAR-NEXT: xorq %r8, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $56, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $57, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $58, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $59, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $60, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $61, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $62, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: shlq $63, %rdi
+; SCALAR-NEXT: xorq %rdi, %rax
+; SCALAR-NEXT: shrdq $63, %rcx, %rax
+; SCALAR-NEXT: popq %rbx
+; SCALAR-NEXT: retq
+;
+; SSE2-PCLMUL-LABEL: clmulr_i64_allones:
+; SSE2-PCLMUL: # %bb.0:
+; SSE2-PCLMUL-NEXT: movq $-1, %rax
+; SSE2-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE2-PCLMUL-NEXT: movq %rdi, %xmm1
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE2-PCLMUL-NEXT: movq %xmm1, %rcx
+; SSE2-PCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; SSE2-PCLMUL-NEXT: movq %xmm0, %rax
+; SSE2-PCLMUL-NEXT: xorq %rcx, %rax
+; SSE2-PCLMUL-NEXT: shldq $1, %rcx, %rax
+; SSE2-PCLMUL-NEXT: retq
+;
+; SSE42-PCLMUL-LABEL: clmulr_i64_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: movq $-1, %rax
+; SSE42-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE42-PCLMUL-NEXT: movq %rdi, %xmm1
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movq %xmm1, %rcx
+; SSE42-PCLMUL-NEXT: pextrq $1, %xmm1, %rax
+; SSE42-PCLMUL-NEXT: xorq %rcx, %rax
+; SSE42-PCLMUL-NEXT: shldq $1, %rcx, %rax
+; SSE42-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmulr_i64_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movq $-1, %rax
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovq %rdi, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rcx
+; AVX-NEXT: vpextrq $1, %xmm0, %rax
+; AVX-NEXT: xorq %rcx, %rax
+; AVX-NEXT: shldq $1, %rcx, %rax
+; AVX-NEXT: retq
+ %x.ext = zext i64 %x to i128
+ %clmul = call i128 @llvm.clmul.i128(i128 %x.ext, i128 -1)
+ %res.ext = lshr i128 %clmul, 63
+ %res = trunc i128 %res.ext to i64
+ ret i64 %res
+}
+
+define i8 @clmulh_i8_allones(i8 %x) nounwind {
+; SCALAR-LABEL: clmulh_i8_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: movzbl %dil, %eax
+; SCALAR-NEXT: leal (%rax,%rax), %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: leal (,%rax,4), %edx
+; SCALAR-NEXT: leal (,%rax,8), %esi
+; SCALAR-NEXT: xorl %edx, %esi
+; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $4, %ecx
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $5, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $6, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: xorl %esi, %ecx
+; SCALAR-NEXT: shll $7, %eax
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $8, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $9, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $10, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $11, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $12, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %esi
+; SCALAR-NEXT: shll $13, %esi
+; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $14, %eax
+; SCALAR-NEXT: xorl %esi, %eax
+; SCALAR-NEXT: shll $15, %edi
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: shrl $8, %eax
+; SCALAR-NEXT: # kill: def $al killed $al killed $eax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmulh_i8_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movzbl %dil, %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: shrl $8, %eax
+; SSE-PCLMUL-NEXT: # kill: def $al killed $al killed $rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmulh_i8_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movzbl %dil, %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: shrl $8, %eax
+; AVX-NEXT: # kill: def $al killed $al killed $rax
+; AVX-NEXT: retq
+ %x.ext = zext i8 %x to i16
+ %clmul = call i16 @llvm.clmul.i16(i16 %x.ext, i16 -1)
+ %res.ext = lshr i16 %clmul, 8
+ %res = trunc i16 %res.ext to i8
+ ret i8 %res
+}
+
+define i16 @clmulh_i16_allones(i16 %x) nounwind {
+; SCALAR-LABEL: clmulh_i16_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: movzwl %di, %eax
+; SCALAR-NEXT: leal (%rax,%rax), %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: leal (,%rax,4), %edx
+; SCALAR-NEXT: leal (,%rax,8), %esi
+; SCALAR-NEXT: xorl %edx, %esi
+; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $4, %ecx
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $5, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $6, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: xorl %esi, %ecx
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $7, %edx
+; SCALAR-NEXT: movl %eax, %esi
+; SCALAR-NEXT: shll $8, %esi
+; SCALAR-NEXT: xorl %edx, %esi
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $9, %edx
+; SCALAR-NEXT: xorl %esi, %edx
+; SCALAR-NEXT: movl %eax, %esi
+; SCALAR-NEXT: shll $10, %esi
+; SCALAR-NEXT: xorl %edx, %esi
+; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $11, %ecx
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $12, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $13, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %eax, %edx
+; SCALAR-NEXT: shll $14, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: shll $15, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: xorl %esi, %eax
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $16, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $17, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $18, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $19, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $20, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $21, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edi, %ecx
+; SCALAR-NEXT: shll $22, %ecx
+; SCALAR-NEXT: xorl %edx, %ecx
+; SCALAR-NEXT: xorl %eax, %ecx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $23, %eax
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $24, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $25, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $26, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $27, %eax
+; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: movl %edi, %edx
+; SCALAR-NEXT: shll $28, %edx
+; SCALAR-NEXT: xorl %eax, %edx
+; SCALAR-NEXT: movl %edi, %esi
+; SCALAR-NEXT: shll $29, %esi
+; SCALAR-NEXT: xorl %edx, %esi
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: shll $30, %eax
+; SCALAR-NEXT: xorl %esi, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
+; SCALAR-NEXT: shll $31, %edi
+; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: shrl $16, %eax
+; SCALAR-NEXT: # kill: def $ax killed $ax killed $eax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmulh_i16_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movzwl %di, %eax
+; SSE-PCLMUL-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF
+; 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: shrl $16, %eax
+; SSE-PCLMUL-NEXT: # kill: def $ax killed $ax killed $rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmulh_i16_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movzwl %di, %eax
+; AVX-NEXT: movl $4294967295, %ecx # imm = 0xFFFFFFFF
+; AVX-NEXT: vmovq %rcx, %xmm0
+; AVX-NEXT: vmovd %eax, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rax
+; AVX-NEXT: shrl $16, %eax
+; AVX-NEXT: # kill: def $ax killed $ax killed $rax
+; AVX-NEXT: retq
+ %x.ext = zext i16 %x to i32
+ %clmul = call i32 @llvm.clmul.i32(i32 %x.ext, i32 -1)
+ %res.ext = lshr i32 %clmul, 16
+ %res = trunc i32 %res.ext to i16
+ ret i16 %res
+}
+
+define i32 @clmulh_i32_allones(i32 %x) nounwind {
+; SCALAR-LABEL: clmulh_i32_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: leaq (%rax,%rax), %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: leaq (,%rax,4), %rdx
+; SCALAR-NEXT: leaq (,%rax,8), %rsi
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $4, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $5, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $6, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $7, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $8, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $9, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $10, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $11, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $12, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $13, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $14, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $15, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $16, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $17, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $18, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $19, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdi
+; SCALAR-NEXT: shlq $20, %rdi
+; SCALAR-NEXT: xorq %rsi, %rdi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $21, %rdx
+; SCALAR-NEXT: xorq %rdi, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $22, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $23, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $24, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $25, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $26, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $27, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $28, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $29, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $30, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $31, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $32, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $33, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $34, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdi
+; SCALAR-NEXT: shlq $35, %rdi
+; SCALAR-NEXT: xorq %rsi, %rdi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $36, %rdx
+; SCALAR-NEXT: xorq %rdi, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $37, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $38, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $39, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $40, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $41, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $42, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $43, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $44, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $45, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $46, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $47, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $48, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $49, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $50, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $51, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $52, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $53, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rax, %rdi
+; SCALAR-NEXT: shlq $54, %rdi
+; SCALAR-NEXT: xorq %rsi, %rdi
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $55, %rdx
+; SCALAR-NEXT: xorq %rdi, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $56, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $57, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $58, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $59, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $60, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: shlq $61, %rsi
+; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $62, %rcx
+; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: shlq $63, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: shrq $32, %rax
+; SCALAR-NEXT: # kill: def $eax killed $eax killed $rax
+; SCALAR-NEXT: retq
+;
+; SSE-PCLMUL-LABEL: clmulh_i32_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movq $-1, %rax
+; SSE-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE-PCLMUL-NEXT: movd %edi, %xmm1
+; SSE-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: movq %xmm1, %rax
+; SSE-PCLMUL-NEXT: shrq $32, %rax
+; SSE-PCLMUL-NEXT: # kill: def $eax killed $eax killed $rax
+; SSE-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmulh_i32_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movq $-1, %rax
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovd %edi, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rax
+; AVX-NEXT: shrq $32, %rax
+; AVX-NEXT: # kill: def $eax killed $eax killed $rax
+; AVX-NEXT: retq
+ %x.ext = zext i32 %x to i64
+ %clmul = call i64 @llvm.clmul.i64(i64 %x.ext, i64 -1)
+ %res.ext = lshr i64 %clmul, 32
+ %res = trunc i64 %res.ext to i32
+ ret i32 %res
+}
+
+define i64 @clmulh_i64_allones(i64 %x) nounwind {
+; SCALAR-LABEL: clmulh_i64_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: pushq %rbx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: bswapq %rax
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shrq $4, %rcx
+; SCALAR-NEXT: movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F
+; SCALAR-NEXT: andq %rdx, %rcx
+; SCALAR-NEXT: andq %rdx, %rax
+; SCALAR-NEXT: shlq $4, %rax
+; SCALAR-NEXT: orq %rcx, %rax
+; SCALAR-NEXT: movabsq $3689348814741910323, %rcx # imm = 0x3333333333333333
+; SCALAR-NEXT: movq %rax, %rsi
+; SCALAR-NEXT: andq %rcx, %rsi
+; SCALAR-NEXT: shrq $2, %rax
+; SCALAR-NEXT: andq %rcx, %rax
+; SCALAR-NEXT: leaq (%rax,%rsi,4), %rsi
+; SCALAR-NEXT: movabsq $6148914691236517205, %rax # imm = 0x5555555555555555
+; SCALAR-NEXT: movq %rsi, %r8
+; SCALAR-NEXT: andq %rax, %r8
+; SCALAR-NEXT: shrq %rsi
+; SCALAR-NEXT: movq %rsi, %r9
+; SCALAR-NEXT: andq %rax, %r9
+; SCALAR-NEXT: leaq (%r9,%r8,2), %r8
+; SCALAR-NEXT: leaq (%r8,%r8), %r9
+; SCALAR-NEXT: xorq %r8, %r9
+; SCALAR-NEXT: leaq (,%r8,4), %r10
+; SCALAR-NEXT: leaq (,%r8,8), %r11
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $4, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $5, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $6, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: xorq %r10, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $7, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $8, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $9, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $10, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $11, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $12, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $13, %r9
+; SCALAR-NEXT: xorq %r10, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $14, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $15, %r9
+; SCALAR-NEXT: xorq %r10, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $16, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $17, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $18, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $19, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %rbx
+; SCALAR-NEXT: shlq $20, %rbx
+; SCALAR-NEXT: xorq %r11, %rbx
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $21, %r10
+; SCALAR-NEXT: xorq %rbx, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $22, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $23, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $24, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $25, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $26, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $27, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $28, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: xorq %r10, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $29, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $30, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $31, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $32, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $33, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $34, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %rbx
+; SCALAR-NEXT: shlq $35, %rbx
+; SCALAR-NEXT: xorq %r11, %rbx
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $36, %r10
+; SCALAR-NEXT: xorq %rbx, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $37, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $38, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $39, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $40, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $41, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $42, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $43, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $44, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $45, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: xorq %r10, %r9
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $46, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $47, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $48, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $49, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $50, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $51, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $52, %r10
+; SCALAR-NEXT: xorq %r11, %r10
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $53, %r11
+; SCALAR-NEXT: xorq %r10, %r11
+; SCALAR-NEXT: movq %r8, %rbx
+; SCALAR-NEXT: shlq $54, %rbx
+; SCALAR-NEXT: xorq %r11, %rbx
+; SCALAR-NEXT: movq %r8, %r10
+; SCALAR-NEXT: shlq $55, %r10
+; SCALAR-NEXT: xorq %rbx, %r10
+; SCALAR-NEXT: xorq %r9, %r10
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $56, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $57, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $58, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $59, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: movq %r8, %r9
+; SCALAR-NEXT: shlq $60, %r9
+; SCALAR-NEXT: xorq %r11, %r9
+; SCALAR-NEXT: movq %r8, %r11
+; SCALAR-NEXT: shlq $61, %r11
+; SCALAR-NEXT: xorq %r9, %r11
+; SCALAR-NEXT: shlq $62, %r8
+; SCALAR-NEXT: xorq %r11, %r8
+; SCALAR-NEXT: shlq $63, %rsi
+; SCALAR-NEXT: xorq %r8, %rsi
+; SCALAR-NEXT: xorq %r10, %rsi
+; SCALAR-NEXT: bswapq %rsi
+; SCALAR-NEXT: movq %rsi, %r8
+; SCALAR-NEXT: shrq $4, %r8
+; SCALAR-NEXT: andq %rdx, %r8
+; SCALAR-NEXT: andq %rdx, %rsi
+; SCALAR-NEXT: shlq $4, %rsi
+; SCALAR-NEXT: orq %r8, %rsi
+; SCALAR-NEXT: movq %rsi, %rdx
+; SCALAR-NEXT: andq %rcx, %rdx
+; SCALAR-NEXT: shrq $2, %rsi
+; SCALAR-NEXT: andq %rcx, %rsi
+; SCALAR-NEXT: leaq (%rsi,%rdx,4), %rcx
+; SCALAR-NEXT: andq %rcx, %rax
+; SCALAR-NEXT: shrq %rcx
+; SCALAR-NEXT: movabsq $6148914691236517204, %rdx # imm = 0x5555555555555554
+; SCALAR-NEXT: andq %rcx, %rdx
+; SCALAR-NEXT: leaq (%rdx,%rax,2), %rcx
+; SCALAR-NEXT: shrq %rcx
+; SCALAR-NEXT: leaq (%rdi,%rdi), %rax
+; SCALAR-NEXT: xorq %rdi, %rax
+; SCALAR-NEXT: leaq (,%rdi,4), %rdx
+; SCALAR-NEXT: leaq (,%rdi,8), %rsi
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $4, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $5, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $6, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $7, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $8, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $9, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $10, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $11, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $12, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $13, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $14, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $15, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $16, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $17, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $18, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $19, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %r8
+; SCALAR-NEXT: shlq $20, %r8
+; SCALAR-NEXT: xorq %rsi, %r8
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $21, %rdx
+; SCALAR-NEXT: xorq %r8, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $22, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $23, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $24, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $25, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $26, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $27, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $28, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $29, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $30, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $31, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $32, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $33, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $34, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %r8
+; SCALAR-NEXT: shlq $35, %r8
+; SCALAR-NEXT: xorq %rsi, %r8
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $36, %rdx
+; SCALAR-NEXT: xorq %r8, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $37, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $38, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $39, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $40, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $41, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $42, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $43, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $44, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $45, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $46, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $47, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $48, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $49, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $50, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $51, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $52, %rdx
+; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $53, %rsi
+; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: movq %rdi, %r8
+; SCALAR-NEXT: shlq $54, %r8
+; SCALAR-NEXT: xorq %rsi, %r8
+; SCALAR-NEXT: movq %rdi, %rdx
+; SCALAR-NEXT: shlq $55, %rdx
+; SCALAR-NEXT: xorq %r8, %rdx
+; SCALAR-NEXT: xorq %rax, %rdx
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $56, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $57, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $58, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $59, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $60, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: movq %rdi, %rsi
+; SCALAR-NEXT: shlq $61, %rsi
+; SCALAR-NEXT: xorq %rax, %rsi
+; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: shlq $62, %rax
+; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: shlq $63, %rdi
+; SCALAR-NEXT: xorq %rdi, %rax
+; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
+; SCALAR-NEXT: popq %rbx
+; SCALAR-NEXT: retq
+;
+; SSE2-PCLMUL-LABEL: clmulh_i64_allones:
+; SSE2-PCLMUL: # %bb.0:
+; SSE2-PCLMUL-NEXT: movq $-1, %rax
+; SSE2-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE2-PCLMUL-NEXT: movq %rdi, %xmm1
+; SSE2-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE2-PCLMUL-NEXT: movq %xmm1, %rcx
+; SSE2-PCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; SSE2-PCLMUL-NEXT: movq %xmm0, %rax
+; SSE2-PCLMUL-NEXT: xorq %rcx, %rax
+; SSE2-PCLMUL-NEXT: retq
+;
+; SSE42-PCLMUL-LABEL: clmulh_i64_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: movq $-1, %rax
+; SSE42-PCLMUL-NEXT: movq %rax, %xmm0
+; SSE42-PCLMUL-NEXT: movq %rdi, %xmm1
+; SSE42-PCLMUL-NEXT: pclmulqdq $0, %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movq %xmm1, %rcx
+; SSE42-PCLMUL-NEXT: pextrq $1, %xmm1, %rax
+; SSE42-PCLMUL-NEXT: xorq %rcx, %rax
+; SSE42-PCLMUL-NEXT: retq
+;
+; AVX-LABEL: clmulh_i64_allones:
+; AVX: # %bb.0:
+; AVX-NEXT: movq $-1, %rax
+; AVX-NEXT: vmovq %rax, %xmm0
+; AVX-NEXT: vmovq %rdi, %xmm1
+; AVX-NEXT: vpclmulqdq $0, %xmm0, %xmm1, %xmm0
+; AVX-NEXT: vmovq %xmm0, %rcx
+; AVX-NEXT: vpextrq $1, %xmm0, %rax
+; AVX-NEXT: xorq %rcx, %rax
+; AVX-NEXT: retq
+ %x.ext = zext i64 %x to i128
+ %clmul = call i128 @llvm.clmul.i128(i128 %x.ext, i128 -1)
+ %res.ext = lshr i128 %clmul, 64
+ %res = trunc i128 %res.ext to i64
+ ret i64 %res
+}
>From 221de1ceecfd955bb730ef21a2bea9849cc0bf5b Mon Sep 17 00:00:00 2001
From: Eisenwave <me at eisenwave.net>
Date: Wed, 3 Jun 2026 11:55:14 +0200
Subject: [PATCH 2/2] [SelectionDAG] Fix missed optimization for clmul(x, ~0)
or clmul(~0, x)
This special case is equivalent to a "parallel prefix XOR" or "bitwise parity" operation, which can be expanded to a logarithmic amount of bitwise operations instead of a linear amount (relative to the bit width).
When other bitwise operations such as BDEP and BEXT are expanded, they rely on that operation being lowered to a CLMUL directly or expanded to this efficient form.
---
.../CodeGen/SelectionDAG/TargetLowering.cpp | 12 +
llvm/test/CodeGen/X86/clmul-vector.ll | 5604 +++--------------
llvm/test/CodeGen/X86/clmul.ll | 2119 +------
3 files changed, 940 insertions(+), 6795 deletions(-)
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 55602b0496a87..d0d3d3a97b9fd 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -8878,6 +8878,18 @@ 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;
+ }
+
// NOTE: If you change this expansion, please update the cost model
// calculation in BasicTTIImpl::getTypeBasedIntrinsicInstrCost for
// Intrinsic::clmul.
diff --git a/llvm/test/CodeGen/X86/clmul-vector.ll b/llvm/test/CodeGen/X86/clmul-vector.ll
index 8278b01384c1e..a6271c5d7ceeb 100644
--- a/llvm/test/CodeGen/X86/clmul-vector.ll
+++ b/llvm/test/CodeGen/X86/clmul-vector.ll
@@ -7796,212 +7796,54 @@ define <16 x i8> @clmul_v16i8_allones(<16 x i8> %x) nounwind {
; SSE2-LABEL: clmul_v16i8_allones:
; SSE2: # %bb.0:
; SSE2-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
-; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2,u,2,u,2,u,2,u,2,u,2,u,2,u,2,u]
-; SSE2-NEXT: movdqa %xmm1, %xmm4
-; SSE2-NEXT: pmullw %xmm3, %xmm4
-; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
-; SSE2-NEXT: pand %xmm2, %xmm4
-; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
-; SSE2-NEXT: pmullw %xmm0, %xmm3
-; SSE2-NEXT: pand %xmm2, %xmm3
-; SSE2-NEXT: packuswb %xmm4, %xmm3
-; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [1,u,1,u,1,u,1,u,1,u,1,u,1,u,1,u]
-; SSE2-NEXT: movdqa %xmm1, %xmm5
-; SSE2-NEXT: pmullw %xmm4, %xmm5
-; SSE2-NEXT: pand %xmm2, %xmm5
-; SSE2-NEXT: pmullw %xmm0, %xmm4
-; SSE2-NEXT: pand %xmm2, %xmm4
-; SSE2-NEXT: packuswb %xmm5, %xmm4
-; SSE2-NEXT: pxor %xmm3, %xmm4
-; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [4,u,4,u,4,u,4,u,4,u,4,u,4,u,4,u]
-; SSE2-NEXT: movdqa %xmm1, %xmm3
-; SSE2-NEXT: pmullw %xmm5, %xmm3
-; SSE2-NEXT: pand %xmm2, %xmm3
-; SSE2-NEXT: pmullw %xmm0, %xmm5
-; SSE2-NEXT: pand %xmm2, %xmm5
-; SSE2-NEXT: packuswb %xmm3, %xmm5
-; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [8,u,8,u,8,u,8,u,8,u,8,u,8,u,8,u]
-; SSE2-NEXT: movdqa %xmm1, %xmm6
-; SSE2-NEXT: pmullw %xmm3, %xmm6
-; SSE2-NEXT: pand %xmm2, %xmm6
-; SSE2-NEXT: pmullw %xmm0, %xmm3
-; SSE2-NEXT: pand %xmm2, %xmm3
-; SSE2-NEXT: packuswb %xmm6, %xmm3
-; SSE2-NEXT: pxor %xmm5, %xmm3
-; SSE2-NEXT: pxor %xmm4, %xmm3
-; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [16,u,16,u,16,u,16,u,16,u,16,u,16,u,16,u]
-; SSE2-NEXT: movdqa %xmm1, %xmm5
-; SSE2-NEXT: pmullw %xmm4, %xmm5
-; SSE2-NEXT: pand %xmm2, %xmm5
-; SSE2-NEXT: pmullw %xmm0, %xmm4
-; SSE2-NEXT: pand %xmm2, %xmm4
-; SSE2-NEXT: packuswb %xmm5, %xmm4
-; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [32,u,32,u,32,u,32,u,32,u,32,u,32,u,32,u]
-; SSE2-NEXT: movdqa %xmm1, %xmm6
-; SSE2-NEXT: pmullw %xmm5, %xmm6
-; SSE2-NEXT: pand %xmm2, %xmm6
-; SSE2-NEXT: pmullw %xmm0, %xmm5
-; SSE2-NEXT: pand %xmm2, %xmm5
-; SSE2-NEXT: packuswb %xmm6, %xmm5
-; SSE2-NEXT: pxor %xmm4, %xmm5
-; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [64,u,64,u,64,u,64,u,64,u,64,u,64,u,64,u]
-; SSE2-NEXT: movdqa %xmm1, %xmm6
-; SSE2-NEXT: pmullw %xmm4, %xmm6
-; SSE2-NEXT: pand %xmm2, %xmm6
-; SSE2-NEXT: pmullw %xmm0, %xmm4
-; SSE2-NEXT: pand %xmm2, %xmm4
-; SSE2-NEXT: packuswb %xmm6, %xmm4
-; SSE2-NEXT: pxor %xmm5, %xmm4
-; SSE2-NEXT: pxor %xmm3, %xmm4
-; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [128,u,128,u,128,u,128,u,128,u,128,u,128,u,128,u]
-; SSE2-NEXT: pmullw %xmm3, %xmm1
-; SSE2-NEXT: pand %xmm2, %xmm1
-; SSE2-NEXT: pmullw %xmm3, %xmm0
-; SSE2-NEXT: pand %xmm2, %xmm0
-; SSE2-NEXT: packuswb %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm4, %xmm0
+; SSE2-NEXT: paddb %xmm0, %xmm1
+; SSE2-NEXT: pxor %xmm1, %xmm0
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: paddb %xmm0, %xmm1
+; SSE2-NEXT: paddb %xmm1, %xmm1
+; SSE2-NEXT: pxor %xmm1, %xmm0
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: psllw $4, %xmm1
+; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE2-NEXT: pxor %xmm1, %xmm0
; SSE2-NEXT: retq
;
-; SSE42-LABEL: clmul_v16i8_allones:
-; SSE42: # %bb.0:
-; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
-; SSE42-NEXT: pmullw %xmm0, %xmm2
-; SSE42-NEXT: pmovzxbw {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
-; SSE42-NEXT: pand %xmm1, %xmm2
-; SSE42-NEXT: movdqa %xmm0, %xmm4
-; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2]
-; SSE42-NEXT: psllw $8, %xmm4
-; SSE42-NEXT: por %xmm2, %xmm4
-; SSE42-NEXT: movdqa %xmm0, %xmm2
-; SSE42-NEXT: pand %xmm1, %xmm2
-; SSE42-NEXT: movdqa %xmm0, %xmm3
-; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1]
-; SSE42-NEXT: psllw $8, %xmm3
-; SSE42-NEXT: por %xmm2, %xmm3
-; SSE42-NEXT: pxor %xmm4, %xmm3
-; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
-; SSE42-NEXT: pmullw %xmm0, %xmm2
-; SSE42-NEXT: pand %xmm1, %xmm2
-; SSE42-NEXT: movdqa %xmm0, %xmm4
-; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4]
-; SSE42-NEXT: psllw $8, %xmm4
-; SSE42-NEXT: por %xmm2, %xmm4
-; SSE42-NEXT: movdqa {{.*#+}} xmm5 = [8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8]
-; SSE42-NEXT: pmullw %xmm0, %xmm5
-; SSE42-NEXT: pand %xmm1, %xmm5
-; SSE42-NEXT: movdqa %xmm0, %xmm2
-; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8]
-; SSE42-NEXT: psllw $8, %xmm2
-; SSE42-NEXT: por %xmm5, %xmm2
-; SSE42-NEXT: pxor %xmm4, %xmm2
-; SSE42-NEXT: pxor %xmm3, %xmm2
-; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16]
-; SSE42-NEXT: pmullw %xmm0, %xmm3
-; SSE42-NEXT: pand %xmm1, %xmm3
-; SSE42-NEXT: movdqa %xmm0, %xmm4
-; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16]
-; SSE42-NEXT: psllw $8, %xmm4
-; SSE42-NEXT: por %xmm3, %xmm4
-; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32]
-; SSE42-NEXT: pmullw %xmm0, %xmm3
-; SSE42-NEXT: pand %xmm1, %xmm3
-; SSE42-NEXT: movdqa %xmm0, %xmm5
-; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32]
-; SSE42-NEXT: psllw $8, %xmm5
-; SSE42-NEXT: por %xmm3, %xmm5
-; SSE42-NEXT: pxor %xmm4, %xmm5
-; SSE42-NEXT: movdqa {{.*#+}} xmm3 = [64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64]
-; SSE42-NEXT: pmullw %xmm0, %xmm3
-; SSE42-NEXT: pand %xmm1, %xmm3
-; SSE42-NEXT: movdqa %xmm0, %xmm4
-; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64]
-; SSE42-NEXT: psllw $8, %xmm4
-; SSE42-NEXT: por %xmm3, %xmm4
-; SSE42-NEXT: pxor %xmm5, %xmm4
-; SSE42-NEXT: pxor %xmm2, %xmm4
-; SSE42-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
-; SSE42-NEXT: pmullw %xmm0, %xmm2
-; SSE42-NEXT: pand %xmm1, %xmm2
-; SSE42-NEXT: pmaddubsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,128,0,128,0,128,0,128,0,128,0,128,0,128,0,128]
-; SSE42-NEXT: psllw $8, %xmm0
-; SSE42-NEXT: por %xmm2, %xmm0
-; SSE42-NEXT: pxor %xmm4, %xmm0
-; SSE42-NEXT: retq
+; SSE-PCLMUL-LABEL: clmul_v16i8_allones:
+; SSE-PCLMUL: # %bb.0:
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: paddb %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: paddb %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: paddb %xmm1, %xmm1
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE-PCLMUL-NEXT: psllw $4, %xmm1
+; SSE-PCLMUL-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE-PCLMUL-NEXT: retq
;
; AVX2-LABEL: clmul_v16i8_allones:
; AVX2: # %bb.0:
-; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
-; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
-; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm1 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]
-; AVX2-NEXT: vpand %ymm1, %ymm2, %ymm2
-; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm3
-; AVX2-NEXT: vpackuswb %xmm3, %xmm2, %xmm2
-; AVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm3
-; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm3
-; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm4
-; AVX2-NEXT: vpackuswb %xmm4, %xmm3, %xmm3
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4
-; AVX2-NEXT: vpackuswb %xmm4, %xmm0, %xmm4
-; AVX2-NEXT: vpxor %xmm3, %xmm4, %xmm3
-; AVX2-NEXT: vpsllw $3, %ymm0, %ymm4
-; AVX2-NEXT: vpand %ymm1, %ymm4, %ymm4
-; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm5
-; AVX2-NEXT: vpackuswb %xmm5, %xmm4, %xmm4
-; AVX2-NEXT: vpxor %xmm4, %xmm2, %xmm2
-; AVX2-NEXT: vpxor %xmm2, %xmm3, %xmm2
-; AVX2-NEXT: vpsllw $4, %ymm0, %ymm3
-; AVX2-NEXT: vpand %ymm1, %ymm3, %ymm3
-; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm4
-; AVX2-NEXT: vpackuswb %xmm4, %xmm3, %xmm3
-; AVX2-NEXT: vpsllw $5, %ymm0, %ymm4
-; AVX2-NEXT: vpand %ymm1, %ymm4, %ymm4
-; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm5
-; AVX2-NEXT: vpackuswb %xmm5, %xmm4, %xmm4
-; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX2-NEXT: vpsllw $6, %ymm0, %ymm4
-; AVX2-NEXT: vpand %ymm1, %ymm4, %ymm4
-; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm5
-; AVX2-NEXT: vpackuswb %xmm5, %xmm4, %xmm4
-; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm3
-; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2
-; AVX2-NEXT: vpsllw $7, %ymm0, %ymm0
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpxor %xmm0, %xmm2, %xmm0
-; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: vpaddb %xmm0, %xmm0, %xmm1
+; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vpaddb %xmm0, %xmm0, %xmm1
+; AVX2-NEXT: vpaddb %xmm1, %xmm1, %xmm1
+; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vpsllw $4, %xmm0, %xmm1
+; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm1
+; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: retq
;
; AVX512-LABEL: clmul_v16i8_allones:
; AVX512: # %bb.0:
-; AVX512-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
-; AVX512-NEXT: vpaddw %ymm1, %ymm1, %ymm2
-; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
-; AVX512-NEXT: vpmovdb %zmm2, %xmm2
-; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
-; AVX512-NEXT: vpsllw $2, %ymm1, %ymm2
-; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
-; AVX512-NEXT: vpmovdb %zmm2, %xmm2
-; AVX512-NEXT: vpsllw $3, %ymm1, %ymm3
-; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm3 = ymm3[0],zero,ymm3[1],zero,ymm3[2],zero,ymm3[3],zero,ymm3[4],zero,ymm3[5],zero,ymm3[6],zero,ymm3[7],zero,ymm3[8],zero,ymm3[9],zero,ymm3[10],zero,ymm3[11],zero,ymm3[12],zero,ymm3[13],zero,ymm3[14],zero,ymm3[15],zero
-; AVX512-NEXT: vpmovdb %zmm3, %xmm3
-; AVX512-NEXT: vpternlogq {{.*#+}} xmm3 = xmm3 ^ xmm0 ^ xmm2
-; AVX512-NEXT: vpsllw $4, %ymm1, %ymm0
-; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
-; AVX512-NEXT: vpmovdb %zmm0, %xmm0
-; AVX512-NEXT: vpsllw $5, %ymm1, %ymm2
-; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm2 = ymm2[0],zero,ymm2[1],zero,ymm2[2],zero,ymm2[3],zero,ymm2[4],zero,ymm2[5],zero,ymm2[6],zero,ymm2[7],zero,ymm2[8],zero,ymm2[9],zero,ymm2[10],zero,ymm2[11],zero,ymm2[12],zero,ymm2[13],zero,ymm2[14],zero,ymm2[15],zero
-; AVX512-NEXT: vpmovdb %zmm2, %xmm2
-; AVX512-NEXT: vpternlogq {{.*#+}} xmm2 = xmm2 ^ xmm3 ^ xmm0
-; AVX512-NEXT: vpsllw $6, %ymm1, %ymm0
-; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
-; AVX512-NEXT: vpmovdb %zmm0, %xmm3
-; AVX512-NEXT: vpsllw $7, %ymm1, %ymm0
-; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
-; AVX512-NEXT: vpmovdb %zmm0, %xmm0
-; AVX512-NEXT: vpternlogq {{.*#+}} xmm0 = xmm0 ^ xmm2 ^ xmm3
-; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: vpaddb %xmm0, %xmm0, %xmm1
+; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: vpaddb %xmm0, %xmm0, %xmm1
+; AVX512-NEXT: vpaddb %xmm1, %xmm1, %xmm1
+; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm1
+; AVX512-NEXT: vpsllw $4, %xmm1, %xmm0
+; AVX512-NEXT: vpternlogd {{.*#+}} xmm0 = xmm1 ^ (xmm0 & m32bcst)
; AVX512-NEXT: retq
%r = call <16 x i8> @llvm.clmul.v16i8(<16 x i8> %x, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>)
ret <16 x i8> %r
@@ -8028,96 +7870,32 @@ define <8 x i16> @clmul_v8i16_allones(<8 x i16> %x) nounwind {
; SSE2: # %bb.0:
; SSE2-NEXT: movdqa %xmm0, %xmm1
; SSE2-NEXT: paddw %xmm1, %xmm1
-; SSE2-NEXT: pxor %xmm0, %xmm1
-; SSE2-NEXT: movdqa %xmm0, %xmm2
-; SSE2-NEXT: psllw $2, %xmm2
-; SSE2-NEXT: movdqa %xmm0, %xmm3
-; SSE2-NEXT: psllw $3, %xmm3
-; SSE2-NEXT: pxor %xmm2, %xmm3
-; SSE2-NEXT: pxor %xmm1, %xmm3
-; SSE2-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NEXT: psllw $4, %xmm1
-; SSE2-NEXT: movdqa %xmm0, %xmm2
-; SSE2-NEXT: psllw $5, %xmm2
-; SSE2-NEXT: pxor %xmm1, %xmm2
+; SSE2-NEXT: pxor %xmm1, %xmm0
; SSE2-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NEXT: psllw $6, %xmm1
-; SSE2-NEXT: pxor %xmm2, %xmm1
-; SSE2-NEXT: pxor %xmm3, %xmm1
-; SSE2-NEXT: movdqa %xmm0, %xmm2
-; SSE2-NEXT: psllw $7, %xmm2
-; SSE2-NEXT: movdqa %xmm0, %xmm3
-; SSE2-NEXT: psllw $8, %xmm3
-; SSE2-NEXT: pxor %xmm2, %xmm3
-; SSE2-NEXT: movdqa %xmm0, %xmm2
-; SSE2-NEXT: psllw $9, %xmm2
-; SSE2-NEXT: pxor %xmm3, %xmm2
-; SSE2-NEXT: movdqa %xmm0, %xmm3
-; SSE2-NEXT: psllw $10, %xmm3
-; SSE2-NEXT: pxor %xmm2, %xmm3
-; SSE2-NEXT: pxor %xmm1, %xmm3
+; SSE2-NEXT: psllw $2, %xmm1
+; SSE2-NEXT: pxor %xmm1, %xmm0
; SSE2-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NEXT: psllw $11, %xmm1
-; SSE2-NEXT: movdqa %xmm0, %xmm2
-; SSE2-NEXT: psllw $12, %xmm2
-; SSE2-NEXT: pxor %xmm1, %xmm2
+; SSE2-NEXT: psllw $4, %xmm1
+; SSE2-NEXT: pxor %xmm1, %xmm0
; SSE2-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NEXT: psllw $13, %xmm1
-; SSE2-NEXT: pxor %xmm2, %xmm1
-; SSE2-NEXT: movdqa %xmm0, %xmm2
-; SSE2-NEXT: psllw $14, %xmm2
-; SSE2-NEXT: pxor %xmm1, %xmm2
-; SSE2-NEXT: psllw $15, %xmm0
-; SSE2-NEXT: pxor %xmm2, %xmm0
-; SSE2-NEXT: pxor %xmm3, %xmm0
+; SSE2-NEXT: psllw $8, %xmm1
+; SSE2-NEXT: pxor %xmm1, %xmm0
; SSE2-NEXT: retq
;
; SSE-PCLMUL-LABEL: clmul_v8i16_allones:
; SSE-PCLMUL: # %bb.0:
; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
; SSE-PCLMUL-NEXT: paddw %xmm1, %xmm1
-; SSE-PCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
-; SSE-PCLMUL-NEXT: psllw $2, %xmm2
-; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm3
-; SSE-PCLMUL-NEXT: psllw $3, %xmm3
-; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm0
; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
-; SSE-PCLMUL-NEXT: psllw $4, %xmm1
-; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
-; SSE-PCLMUL-NEXT: psllw $5, %xmm2
-; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
-; SSE-PCLMUL-NEXT: psllw $6, %xmm1
-; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm1
-; SSE-PCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
-; SSE-PCLMUL-NEXT: psllw $7, %xmm2
-; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm3
-; SSE-PCLMUL-NEXT: psllw $8, %xmm3
-; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
-; SSE-PCLMUL-NEXT: psllw $9, %xmm2
-; SSE-PCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm3
-; SSE-PCLMUL-NEXT: psllw $10, %xmm3
-; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE-PCLMUL-NEXT: psllw $2, %xmm1
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm0
; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
-; SSE-PCLMUL-NEXT: psllw $11, %xmm1
-; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
-; SSE-PCLMUL-NEXT: psllw $12, %xmm2
-; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE-PCLMUL-NEXT: psllw $4, %xmm1
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm0
; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm1
-; SSE-PCLMUL-NEXT: psllw $13, %xmm1
-; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm1
-; SSE-PCLMUL-NEXT: movdqa %xmm0, %xmm2
-; SSE-PCLMUL-NEXT: psllw $14, %xmm2
-; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE-PCLMUL-NEXT: psllw $15, %xmm0
-; SSE-PCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE-PCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE-PCLMUL-NEXT: psllw $8, %xmm1
+; SSE-PCLMUL-NEXT: pxor %xmm1, %xmm0
; SSE-PCLMUL-NEXT: retq
;
; AVX2-LABEL: clmul_v8i16_allones:
@@ -8213,254 +7991,21 @@ define <4 x i32> @clmul_v4i32_allones(<4 x i32> %x) nounwind {
;
; SSE2-NOPCLMUL-LABEL: clmul_v4i32_allones:
; SSE2-NOPCLMUL: # %bb.0:
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [4,4,4,4]
; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [2,2,2,2]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [8,8,8,8]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [16,16,16,16]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [32,32,32,32]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [64,64,64,64]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [256,256,256,256]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [512,512,512,512]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [1024,1024,1024,1024]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [2048,2048,2048,2048]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [4096,4096,4096,4096]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [8192,8192,8192,8192]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [16384,16384,16384,16384]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [65536,65536,65536,65536]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [131072,131072,131072,131072]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [262144,262144,262144,262144]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [524288,524288,524288,524288]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [1048576,1048576,1048576,1048576]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [2097152,2097152,2097152,2097152]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [4194304,4194304,4194304,4194304]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [8388608,8388608,8388608,8388608]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [16777216,16777216,16777216,16777216]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [33554432,33554432,33554432,33554432]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [67108864,67108864,67108864,67108864]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [134217728,134217728,134217728,134217728]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm3[0],xmm5[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [268435456,268435456,268435456,268435456]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [536870912,536870912,536870912,536870912]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [1073741824,1073741824,1073741824,1073741824]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm2[0],xmm5[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; 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: pxor %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: paddd %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $4, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $8, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $16, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
; SSE2-NOPCLMUL-NEXT: retq
;
; SSE2-PCLMUL-LABEL: clmul_v4i32_allones:
@@ -8594,333 +8139,24 @@ define <2 x i64> @clmul_v2i64_allones(<2 x i64> %x) nounwind {
;
; SSE2-NOPCLMUL-LABEL: clmul_v2i64_allones:
; SSE2-NOPCLMUL: # %bb.0:
-; SSE2-NOPCLMUL-NEXT: subq $200, %rsp
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm15
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4,4]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm14
-; SSE2-NOPCLMUL-NEXT: psrlq $32, %xmm14
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [2,2]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: por %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [8,8]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16,16]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [32,32]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [64,64]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: paddq %xmm1, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [128,128]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [256,256]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [512,512]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm4
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: por %xmm1, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [1024,1024]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2048,2048]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [4096,4096]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, (%rsp) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8192,8192]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [16384,16384]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm4
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: por %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [65536,65536]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [131072,131072]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [262144,262144]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $2, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [524288,524288]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [1048576,1048576]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm13
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm13
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm13, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $4, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2097152,2097152]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm12
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm12
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: por %xmm12, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4194304,4194304]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm11
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm11
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm11, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [8388608,8388608]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm10
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm10
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: por %xmm10, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16777216,16777216]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm9
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm9
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm9, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [33554432,33554432]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm8
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm8
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: por %xmm8, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [67108864,67108864]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [134217728,134217728]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm7
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: por %xmm7, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [268435456,268435456]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm2
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: por %xmm6, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [536870912,536870912]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $8, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $16, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: por %xmm5, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [1073741824,1073741824]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: por %xmm3, %xmm0
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm14
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm14
-; SSE2-NOPCLMUL-NEXT: por %xmm1, %xmm14
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm14
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm15
-; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm15
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm15
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm15
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm15
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm15
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm15
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa (%rsp), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm15
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm13
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm13
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm12
-; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm12
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm11
-; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm11
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm10
-; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm10
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm9
-; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm9
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm8
-; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm8
-; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm15
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm7
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm7
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm6
-; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm5
-; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm5
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm15
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm15, %xmm0
-; SSE2-NOPCLMUL-NEXT: addq $200, %rsp
; SSE2-NOPCLMUL-NEXT: retq
;
; SSE-PCLMUL-LABEL: clmul_v2i64_allones:
@@ -9003,227 +8239,90 @@ define <16 x i8> @clmulr_v16i8_allones(<16 x i8> %x) nounwind {
;
; SSE2-LABEL: clmulr_v16i8_allones:
; SSE2: # %bb.0:
+; SSE2-NEXT: pxor %xmm1, %xmm1
+; SSE2-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1],xmm2[2],xmm1[2],xmm2[3],xmm1[3],xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
+; SSE2-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
; SSE2-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NEXT: pxor %xmm3, %xmm3
-; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
-; SSE2-NEXT: movdqa %xmm1, %xmm2
-; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: paddw %xmm4, %xmm4
-; SSE2-NEXT: pxor %xmm2, %xmm4
-; SSE2-NEXT: movdqa %xmm2, %xmm5
-; SSE2-NEXT: psllw $2, %xmm5
-; SSE2-NEXT: movdqa %xmm2, %xmm6
-; SSE2-NEXT: psllw $3, %xmm6
-; SSE2-NEXT: pxor %xmm5, %xmm6
-; SSE2-NEXT: pxor %xmm4, %xmm6
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: psllw $4, %xmm4
-; SSE2-NEXT: movdqa %xmm2, %xmm5
-; SSE2-NEXT: psllw $5, %xmm5
-; SSE2-NEXT: pxor %xmm4, %xmm5
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: psllw $6, %xmm4
-; SSE2-NEXT: pxor %xmm5, %xmm4
-; SSE2-NEXT: pxor %xmm6, %xmm4
-; SSE2-NEXT: movdqa %xmm2, %xmm5
-; SSE2-NEXT: psllw $7, %xmm5
-; SSE2-NEXT: pxor %xmm6, %xmm6
-; SSE2-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15]
-; SSE2-NEXT: pxor %xmm5, %xmm6
-; SSE2-NEXT: movdqa %xmm2, %xmm5
-; SSE2-NEXT: psllw $9, %xmm5
-; SSE2-NEXT: pxor %xmm6, %xmm5
-; SSE2-NEXT: movdqa %xmm2, %xmm6
-; SSE2-NEXT: psllw $10, %xmm6
-; SSE2-NEXT: pxor %xmm5, %xmm6
-; SSE2-NEXT: pxor %xmm4, %xmm6
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: psllw $11, %xmm4
-; SSE2-NEXT: movdqa %xmm2, %xmm5
-; SSE2-NEXT: psllw $12, %xmm5
-; SSE2-NEXT: pxor %xmm4, %xmm5
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: psllw $13, %xmm4
-; SSE2-NEXT: pxor %xmm5, %xmm4
-; SSE2-NEXT: psllw $14, %xmm2
-; SSE2-NEXT: pxor %xmm4, %xmm2
-; SSE2-NEXT: pxor %xmm6, %xmm2
-; SSE2-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NEXT: paddw %xmm4, %xmm4
-; SSE2-NEXT: pxor %xmm0, %xmm4
-; SSE2-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NEXT: psllw $2, %xmm5
-; SSE2-NEXT: movdqa %xmm0, %xmm6
-; SSE2-NEXT: psllw $3, %xmm6
-; SSE2-NEXT: pxor %xmm5, %xmm6
-; SSE2-NEXT: pxor %xmm4, %xmm6
-; SSE2-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NEXT: psllw $4, %xmm4
-; SSE2-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NEXT: psllw $5, %xmm5
-; SSE2-NEXT: pxor %xmm4, %xmm5
-; SSE2-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NEXT: psllw $6, %xmm4
-; SSE2-NEXT: pxor %xmm5, %xmm4
-; SSE2-NEXT: pxor %xmm6, %xmm4
-; SSE2-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NEXT: psllw $7, %xmm5
-; SSE2-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
-; SSE2-NEXT: pxor %xmm5, %xmm3
+; SSE2-NEXT: paddw %xmm1, %xmm1
+; SSE2-NEXT: pxor %xmm0, %xmm1
+; SSE2-NEXT: movdqa %xmm1, %xmm0
+; SSE2-NEXT: psllw $2, %xmm0
+; SSE2-NEXT: pxor %xmm1, %xmm0
; SSE2-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NEXT: psllw $9, %xmm1
-; SSE2-NEXT: pxor %xmm3, %xmm1
-; SSE2-NEXT: movdqa %xmm0, %xmm3
-; SSE2-NEXT: psllw $10, %xmm3
+; SSE2-NEXT: psllw $4, %xmm1
+; SSE2-NEXT: pxor %xmm0, %xmm1
+; SSE2-NEXT: movdqa %xmm1, %xmm3
+; SSE2-NEXT: psllw $8, %xmm3
; SSE2-NEXT: pxor %xmm1, %xmm3
-; SSE2-NEXT: pxor %xmm4, %xmm3
-; SSE2-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NEXT: psllw $11, %xmm1
-; SSE2-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NEXT: psllw $12, %xmm4
-; SSE2-NEXT: pxor %xmm1, %xmm4
+; SSE2-NEXT: movdqa %xmm2, %xmm0
+; SSE2-NEXT: paddw %xmm0, %xmm0
+; SSE2-NEXT: pxor %xmm2, %xmm0
; SSE2-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NEXT: psllw $13, %xmm1
-; SSE2-NEXT: pxor %xmm4, %xmm1
-; SSE2-NEXT: psllw $14, %xmm0
-; SSE2-NEXT: pxor %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm3, %xmm0
+; SSE2-NEXT: psllw $2, %xmm1
+; SSE2-NEXT: pxor %xmm0, %xmm1
+; SSE2-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NEXT: psllw $4, %xmm2
+; SSE2-NEXT: pxor %xmm1, %xmm2
+; SSE2-NEXT: movdqa %xmm2, %xmm0
+; SSE2-NEXT: psllw $8, %xmm0
+; SSE2-NEXT: pxor %xmm2, %xmm0
; SSE2-NEXT: psrlw $7, %xmm0
-; SSE2-NEXT: psrlw $7, %xmm2
+; SSE2-NEXT: psrlw $7, %xmm3
; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0]
-; SSE2-NEXT: pand %xmm1, %xmm2
+; SSE2-NEXT: pand %xmm1, %xmm3
; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: packuswb %xmm2, %xmm0
+; SSE2-NEXT: packuswb %xmm3, %xmm0
; SSE2-NEXT: retq
;
; SSE42-LABEL: clmulr_v16i8_allones:
; SSE42: # %bb.0:
-; SSE42-NEXT: movdqa %xmm0, %xmm1
-; SSE42-NEXT: pxor %xmm3, %xmm3
-; SSE42-NEXT: movdqa %xmm0, %xmm2
-; SSE42-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
-; SSE42-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
-; SSE42-NEXT: movdqa %xmm2, %xmm4
-; SSE42-NEXT: paddw %xmm4, %xmm4
-; SSE42-NEXT: pxor %xmm2, %xmm4
-; SSE42-NEXT: movdqa %xmm2, %xmm5
-; SSE42-NEXT: psllw $2, %xmm5
-; SSE42-NEXT: movdqa %xmm2, %xmm6
-; SSE42-NEXT: psllw $3, %xmm6
-; SSE42-NEXT: pxor %xmm5, %xmm6
-; SSE42-NEXT: pxor %xmm4, %xmm6
-; SSE42-NEXT: movdqa %xmm2, %xmm4
-; SSE42-NEXT: psllw $4, %xmm4
-; SSE42-NEXT: movdqa %xmm2, %xmm5
-; SSE42-NEXT: psllw $5, %xmm5
-; SSE42-NEXT: pxor %xmm4, %xmm5
-; SSE42-NEXT: movdqa %xmm2, %xmm4
-; SSE42-NEXT: psllw $6, %xmm4
-; SSE42-NEXT: pxor %xmm5, %xmm4
-; SSE42-NEXT: pxor %xmm6, %xmm4
-; SSE42-NEXT: movdqa %xmm2, %xmm5
-; SSE42-NEXT: psllw $7, %xmm5
-; SSE42-NEXT: pxor %xmm6, %xmm6
-; SSE42-NEXT: punpckhbw {{.*#+}} xmm6 = xmm6[8],xmm1[8],xmm6[9],xmm1[9],xmm6[10],xmm1[10],xmm6[11],xmm1[11],xmm6[12],xmm1[12],xmm6[13],xmm1[13],xmm6[14],xmm1[14],xmm6[15],xmm1[15]
-; SSE42-NEXT: pxor %xmm5, %xmm6
-; SSE42-NEXT: movdqa %xmm2, %xmm5
-; SSE42-NEXT: psllw $9, %xmm5
-; SSE42-NEXT: pxor %xmm6, %xmm5
-; SSE42-NEXT: movdqa %xmm2, %xmm6
-; SSE42-NEXT: psllw $10, %xmm6
-; SSE42-NEXT: pxor %xmm5, %xmm6
-; SSE42-NEXT: pxor %xmm4, %xmm6
-; SSE42-NEXT: movdqa %xmm2, %xmm4
-; SSE42-NEXT: psllw $11, %xmm4
-; SSE42-NEXT: movdqa %xmm2, %xmm5
-; SSE42-NEXT: psllw $12, %xmm5
-; SSE42-NEXT: pxor %xmm4, %xmm5
-; SSE42-NEXT: movdqa %xmm2, %xmm4
-; SSE42-NEXT: psllw $13, %xmm4
-; SSE42-NEXT: pxor %xmm5, %xmm4
-; SSE42-NEXT: psllw $14, %xmm2
-; SSE42-NEXT: pxor %xmm4, %xmm2
-; SSE42-NEXT: pxor %xmm6, %xmm2
-; SSE42-NEXT: punpcklbw {{.*#+}} xmm3 = xmm3[0],xmm1[0],xmm3[1],xmm1[1],xmm3[2],xmm1[2],xmm3[3],xmm1[3],xmm3[4],xmm1[4],xmm3[5],xmm1[5],xmm3[6],xmm1[6],xmm3[7],xmm1[7]
+; SSE42-NEXT: pxor %xmm1, %xmm1
+; SSE42-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; SSE42-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
; SSE42-NEXT: movdqa %xmm0, %xmm1
; SSE42-NEXT: paddw %xmm1, %xmm1
; SSE42-NEXT: pxor %xmm0, %xmm1
-; SSE42-NEXT: movdqa %xmm0, %xmm4
-; SSE42-NEXT: psllw $2, %xmm4
-; SSE42-NEXT: movdqa %xmm0, %xmm5
-; SSE42-NEXT: psllw $3, %xmm5
-; SSE42-NEXT: pxor %xmm4, %xmm5
-; SSE42-NEXT: pxor %xmm1, %xmm5
+; SSE42-NEXT: movdqa %xmm1, %xmm0
+; SSE42-NEXT: psllw $2, %xmm0
+; SSE42-NEXT: pxor %xmm1, %xmm0
; SSE42-NEXT: movdqa %xmm0, %xmm1
; SSE42-NEXT: psllw $4, %xmm1
-; SSE42-NEXT: movdqa %xmm0, %xmm4
-; SSE42-NEXT: psllw $5, %xmm4
-; SSE42-NEXT: pxor %xmm1, %xmm4
-; SSE42-NEXT: movdqa %xmm0, %xmm1
-; SSE42-NEXT: psllw $6, %xmm1
-; SSE42-NEXT: pxor %xmm4, %xmm1
-; SSE42-NEXT: pxor %xmm5, %xmm1
-; SSE42-NEXT: movdqa %xmm0, %xmm4
-; SSE42-NEXT: psllw $7, %xmm4
-; SSE42-NEXT: pxor %xmm3, %xmm4
-; SSE42-NEXT: movdqa %xmm0, %xmm3
-; SSE42-NEXT: psllw $9, %xmm3
-; SSE42-NEXT: pxor %xmm4, %xmm3
-; SSE42-NEXT: movdqa %xmm0, %xmm4
-; SSE42-NEXT: psllw $10, %xmm4
-; SSE42-NEXT: pxor %xmm3, %xmm4
-; SSE42-NEXT: pxor %xmm1, %xmm4
-; SSE42-NEXT: movdqa %xmm0, %xmm1
-; SSE42-NEXT: psllw $11, %xmm1
-; SSE42-NEXT: movdqa %xmm0, %xmm3
-; SSE42-NEXT: psllw $12, %xmm3
+; SSE42-NEXT: pxor %xmm0, %xmm1
+; SSE42-NEXT: movdqa %xmm1, %xmm3
+; SSE42-NEXT: psllw $8, %xmm3
; SSE42-NEXT: pxor %xmm1, %xmm3
+; SSE42-NEXT: movdqa %xmm2, %xmm0
+; SSE42-NEXT: paddw %xmm0, %xmm0
+; SSE42-NEXT: pxor %xmm2, %xmm0
; SSE42-NEXT: movdqa %xmm0, %xmm1
-; SSE42-NEXT: psllw $13, %xmm1
-; SSE42-NEXT: pxor %xmm3, %xmm1
-; SSE42-NEXT: psllw $14, %xmm0
-; SSE42-NEXT: pxor %xmm1, %xmm0
-; SSE42-NEXT: pxor %xmm4, %xmm0
+; SSE42-NEXT: psllw $2, %xmm1
+; SSE42-NEXT: pxor %xmm0, %xmm1
+; SSE42-NEXT: movdqa %xmm1, %xmm2
+; SSE42-NEXT: psllw $4, %xmm2
+; SSE42-NEXT: pxor %xmm1, %xmm2
+; SSE42-NEXT: movdqa %xmm2, %xmm0
+; SSE42-NEXT: psllw $8, %xmm0
+; SSE42-NEXT: pxor %xmm2, %xmm0
+; SSE42-NEXT: psrlw $7, %xmm3
; SSE42-NEXT: psrlw $7, %xmm0
-; SSE42-NEXT: psrlw $7, %xmm2
; SSE42-NEXT: pmovzxbw {{.*#+}} xmm1 = [255,255,255,255,255,255,255,255]
-; SSE42-NEXT: pand %xmm1, %xmm2
+; SSE42-NEXT: pand %xmm1, %xmm3
; SSE42-NEXT: pand %xmm1, %xmm0
-; SSE42-NEXT: packuswb %xmm2, %xmm0
+; SSE42-NEXT: packuswb %xmm3, %xmm0
; SSE42-NEXT: retq
;
; AVX2-LABEL: clmulr_v16i8_allones:
; AVX2: # %bb.0:
; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
; AVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm1
-; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1
-; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
-; AVX2-NEXT: vpsllw $3, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
-; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
-; AVX2-NEXT: vpsllw $5, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpsllw $6, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
-; AVX2-NEXT: vpsllw $7, %ymm0, %ymm2
-; AVX2-NEXT: vpsllw $8, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpsllw $9, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpsllw $10, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
-; AVX2-NEXT: vpsllw $11, %ymm0, %ymm2
-; AVX2-NEXT: vpsllw $12, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpsllw $13, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpsllw $14, %ymm0, %ymm0
-; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0
-; AVX2-NEXT: vpxor %ymm0, %ymm1, %ymm0
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpsllw $2, %ymm0, %ymm1
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpsllw $4, %ymm0, %ymm1
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpsllw $8, %ymm0, %ymm1
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
; AVX2-NEXT: vpsrlw $7, %ymm0, %ymm0
; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
@@ -9235,26 +8334,13 @@ define <16 x i8> @clmulr_v16i8_allones(<16 x i8> %x) nounwind {
; AVX512: # %bb.0:
; AVX512-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
; AVX512-NEXT: vpaddw %ymm0, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm0 ^ ymm1
-; AVX512-NEXT: vpsllw $3, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $4, %ymm0, %ymm3
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm2 ^ ymm1
-; AVX512-NEXT: vpsllw $5, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $6, %ymm0, %ymm2
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm3 ^ ymm1
-; AVX512-NEXT: vpsllw $7, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $8, %ymm0, %ymm3
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm2 ^ ymm1
-; AVX512-NEXT: vpsllw $9, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $10, %ymm0, %ymm2
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm3 ^ ymm1
-; AVX512-NEXT: vpsllw $11, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $12, %ymm0, %ymm3
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm2 ^ ymm1
-; AVX512-NEXT: vpsllw $13, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $14, %ymm0, %ymm0
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm0 = ymm0 ^ ymm3 ^ ymm1
+; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vpsllw $2, %ymm0, %ymm1
+; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vpsllw $4, %ymm0, %ymm1
+; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vpsllw $8, %ymm0, %ymm1
+; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
; AVX512-NEXT: vpsrlw $7, %ymm0, %ymm0
; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
; AVX512-NEXT: vpmovdb %zmm0, %xmm0
@@ -9349,535 +8435,45 @@ define <8 x i16> @clmulr_v8i16_allones(<8 x i16> %x) nounwind {
;
; SSE2-NOPCLMUL-LABEL: clmulr_v8i16_allones:
; SSE2-NOPCLMUL: # %bb.0:
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm8
-; SSE2-NOPCLMUL-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4],xmm1[4],xmm8[5],xmm1[5],xmm8[6],xmm1[6],xmm8[7],xmm1[7]
-; SSE2-NOPCLMUL-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4,4,4,4]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2,2,2,2]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8,8,8,8]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16,16,16,16]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [32,32,32,32]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [64,64,64,64]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [128,128,128,128]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [256,256,256,256]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [512,512,512,512]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [1024,1024,1024,1024]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2048,2048,2048,2048]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4096,4096,4096,4096]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8192,8192,8192,8192]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16384,16384,16384,16384]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm4[0],xmm6[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [32768,32768,32768,32768]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [65536,65536,65536,65536]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [131072,131072,131072,131072]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [262144,262144,262144,262144]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [524288,524288,524288,524288]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm13 = [1048576,1048576,1048576,1048576]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2097152,2097152,2097152,2097152]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4194304,4194304,4194304,4194304]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8388608,8388608,8388608,8388608]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm15 = [16777216,16777216,16777216,16777216]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm14 = [33554432,33554432,33554432,33554432]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm12 = [67108864,67108864,67108864,67108864]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm11 = [134217728,134217728,134217728,134217728]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm10 = [268435456,268435456,268435456,268435456]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm9 = [536870912,536870912,536870912,536870912]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [1073741824,1073741824,1073741824,1073741824]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %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: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [4,4,4,4]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [2,2,2,2]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [8,8,8,8]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [16,16,16,16]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [32,32,32,32]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [64,64,64,64]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [128,128,128,128]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [256,256,256,256]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [512,512,512,512]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm0[0],xmm7[1],xmm0[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm7
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [1024,1024,1024,1024]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [2048,2048,2048,2048]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [4096,4096,4096,4096]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [8192,8192,8192,8192]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [16384,16384,16384,16384]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [65536,65536,65536,65536]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [131072,131072,131072,131072]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [262144,262144,262144,262144]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [524288,524288,524288,524288]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm13
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm13[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2097152,2097152,2097152,2097152]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm13 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm13 = xmm13[0],xmm5[0],xmm13[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm13
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm13
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [4194304,4194304,4194304,4194304]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [8388608,8388608,8388608,8388608]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm15
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm15[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm14
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm14[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm12
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm12[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm11
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm11[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm10
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm10[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm9
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm9[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm8
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm8[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: paddd %xmm2, %xmm2
-; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm2
-; SSE2-NOPCLMUL-NEXT: paddd %xmm6, %xmm6
-; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm6
-; SSE2-NOPCLMUL-NEXT: packssdw %xmm2, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm6, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
+; SSE2-NOPCLMUL-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: paddd %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $4, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $8, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $16, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: paddd %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pslld $2, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $4, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pslld $8, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $16, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: paddd %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm1
+; SSE2-NOPCLMUL-NEXT: paddd %xmm0, %xmm0
+; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm0
+; SSE2-NOPCLMUL-NEXT: packssdw %xmm1, %xmm0
; SSE2-NOPCLMUL-NEXT: retq
;
; SSE2-PCLMUL-LABEL: clmulr_v8i16_allones:
@@ -10137,419 +8733,49 @@ define <4 x i32> @clmulr_v4i32_allones(<4 x i32> %x) nounwind {
;
; SSE2-NOPCLMUL-LABEL: clmulr_v4i32_allones:
; SSE2-NOPCLMUL: # %bb.0:
-; SSE2-NOPCLMUL-NEXT: subq $200, %rsp
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm14
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm14 = xmm14[0],xmm1[0],xmm14[1],xmm1[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2,2]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [4,4]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [8,8]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,16]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32,32]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: paddq %xmm1, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [64,64]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $2, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [128,128]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, (%rsp) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [256,256]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [512,512]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [1024,1024]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2048,2048]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4096,4096]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $4, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [8192,8192]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $8, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [16384,16384]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $16, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [32768,32768]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [65536,65536]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [131072,131072]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: paddq %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: psllq $2, %xmm2
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm15
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm15 # [262144,262144]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm13
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm13 # [524288,524288]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm12
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12 # [1048576,1048576]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm11
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11 # [2097152,2097152]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4194304,4194304]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm10
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm10 # [8388608,8388608]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm9
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm9 # [16777216,16777216]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm8
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm8 # [33554432,33554432]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm7
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7 # [67108864,67108864]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6 # [134217728,134217728]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [268435456,268435456]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [536870912,536870912]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [1073741824,1073741824]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm14 # [2147483648,2147483648]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm0
-; SSE2-NOPCLMUL-NEXT: punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
-; SSE2-NOPCLMUL-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa (%rsp), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $4, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
+; SSE2-NOPCLMUL-NEXT: psllq $8, %xmm2
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $16, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm15
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm15
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm13
-; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm13
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm12
-; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm12
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm11
-; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm11
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm11
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm10
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm10
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm9
-; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm9
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm8
-; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm8
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm7
-; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm7
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm6
-; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm5
-; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm5
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm14
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm14
-; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm14
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm0
-; SSE2-NOPCLMUL-NEXT: punpckhdq {{.*#+}} xmm14 = xmm14[2],xmm0[2],xmm14[3],xmm0[3]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [2,2]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [4,4]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [8,8]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm5
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [16,16]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm11 = [32,32]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm11
-; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [64,64]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm7
-; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [128,128]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm8 = [256,256]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm8
-; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm9 = [512,512]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm9
-; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm10 = [1024,1024]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm10
-; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm2 = [2048,2048]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4096,4096]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm13 = [8192,8192]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm13
-; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm15 = [16384,16384]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm15
-; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [32768,32768]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [65536,65536]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [131072,131072]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [262144,262144]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [524288,524288]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [1048576,1048576]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2097152,2097152]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm6 = [4194304,4194304]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8388608,8388608]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm6, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16777216,16777216]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, (%rsp) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [33554432,33554432]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [67108864,67108864]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [134217728,134217728]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [268435456,268435456]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [536870912,536870912]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm12 = [1073741824,1073741824]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm12
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm14 # [2147483648,2147483648]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm3
-; SSE2-NOPCLMUL-NEXT: punpckhdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Folded Reload
-; SSE2-NOPCLMUL-NEXT: # xmm3 = xmm3[2],mem[2],xmm3[3],mem[3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm1
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm5
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm11
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm7
-; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm7
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm2
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm8
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm8
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm9
-; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm9
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm10
-; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm10
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm13
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm15
-; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm15
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa (%rsp), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm12
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm12
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm14
-; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm14
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm14
-; SSE2-NOPCLMUL-NEXT: psrlq $31, %xmm14
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: psrlq $31, %xmm2
; SSE2-NOPCLMUL-NEXT: psrlq $31, %xmm0
-; SSE2-NOPCLMUL-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm14[0,2]
-; SSE2-NOPCLMUL-NEXT: addq $200, %rsp
+; SSE2-NOPCLMUL-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2]
; SSE2-NOPCLMUL-NEXT: retq
;
; SSE2-PCLMUL-LABEL: clmulr_v4i32_allones:
@@ -10795,841 +9021,153 @@ define <2 x i64> @clmulr_v2i64_allones(<2 x i64> %x) nounwind {
;
; SSE2-NOPCLMUL-LABEL: clmulr_v2i64_allones:
; SSE2-NOPCLMUL: # %bb.0:
-; SSE2-NOPCLMUL-NEXT: pushq %r15
-; SSE2-NOPCLMUL-NEXT: pushq %r14
-; SSE2-NOPCLMUL-NEXT: pushq %r13
-; SSE2-NOPCLMUL-NEXT: pushq %r12
-; SSE2-NOPCLMUL-NEXT: pushq %rbx
; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
; SSE2-NOPCLMUL-NEXT: movq %xmm1, %rax
-; SSE2-NOPCLMUL-NEXT: movq %xmm0, %rcx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %xmm0, %rsi
+; SSE2-NOPCLMUL-NEXT: leaq (%rsi,%rsi), %r8
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r8
; SSE2-NOPCLMUL-NEXT: bswapq %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rsi, %rdx
-; SSE2-NOPCLMUL-NEXT: shrq $4, %rdx
-; SSE2-NOPCLMUL-NEXT: movabsq $1085102592571150095, %rdi # imm = 0xF0F0F0F0F0F0F0F
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %rdx
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rsi, %rcx
+; SSE2-NOPCLMUL-NEXT: shrq $4, %rcx
+; SSE2-NOPCLMUL-NEXT: movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rcx
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rsi
; SSE2-NOPCLMUL-NEXT: shlq $4, %rsi
-; SSE2-NOPCLMUL-NEXT: orq %rdx, %rsi
-; SSE2-NOPCLMUL-NEXT: movabsq $3689348814741910323, %rdx # imm = 0x3333333333333333
-; SSE2-NOPCLMUL-NEXT: movq %rsi, %r8
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %r8
+; SSE2-NOPCLMUL-NEXT: orq %rcx, %rsi
+; SSE2-NOPCLMUL-NEXT: movabsq $3689348814741910323, %rcx # imm = 0x3333333333333333
+; SSE2-NOPCLMUL-NEXT: movq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rdi
; SSE2-NOPCLMUL-NEXT: shrq $2, %rsi
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %rsi
-; SSE2-NOPCLMUL-NEXT: leaq (%rsi,%r8,4), %r8
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rsi
+; SSE2-NOPCLMUL-NEXT: leaq (%rsi,%rdi,4), %rdi
; SSE2-NOPCLMUL-NEXT: movabsq $6148914691236517205, %rsi # imm = 0x5555555555555555
-; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r9
; SSE2-NOPCLMUL-NEXT: andq %rsi, %r9
-; SSE2-NOPCLMUL-NEXT: shrq %r8
-; SSE2-NOPCLMUL-NEXT: movq %r8, %r10
+; SSE2-NOPCLMUL-NEXT: shrq %rdi
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (%rdi,%r9,2), %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (%rdi,%rdi), %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: leaq (,%r9,4), %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $8, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $16, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $32, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: bswapq %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: shrq $4, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rdi
+; SSE2-NOPCLMUL-NEXT: orq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shrq $2, %rdi
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (%rdi,%r9,4), %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r10
; SSE2-NOPCLMUL-NEXT: andq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: leaq (%r10,%r9,2), %r9
-; SSE2-NOPCLMUL-NEXT: leaq (%r9,%r9), %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: leaq (,%r9,4), %r11
-; SSE2-NOPCLMUL-NEXT: leaq (,%r9,8), %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $5, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $6, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $7, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $8, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $9, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $10, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $11, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $12, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $13, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $15, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shrq %rdi
+; SSE2-NOPCLMUL-NEXT: movabsq $6148914691236517204, %r9 # imm = 0x5555555555555554
+; SSE2-NOPCLMUL-NEXT: andq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (%rdi,%r10,2), %rdi
+; SSE2-NOPCLMUL-NEXT: shrq %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (,%r8,4), %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r8, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r10, %r8
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r8
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r8
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $8, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r8, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r10, %r11
; SSE2-NOPCLMUL-NEXT: shlq $16, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $17, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $18, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $19, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $20, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $21, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $22, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $23, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $24, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $25, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $26, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $27, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $28, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $29, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $30, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $31, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $32, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $33, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $34, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $35, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $36, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $37, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $38, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $39, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $40, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $41, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $42, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $43, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $44, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $45, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $46, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $47, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $48, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $49, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $50, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $51, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $52, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $53, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $54, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $55, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $56, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $57, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $58, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $59, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $60, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $61, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $62, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $63, %r8
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r8
+; SSE2-NOPCLMUL-NEXT: movq %r11, %r8
+; SSE2-NOPCLMUL-NEXT: shlq $32, %r8
; SSE2-NOPCLMUL-NEXT: xorq %r11, %r8
-; SSE2-NOPCLMUL-NEXT: bswapq %r8
-; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
-; SSE2-NOPCLMUL-NEXT: shrq $4, %r9
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %r9
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %r8
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r8
-; SSE2-NOPCLMUL-NEXT: orq %r9, %r8
-; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %r9
-; SSE2-NOPCLMUL-NEXT: shrq $2, %r8
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %r8
-; SSE2-NOPCLMUL-NEXT: leaq (%r8,%r9,4), %r8
-; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
-; SSE2-NOPCLMUL-NEXT: andq %rsi, %r9
-; SSE2-NOPCLMUL-NEXT: shrq %r8
-; SSE2-NOPCLMUL-NEXT: movabsq $6148914691236517204, %r10 # imm = 0x5555555555555554
-; SSE2-NOPCLMUL-NEXT: andq %r10, %r8
-; SSE2-NOPCLMUL-NEXT: leaq (%r8,%r9,2), %r8
-; SSE2-NOPCLMUL-NEXT: shrq %r8
-; SSE2-NOPCLMUL-NEXT: leaq (%rcx,%rcx), %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: leaq (,%rcx,4), %r11
-; SSE2-NOPCLMUL-NEXT: leaq (,%rcx,8), %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $5, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $6, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $7, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $8, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $9, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $10, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $11, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $12, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $13, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $15, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $16, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $17, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $18, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $19, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $20, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $21, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $22, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $23, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $24, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $25, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $26, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $27, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $28, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $29, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $30, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $31, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $32, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $33, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $34, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $35, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $36, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $37, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $38, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $39, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $40, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $41, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $42, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $43, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $44, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $45, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $46, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $47, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $48, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $49, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $50, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $51, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $52, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $53, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $54, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $55, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $56, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $57, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $58, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $59, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $60, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $61, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $62, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r8
+; SSE2-NOPCLMUL-NEXT: xorq %r8, %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rax), %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: bswapq %rax
; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
-; SSE2-NOPCLMUL-NEXT: bswapq %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: shrq $4, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r11
-; SSE2-NOPCLMUL-NEXT: orq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %rbx
-; SSE2-NOPCLMUL-NEXT: shrq $2, %r11
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %r11
-; SSE2-NOPCLMUL-NEXT: leaq (%r11,%rbx,4), %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rsi, %rbx
-; SSE2-NOPCLMUL-NEXT: shrq %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %r14
-; SSE2-NOPCLMUL-NEXT: andq %rsi, %r14
-; SSE2-NOPCLMUL-NEXT: leaq (%r14,%rbx,2), %rbx
-; SSE2-NOPCLMUL-NEXT: leaq (%rbx,%rbx), %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: leaq (,%rbx,4), %r15
-; SSE2-NOPCLMUL-NEXT: leaq (,%rbx,8), %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $5, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $6, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $7, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $8, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $9, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $10, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $11, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $12, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $13, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $14, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $15, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $16, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $17, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $18, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $19, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
-; SSE2-NOPCLMUL-NEXT: shlq $20, %r13
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $21, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $22, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $23, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $24, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $25, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $26, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $27, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $28, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $29, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $30, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $31, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $32, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $33, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $34, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
-; SSE2-NOPCLMUL-NEXT: shlq $35, %r13
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $36, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $37, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $38, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $39, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $40, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $41, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $42, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $43, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $44, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $45, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $46, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $47, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $48, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $49, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $50, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $51, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $52, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $53, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
-; SSE2-NOPCLMUL-NEXT: shlq $54, %r13
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $55, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $56, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $57, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $58, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $59, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $60, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $61, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $62, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $63, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r11
-; SSE2-NOPCLMUL-NEXT: bswapq %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: shrq $4, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r11
-; SSE2-NOPCLMUL-NEXT: orq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %rdi
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %rdi
-; SSE2-NOPCLMUL-NEXT: shrq $2, %r11
+; SSE2-NOPCLMUL-NEXT: shrq $4, %r11
; SSE2-NOPCLMUL-NEXT: andq %rdx, %r11
-; SSE2-NOPCLMUL-NEXT: leaq (%r11,%rdi,4), %rdx
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %rsi
-; SSE2-NOPCLMUL-NEXT: shrq %rdx
-; SSE2-NOPCLMUL-NEXT: andq %r10, %rdx
-; SSE2-NOPCLMUL-NEXT: leaq (%rdx,%rsi,2), %rdx
-; SSE2-NOPCLMUL-NEXT: shrq %rdx
-; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rax), %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: leaq (,%rax,4), %rdi
-; SSE2-NOPCLMUL-NEXT: leaq (,%rax,8), %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $4, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $5, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $6, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $7, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $8, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $9, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $10, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $11, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $12, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $13, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $14, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $15, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $16, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $17, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $18, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $19, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rax
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rax
+; SSE2-NOPCLMUL-NEXT: orq %r11, %rax
; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $20, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $21, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $22, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $23, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $24, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $25, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $26, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $27, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $28, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $29, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $30, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $31, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $32, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $33, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $34, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shrq $2, %rax
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rax
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%r11,4), %rax
; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $35, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $36, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $37, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $38, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $39, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $40, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $41, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $42, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $43, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $44, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $45, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $46, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $47, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $48, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $49, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $50, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $51, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $52, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $53, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %r11
+; SSE2-NOPCLMUL-NEXT: shrq %rax
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %rax
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%r11,2), %rax
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rax), %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: leaq (,%r11,4), %rax
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rax
; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $54, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $55, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $56, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $57, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $58, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $59, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $60, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $61, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $62, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdx
-; SSE2-NOPCLMUL-NEXT: shlq $63, %rcx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rcx
-; SSE2-NOPCLMUL-NEXT: shrdq $63, %r8, %rcx
-; SSE2-NOPCLMUL-NEXT: shlq $63, %rax
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rax
-; SSE2-NOPCLMUL-NEXT: shrdq $63, %rdx, %rax
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %xmm0
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rax
+; SSE2-NOPCLMUL-NEXT: shlq $8, %rax
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rax
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $16, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rax
+; SSE2-NOPCLMUL-NEXT: shlq $32, %rax
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rax
+; SSE2-NOPCLMUL-NEXT: bswapq %rax
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: shrq $4, %r11
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r11
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rax
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rax
+; SSE2-NOPCLMUL-NEXT: orq %r11, %rax
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdx
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rdx
+; SSE2-NOPCLMUL-NEXT: shrq $2, %rax
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rax
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rdx,4), %rax
+; SSE2-NOPCLMUL-NEXT: andq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shrq %rax
+; SSE2-NOPCLMUL-NEXT: andq %r9, %rax
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rsi,2), %rax
+; SSE2-NOPCLMUL-NEXT: shrq %rax
+; SSE2-NOPCLMUL-NEXT: leaq (,%r10,4), %rcx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rcx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rdx
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rdx
+; SSE2-NOPCLMUL-NEXT: xorq %rcx, %rdx
+; SSE2-NOPCLMUL-NEXT: movq %rdx, %rcx
+; SSE2-NOPCLMUL-NEXT: shlq $8, %rcx
+; SSE2-NOPCLMUL-NEXT: xorq %rdx, %rcx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rdx
+; SSE2-NOPCLMUL-NEXT: shlq $16, %rdx
+; SSE2-NOPCLMUL-NEXT: xorq %rcx, %rdx
+; SSE2-NOPCLMUL-NEXT: movq %rdx, %rcx
+; SSE2-NOPCLMUL-NEXT: shlq $32, %rcx
+; SSE2-NOPCLMUL-NEXT: xorq %rdx, %rcx
+; SSE2-NOPCLMUL-NEXT: xorq %rcx, %rax
+; SSE2-NOPCLMUL-NEXT: shldq $1, %rcx, %rax
+; SSE2-NOPCLMUL-NEXT: shldq $1, %r8, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %xmm0
; SSE2-NOPCLMUL-NEXT: movq %rax, %xmm1
; SSE2-NOPCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
-; SSE2-NOPCLMUL-NEXT: popq %rbx
-; SSE2-NOPCLMUL-NEXT: popq %r12
-; SSE2-NOPCLMUL-NEXT: popq %r13
-; SSE2-NOPCLMUL-NEXT: popq %r14
-; SSE2-NOPCLMUL-NEXT: popq %r15
; SSE2-NOPCLMUL-NEXT: retq
;
; SSE2-PCLMUL-LABEL: clmulr_v2i64_allones:
@@ -11793,98 +9331,34 @@ define <16 x i8> @clmulh_v16i8_allones(<16 x i8> %x) nounwind {
;
; SSE2-LABEL: clmulh_v16i8_allones:
; SSE2: # %bb.0:
-; SSE2-NEXT: movdqa %xmm0, %xmm1
-; SSE2-NEXT: pxor %xmm3, %xmm3
+; SSE2-NEXT: pxor %xmm1, %xmm1
; SSE2-NEXT: movdqa %xmm0, %xmm2
-; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
-; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3],xmm0[4],xmm3[4],xmm0[5],xmm3[5],xmm0[6],xmm3[6],xmm0[7],xmm3[7]
-; SSE2-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NEXT: paddw %xmm4, %xmm4
-; SSE2-NEXT: pxor %xmm0, %xmm4
-; SSE2-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NEXT: psllw $2, %xmm5
-; SSE2-NEXT: movdqa %xmm0, %xmm6
-; SSE2-NEXT: psllw $3, %xmm6
-; SSE2-NEXT: pxor %xmm5, %xmm6
-; SSE2-NEXT: pxor %xmm4, %xmm6
-; SSE2-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NEXT: psllw $4, %xmm4
-; SSE2-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NEXT: psllw $5, %xmm5
-; SSE2-NEXT: pxor %xmm4, %xmm5
-; SSE2-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NEXT: psllw $6, %xmm4
-; SSE2-NEXT: pxor %xmm5, %xmm4
-; SSE2-NEXT: pxor %xmm6, %xmm4
-; SSE2-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NEXT: psllw $7, %xmm5
-; SSE2-NEXT: pxor %xmm6, %xmm6
-; SSE2-NEXT: punpcklbw {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1],xmm6[2],xmm1[2],xmm6[3],xmm1[3],xmm6[4],xmm1[4],xmm6[5],xmm1[5],xmm6[6],xmm1[6],xmm6[7],xmm1[7]
-; SSE2-NEXT: pxor %xmm5, %xmm6
-; SSE2-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NEXT: psllw $9, %xmm5
-; SSE2-NEXT: pxor %xmm6, %xmm5
-; SSE2-NEXT: movdqa %xmm0, %xmm6
-; SSE2-NEXT: psllw $10, %xmm6
-; SSE2-NEXT: pxor %xmm5, %xmm6
-; SSE2-NEXT: pxor %xmm4, %xmm6
-; SSE2-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NEXT: psllw $11, %xmm4
-; SSE2-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NEXT: psllw $12, %xmm5
-; SSE2-NEXT: pxor %xmm4, %xmm5
-; SSE2-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NEXT: psllw $13, %xmm4
-; SSE2-NEXT: pxor %xmm5, %xmm4
-; SSE2-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NEXT: psllw $14, %xmm5
-; SSE2-NEXT: pxor %xmm4, %xmm5
-; SSE2-NEXT: psllw $15, %xmm0
-; SSE2-NEXT: pxor %xmm5, %xmm0
-; SSE2-NEXT: pxor %xmm6, %xmm0
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: paddw %xmm4, %xmm4
-; SSE2-NEXT: pxor %xmm2, %xmm4
-; SSE2-NEXT: movdqa %xmm2, %xmm5
-; SSE2-NEXT: psllw $2, %xmm5
-; SSE2-NEXT: movdqa %xmm2, %xmm6
-; SSE2-NEXT: psllw $3, %xmm6
-; SSE2-NEXT: pxor %xmm5, %xmm6
-; SSE2-NEXT: pxor %xmm4, %xmm6
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: psllw $4, %xmm4
-; SSE2-NEXT: movdqa %xmm2, %xmm5
-; SSE2-NEXT: psllw $5, %xmm5
-; SSE2-NEXT: pxor %xmm4, %xmm5
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: psllw $6, %xmm4
-; SSE2-NEXT: pxor %xmm5, %xmm4
-; SSE2-NEXT: pxor %xmm6, %xmm4
-; SSE2-NEXT: movdqa %xmm2, %xmm5
-; SSE2-NEXT: psllw $7, %xmm5
-; SSE2-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
-; SSE2-NEXT: pxor %xmm5, %xmm3
-; SSE2-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NEXT: psllw $9, %xmm1
-; SSE2-NEXT: pxor %xmm3, %xmm1
-; SSE2-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NEXT: psllw $10, %xmm3
-; SSE2-NEXT: pxor %xmm1, %xmm3
-; SSE2-NEXT: pxor %xmm4, %xmm3
+; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm1[8],xmm2[9],xmm1[9],xmm2[10],xmm1[10],xmm2[11],xmm1[11],xmm2[12],xmm1[12],xmm2[13],xmm1[13],xmm2[14],xmm1[14],xmm2[15],xmm1[15]
+; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3],xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: paddw %xmm1, %xmm1
+; SSE2-NEXT: pxor %xmm1, %xmm0
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: psllw $2, %xmm1
+; SSE2-NEXT: pxor %xmm1, %xmm0
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: psllw $4, %xmm1
+; SSE2-NEXT: pxor %xmm1, %xmm0
+; SSE2-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NEXT: psllw $8, %xmm1
+; SSE2-NEXT: pxor %xmm1, %xmm0
; SSE2-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NEXT: psllw $11, %xmm1
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: psllw $12, %xmm4
-; SSE2-NEXT: pxor %xmm1, %xmm4
+; SSE2-NEXT: paddw %xmm1, %xmm1
+; SSE2-NEXT: pxor %xmm2, %xmm1
+; SSE2-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NEXT: psllw $2, %xmm2
+; SSE2-NEXT: pxor %xmm1, %xmm2
; SSE2-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NEXT: psllw $13, %xmm1
-; SSE2-NEXT: pxor %xmm4, %xmm1
-; SSE2-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NEXT: psllw $14, %xmm4
-; SSE2-NEXT: pxor %xmm1, %xmm4
-; SSE2-NEXT: psllw $15, %xmm2
-; SSE2-NEXT: pxor %xmm4, %xmm2
-; SSE2-NEXT: pxor %xmm3, %xmm2
+; SSE2-NEXT: psllw $4, %xmm1
+; SSE2-NEXT: pxor %xmm2, %xmm1
+; SSE2-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NEXT: psllw $8, %xmm2
+; SSE2-NEXT: pxor %xmm1, %xmm2
; SSE2-NEXT: psrlw $8, %xmm2
; SSE2-NEXT: psrlw $8, %xmm0
; SSE2-NEXT: packuswb %xmm2, %xmm0
@@ -11892,784 +9366,192 @@ define <16 x i8> @clmulh_v16i8_allones(<16 x i8> %x) nounwind {
;
; SSE42-LABEL: clmulh_v16i8_allones:
; SSE42: # %bb.0:
+; SSE42-NEXT: pxor %xmm1, %xmm1
+; SSE42-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; SSE42-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
; SSE42-NEXT: movdqa %xmm0, %xmm1
-; SSE42-NEXT: pxor %xmm3, %xmm3
-; SSE42-NEXT: movdqa %xmm0, %xmm2
-; SSE42-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm3[8],xmm2[9],xmm3[9],xmm2[10],xmm3[10],xmm2[11],xmm3[11],xmm2[12],xmm3[12],xmm2[13],xmm3[13],xmm2[14],xmm3[14],xmm2[15],xmm3[15]
-; SSE42-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
-; SSE42-NEXT: pxor %xmm4, %xmm4
-; SSE42-NEXT: punpcklbw {{.*#+}} xmm4 = xmm4[0],xmm1[0],xmm4[1],xmm1[1],xmm4[2],xmm1[2],xmm4[3],xmm1[3],xmm4[4],xmm1[4],xmm4[5],xmm1[5],xmm4[6],xmm1[6],xmm4[7],xmm1[7]
-; SSE42-NEXT: movdqa %xmm0, %xmm5
-; SSE42-NEXT: paddw %xmm5, %xmm5
-; SSE42-NEXT: pxor %xmm0, %xmm5
-; SSE42-NEXT: movdqa %xmm0, %xmm6
-; SSE42-NEXT: psllw $2, %xmm6
-; SSE42-NEXT: movdqa %xmm0, %xmm7
-; SSE42-NEXT: psllw $3, %xmm7
-; SSE42-NEXT: pxor %xmm6, %xmm7
-; SSE42-NEXT: pxor %xmm5, %xmm7
-; SSE42-NEXT: movdqa %xmm0, %xmm5
-; SSE42-NEXT: psllw $4, %xmm5
-; SSE42-NEXT: movdqa %xmm0, %xmm6
-; SSE42-NEXT: psllw $5, %xmm6
-; SSE42-NEXT: pxor %xmm5, %xmm6
-; SSE42-NEXT: movdqa %xmm0, %xmm5
-; SSE42-NEXT: psllw $6, %xmm5
-; SSE42-NEXT: pxor %xmm6, %xmm5
-; SSE42-NEXT: pxor %xmm7, %xmm5
-; SSE42-NEXT: movdqa %xmm0, %xmm6
-; SSE42-NEXT: psllw $7, %xmm6
-; SSE42-NEXT: pxor %xmm4, %xmm6
-; SSE42-NEXT: movdqa %xmm0, %xmm4
-; SSE42-NEXT: psllw $9, %xmm4
-; SSE42-NEXT: pxor %xmm6, %xmm4
-; SSE42-NEXT: movdqa %xmm0, %xmm6
-; SSE42-NEXT: psllw $10, %xmm6
-; SSE42-NEXT: pxor %xmm4, %xmm6
-; SSE42-NEXT: pxor %xmm5, %xmm6
-; SSE42-NEXT: movdqa %xmm0, %xmm4
-; SSE42-NEXT: psllw $11, %xmm4
-; SSE42-NEXT: movdqa %xmm0, %xmm5
-; SSE42-NEXT: psllw $12, %xmm5
-; SSE42-NEXT: pxor %xmm4, %xmm5
-; SSE42-NEXT: movdqa %xmm0, %xmm4
-; SSE42-NEXT: psllw $13, %xmm4
-; SSE42-NEXT: pxor %xmm5, %xmm4
-; SSE42-NEXT: movdqa %xmm0, %xmm5
-; SSE42-NEXT: psllw $14, %xmm5
-; SSE42-NEXT: pxor %xmm4, %xmm5
-; SSE42-NEXT: psllw $15, %xmm0
-; SSE42-NEXT: pxor %xmm5, %xmm0
-; SSE42-NEXT: pxor %xmm6, %xmm0
-; SSE42-NEXT: movdqa %xmm2, %xmm4
-; SSE42-NEXT: paddw %xmm4, %xmm4
-; SSE42-NEXT: pxor %xmm2, %xmm4
-; SSE42-NEXT: movdqa %xmm2, %xmm5
-; SSE42-NEXT: psllw $2, %xmm5
-; SSE42-NEXT: movdqa %xmm2, %xmm6
-; SSE42-NEXT: psllw $3, %xmm6
-; SSE42-NEXT: pxor %xmm5, %xmm6
-; SSE42-NEXT: pxor %xmm4, %xmm6
-; SSE42-NEXT: movdqa %xmm2, %xmm4
-; SSE42-NEXT: psllw $4, %xmm4
-; SSE42-NEXT: movdqa %xmm2, %xmm5
-; SSE42-NEXT: psllw $5, %xmm5
-; SSE42-NEXT: pxor %xmm4, %xmm5
-; SSE42-NEXT: movdqa %xmm2, %xmm4
-; SSE42-NEXT: psllw $6, %xmm4
-; SSE42-NEXT: pxor %xmm5, %xmm4
-; SSE42-NEXT: pxor %xmm6, %xmm4
-; SSE42-NEXT: movdqa %xmm2, %xmm5
-; SSE42-NEXT: psllw $7, %xmm5
-; SSE42-NEXT: punpckhbw {{.*#+}} xmm3 = xmm3[8],xmm1[8],xmm3[9],xmm1[9],xmm3[10],xmm1[10],xmm3[11],xmm1[11],xmm3[12],xmm1[12],xmm3[13],xmm1[13],xmm3[14],xmm1[14],xmm3[15],xmm1[15]
-; SSE42-NEXT: pxor %xmm5, %xmm3
-; SSE42-NEXT: movdqa %xmm2, %xmm1
-; SSE42-NEXT: psllw $9, %xmm1
-; SSE42-NEXT: pxor %xmm3, %xmm1
-; SSE42-NEXT: movdqa %xmm2, %xmm3
-; SSE42-NEXT: psllw $10, %xmm3
-; SSE42-NEXT: pxor %xmm1, %xmm3
-; SSE42-NEXT: pxor %xmm4, %xmm3
-; SSE42-NEXT: movdqa %xmm2, %xmm1
-; SSE42-NEXT: psllw $11, %xmm1
-; SSE42-NEXT: movdqa %xmm2, %xmm4
-; SSE42-NEXT: psllw $12, %xmm4
-; SSE42-NEXT: pxor %xmm1, %xmm4
-; SSE42-NEXT: movdqa %xmm2, %xmm1
-; SSE42-NEXT: psllw $13, %xmm1
-; SSE42-NEXT: pxor %xmm4, %xmm1
-; SSE42-NEXT: movdqa %xmm2, %xmm4
-; SSE42-NEXT: psllw $14, %xmm4
-; SSE42-NEXT: pxor %xmm1, %xmm4
-; SSE42-NEXT: psllw $15, %xmm2
-; SSE42-NEXT: pxor %xmm4, %xmm2
-; SSE42-NEXT: pxor %xmm3, %xmm2
-; SSE42-NEXT: psrlw $8, %xmm2
-; SSE42-NEXT: psrlw $8, %xmm0
-; SSE42-NEXT: packuswb %xmm2, %xmm0
-; SSE42-NEXT: retq
-;
-; AVX2-LABEL: clmulh_v16i8_allones:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
-; AVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm1
-; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm1
-; AVX2-NEXT: vpsllw $2, %ymm0, %ymm2
-; AVX2-NEXT: vpsllw $3, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
-; AVX2-NEXT: vpsllw $4, %ymm0, %ymm2
-; AVX2-NEXT: vpsllw $5, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpsllw $6, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
-; AVX2-NEXT: vpsllw $7, %ymm0, %ymm2
-; AVX2-NEXT: vpsllw $8, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpsllw $9, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpsllw $10, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
-; AVX2-NEXT: vpsllw $11, %ymm0, %ymm2
-; AVX2-NEXT: vpsllw $12, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpsllw $13, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpsllw $14, %ymm0, %ymm3
-; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2
-; AVX2-NEXT: vpsllw $15, %ymm0, %ymm0
-; AVX2-NEXT: vpxor %ymm0, %ymm2, %ymm0
-; AVX2-NEXT: vpxor %ymm0, %ymm1, %ymm0
-; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
-;
-; AVX512-LABEL: clmulh_v16i8_allones:
-; AVX512: # %bb.0:
-; AVX512-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
-; AVX512-NEXT: vpaddw %ymm0, %ymm0, %ymm1
-; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $2, %ymm0, %ymm2
-; AVX512-NEXT: vpsllw $3, %ymm0, %ymm3
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm1 ^ ymm2
-; AVX512-NEXT: vpsllw $4, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $5, %ymm0, %ymm2
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm3 ^ ymm1
-; AVX512-NEXT: vpsllw $6, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $7, %ymm0, %ymm3
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm2 ^ ymm1
-; AVX512-NEXT: vpsllw $8, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $9, %ymm0, %ymm2
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm3 ^ ymm1
-; AVX512-NEXT: vpsllw $10, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $11, %ymm0, %ymm3
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm3 = ymm3 ^ ymm2 ^ ymm1
-; AVX512-NEXT: vpsllw $12, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $13, %ymm0, %ymm2
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm2 = ymm2 ^ ymm3 ^ ymm1
-; AVX512-NEXT: vpsllw $14, %ymm0, %ymm1
-; AVX512-NEXT: vpsllw $15, %ymm0, %ymm0
-; AVX512-NEXT: vpternlogq {{.*#+}} ymm0 = ymm0 ^ ymm2 ^ ymm1
-; AVX512-NEXT: vpsrlw $8, %ymm0, %ymm0
-; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
-; AVX512-NEXT: vpmovdb %zmm0, %xmm0
-; AVX512-NEXT: vzeroupper
-; AVX512-NEXT: retq
-; SSE42-PCLMUL-LABEL: clmulh_v16i8_allones:
-; SSE42-PCLMUL: # %bb.0:
-; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm1
-; SSE42-PCLMUL-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
-; SSE42-PCLMUL-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
-; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
-; SSE42-PCLMUL-NEXT: paddw %xmm1, %xmm1
-; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm0
-; SSE42-PCLMUL-NEXT: psllw $2, %xmm0
-; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
-; SSE42-PCLMUL-NEXT: psllw $4, %xmm1
-; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm3
-; SSE42-PCLMUL-NEXT: psllw $8, %xmm3
-; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE42-PCLMUL-NEXT: movdqa %xmm2, %xmm0
-; SSE42-PCLMUL-NEXT: paddw %xmm0, %xmm0
-; SSE42-PCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
-; SSE42-PCLMUL-NEXT: psllw $2, %xmm1
-; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm2
-; SSE42-PCLMUL-NEXT: psllw $4, %xmm2
-; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm2
-; SSE42-PCLMUL-NEXT: movdqa %xmm2, %xmm0
-; SSE42-PCLMUL-NEXT: psllw $8, %xmm0
-; SSE42-PCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE42-PCLMUL-NEXT: psrlw $8, %xmm3
-; SSE42-PCLMUL-NEXT: psrlw $8, %xmm0
-; SSE42-PCLMUL-NEXT: packuswb %xmm3, %xmm0
-; SSE42-PCLMUL-NEXT: retq
- %x.ext = zext <16 x i8> %x to <16 x i16>
- %clmul = call <16 x i16> @llvm.clmul.v16i16(<16 x i16> %x.ext, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
- %res.ext = lshr <16 x i16> %clmul, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
- %res = trunc <16 x i16> %res.ext to <16 x i8>
- ret <16 x i8> %res
-}
-
-define <8 x i16> @clmulh_v8i16_allones(<8 x i16> %x) nounwind {
-; SCALAR-LABEL: clmulh_v8i16_allones:
-; SCALAR: # %bb.0:
-; SCALAR-NEXT: pxor %xmm1, %xmm1
-; SCALAR-NEXT: movdqa %xmm0, %xmm2
-; SCALAR-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
-; SCALAR-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
-; SCALAR-NEXT: movdqa %xmm0, %xmm1
-; SCALAR-NEXT: paddd %xmm1, %xmm1
-; SCALAR-NEXT: pxor %xmm1, %xmm0
-; SCALAR-NEXT: movdqa %xmm0, %xmm1
-; SCALAR-NEXT: pslld $2, %xmm1
-; SCALAR-NEXT: pxor %xmm1, %xmm0
-; SCALAR-NEXT: movdqa %xmm0, %xmm1
-; SCALAR-NEXT: pslld $4, %xmm1
-; SCALAR-NEXT: pxor %xmm1, %xmm0
-; SCALAR-NEXT: movdqa %xmm0, %xmm1
-; SCALAR-NEXT: pslld $8, %xmm1
-; SCALAR-NEXT: pxor %xmm1, %xmm0
-; SCALAR-NEXT: movdqa %xmm0, %xmm1
-; SCALAR-NEXT: pslld $16, %xmm1
-; SCALAR-NEXT: pxor %xmm1, %xmm0
-; SCALAR-NEXT: movdqa %xmm2, %xmm1
-; SCALAR-NEXT: paddd %xmm1, %xmm1
-; SCALAR-NEXT: pxor %xmm2, %xmm1
-; SCALAR-NEXT: movdqa %xmm1, %xmm2
-; SCALAR-NEXT: pslld $2, %xmm2
-; SCALAR-NEXT: pxor %xmm1, %xmm2
-; SCALAR-NEXT: movdqa %xmm2, %xmm1
-; SCALAR-NEXT: pslld $4, %xmm1
-; SCALAR-NEXT: pxor %xmm2, %xmm1
-; SCALAR-NEXT: movdqa %xmm1, %xmm2
-; SCALAR-NEXT: pslld $8, %xmm2
-; SCALAR-NEXT: pxor %xmm1, %xmm2
-; SCALAR-NEXT: movdqa %xmm2, %xmm1
-; SCALAR-NEXT: pslld $16, %xmm1
-; SCALAR-NEXT: pxor %xmm2, %xmm1
-; SCALAR-NEXT: psrad $16, %xmm1
-; SCALAR-NEXT: psrad $16, %xmm0
-; SCALAR-NEXT: packssdw %xmm1, %xmm0
-; SCALAR-NEXT: retq
-;
-; SSE2-NOPCLMUL-LABEL: clmulh_v8i16_allones:
-; SSE2-NOPCLMUL: # %bb.0:
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm8
-; SSE2-NOPCLMUL-NEXT: punpckhwd {{.*#+}} xmm8 = xmm8[4],xmm1[4],xmm8[5],xmm1[5],xmm8[6],xmm1[6],xmm8[7],xmm1[7]
-; SSE2-NOPCLMUL-NEXT: punpcklwd {{.*#+}} xmm5 = xmm5[0],xmm1[0],xmm5[1],xmm1[1],xmm5[2],xmm1[2],xmm5[3],xmm1[3]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4,4,4,4]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2,2,2,2]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm3[0],xmm4[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8,8,8,8]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16,16,16,16]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [32,32,32,32]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [64,64,64,64]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [128,128,128,128]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [256,256,256,256]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [512,512,512,512]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm3[0],xmm6[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [1024,1024,1024,1024]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2048,2048,2048,2048]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4096,4096,4096,4096]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8192,8192,8192,8192]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16384,16384,16384,16384]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm4[0],xmm6[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [32768,32768,32768,32768]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm2[0],xmm4[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [65536,65536,65536,65536]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [131072,131072,131072,131072]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [262144,262144,262144,262144]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [524288,524288,524288,524288]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm13 = [1048576,1048576,1048576,1048576]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2097152,2097152,2097152,2097152]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm6[0],xmm3[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [4194304,4194304,4194304,4194304]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [8388608,8388608,8388608,8388608]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm15 = [16777216,16777216,16777216,16777216]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm14 = [33554432,33554432,33554432,33554432]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm12 = [67108864,67108864,67108864,67108864]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm11 = [134217728,134217728,134217728,134217728]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm10 = [268435456,268435456,268435456,268435456]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm6
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm6[0],xmm2[1],xmm6[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm9 = [536870912,536870912,536870912,536870912]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm3 = xmm3[0],xmm4[0],xmm3[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [1073741824,1073741824,1073741824,1073741824]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm7, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %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: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm6 = xmm6[0],xmm1[0],xmm6[1],xmm1[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm6
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [4,4,4,4]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm3 = xmm8[1,1,3,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [2,2,2,2]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm0[0],xmm5[1],xmm0[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [8,8,8,8]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [16,16,16,16]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [32,32,32,32]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [64,64,64,64]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [128,128,128,128]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [256,256,256,256]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [512,512,512,512]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm0[0],xmm7[1],xmm0[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm7
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [1024,1024,1024,1024]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [2048,2048,2048,2048]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [4096,4096,4096,4096]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [8192,8192,8192,8192]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [16384,16384,16384,16384]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm7, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm7
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm7[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm7[0],xmm2[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [65536,65536,65536,65536]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [131072,131072,131072,131072]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [262144,262144,262144,262144]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [524288,524288,524288,524288]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm7[0],xmm5[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm13, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm13
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm7 = xmm13[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm7[0],xmm0[1],xmm7[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2097152,2097152,2097152,2097152]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm13 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm13 = xmm13[0],xmm5[0],xmm13[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm13
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm13
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [4194304,4194304,4194304,4194304]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [8388608,8388608,8388608,8388608]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm15, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm15
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm15[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm14, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm14
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm14[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm12, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm12
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm12[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm11, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm11
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm11[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm10, %xmm0
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm10
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm10[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm5[0],xmm0[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm2
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm9, %xmm2
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm9
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm9[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm5[0],xmm2[1],xmm5[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm8, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm5 = xmm5[0],xmm4[0],xmm5[1],xmm4[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm8
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm2 = xmm8[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,2,2,3]
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm2
-; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm6
-; SSE2-NOPCLMUL-NEXT: packssdw %xmm2, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm6, %xmm0
+; SSE42-NEXT: paddw %xmm1, %xmm1
+; SSE42-NEXT: pxor %xmm0, %xmm1
+; SSE42-NEXT: movdqa %xmm1, %xmm0
+; SSE42-NEXT: psllw $2, %xmm0
+; SSE42-NEXT: pxor %xmm1, %xmm0
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: psllw $4, %xmm1
+; SSE42-NEXT: pxor %xmm0, %xmm1
+; SSE42-NEXT: movdqa %xmm1, %xmm3
+; SSE42-NEXT: psllw $8, %xmm3
+; SSE42-NEXT: pxor %xmm1, %xmm3
+; SSE42-NEXT: movdqa %xmm2, %xmm0
+; SSE42-NEXT: paddw %xmm0, %xmm0
+; SSE42-NEXT: pxor %xmm2, %xmm0
+; SSE42-NEXT: movdqa %xmm0, %xmm1
+; SSE42-NEXT: psllw $2, %xmm1
+; SSE42-NEXT: pxor %xmm0, %xmm1
+; SSE42-NEXT: movdqa %xmm1, %xmm2
+; SSE42-NEXT: psllw $4, %xmm2
+; SSE42-NEXT: pxor %xmm1, %xmm2
+; SSE42-NEXT: movdqa %xmm2, %xmm0
+; SSE42-NEXT: psllw $8, %xmm0
+; SSE42-NEXT: pxor %xmm2, %xmm0
+; SSE42-NEXT: psrlw $8, %xmm3
+; SSE42-NEXT: psrlw $8, %xmm0
+; SSE42-NEXT: packuswb %xmm3, %xmm0
+; SSE42-NEXT: retq
+;
+; AVX2-LABEL: clmulh_v16i8_allones:
+; AVX2: # %bb.0:
+; AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
+; AVX2-NEXT: vpaddw %ymm0, %ymm0, %ymm1
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpsllw $2, %ymm0, %ymm1
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpsllw $4, %ymm0, %ymm1
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpsllw $8, %ymm0, %ymm1
+; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX2-NEXT: vpsrlw $8, %ymm0, %ymm0
+; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
+; AVX2-NEXT: vzeroupper
+; AVX2-NEXT: retq
+;
+; AVX512-LABEL: clmulh_v16i8_allones:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
+; AVX512-NEXT: vpaddw %ymm0, %ymm0, %ymm1
+; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vpsllw $2, %ymm0, %ymm1
+; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vpsllw $4, %ymm0, %ymm1
+; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vpsllw $8, %ymm0, %ymm1
+; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; AVX512-NEXT: vpsrlw $8, %ymm0, %ymm0
+; AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
+; AVX512-NEXT: vpmovdb %zmm0, %xmm0
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
+; SSE42-PCLMUL-LABEL: clmulh_v16i8_allones:
+; SSE42-PCLMUL: # %bb.0:
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm1
+; SSE42-PCLMUL-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; SSE42-PCLMUL-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8],xmm1[8],xmm0[9],xmm1[9],xmm0[10],xmm1[10],xmm0[11],xmm1[11],xmm0[12],xmm1[12],xmm0[13],xmm1[13],xmm0[14],xmm1[14],xmm0[15],xmm1[15]
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: paddw %xmm1, %xmm1
+; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: psllw $2, %xmm0
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: psllw $4, %xmm1
+; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm3
+; SSE42-PCLMUL-NEXT: psllw $8, %xmm3
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm3
+; SSE42-PCLMUL-NEXT: movdqa %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: paddw %xmm0, %xmm0
+; SSE42-PCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: psllw $2, %xmm1
+; SSE42-PCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE42-PCLMUL-NEXT: movdqa %xmm1, %xmm2
+; SSE42-PCLMUL-NEXT: psllw $4, %xmm2
+; SSE42-PCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE42-PCLMUL-NEXT: movdqa %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: psllw $8, %xmm0
+; SSE42-PCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE42-PCLMUL-NEXT: psrlw $8, %xmm3
+; SSE42-PCLMUL-NEXT: psrlw $8, %xmm0
+; SSE42-PCLMUL-NEXT: packuswb %xmm3, %xmm0
+; SSE42-PCLMUL-NEXT: retq
+ %x.ext = zext <16 x i8> %x to <16 x i16>
+ %clmul = call <16 x i16> @llvm.clmul.v16i16(<16 x i16> %x.ext, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>)
+ %res.ext = lshr <16 x i16> %clmul, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
+ %res = trunc <16 x i16> %res.ext to <16 x i8>
+ ret <16 x i8> %res
+}
+
+define <8 x i16> @clmulh_v8i16_allones(<8 x i16> %x) nounwind {
+; SCALAR-LABEL: clmulh_v8i16_allones:
+; SCALAR: # %bb.0:
+; SCALAR-NEXT: pxor %xmm1, %xmm1
+; SCALAR-NEXT: movdqa %xmm0, %xmm2
+; SCALAR-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
+; SCALAR-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: paddd %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $2, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $4, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $8, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm0, %xmm1
+; SCALAR-NEXT: pslld $16, %xmm1
+; SCALAR-NEXT: pxor %xmm1, %xmm0
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: paddd %xmm1, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: pslld $2, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: pslld $4, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: movdqa %xmm1, %xmm2
+; SCALAR-NEXT: pslld $8, %xmm2
+; SCALAR-NEXT: pxor %xmm1, %xmm2
+; SCALAR-NEXT: movdqa %xmm2, %xmm1
+; SCALAR-NEXT: pslld $16, %xmm1
+; SCALAR-NEXT: pxor %xmm2, %xmm1
+; SCALAR-NEXT: psrad $16, %xmm1
+; SCALAR-NEXT: psrad $16, %xmm0
+; SCALAR-NEXT: packssdw %xmm1, %xmm0
+; SCALAR-NEXT: retq
+;
+; SSE2-NOPCLMUL-LABEL: clmulh_v8i16_allones:
+; SSE2-NOPCLMUL: # %bb.0:
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: punpckhwd {{.*#+}} xmm2 = xmm2[4],xmm1[4],xmm2[5],xmm1[5],xmm2[6],xmm1[6],xmm2[7],xmm1[7]
+; SSE2-NOPCLMUL-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: paddd %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $4, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $8, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $16, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: paddd %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pslld $2, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $4, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: pslld $8, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pslld $16, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm1
+; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm1
+; SSE2-NOPCLMUL-NEXT: psrad $16, %xmm0
+; SSE2-NOPCLMUL-NEXT: packssdw %xmm1, %xmm0
; SSE2-NOPCLMUL-NEXT: retq
;
; SSE2-PCLMUL-LABEL: clmulh_v8i16_allones:
@@ -12914,421 +9796,51 @@ define <4 x i32> @clmulh_v4i32_allones(<4 x i32> %x) nounwind {
; SCALAR-NEXT: psllq $32, %xmm0
; SCALAR-NEXT: pxor %xmm2, %xmm0
; SCALAR-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[1,3]
-; SCALAR-NEXT: retq
-;
-; SSE2-NOPCLMUL-LABEL: clmulh_v4i32_allones:
-; SSE2-NOPCLMUL: # %bb.0:
-; SSE2-NOPCLMUL-NEXT: subq $200, %rsp
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: punpckhdq {{.*#+}} xmm2 = xmm2[2],xmm1[2],xmm2[3],xmm1[3]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [2,2]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4,4]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [8,8]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [16,16]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [32,32]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [64,64]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [128,128]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, (%rsp) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [256,256]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [512,512]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [1024,1024]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2048,2048]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [4096,4096]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [8192,8192]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [16384,16384]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [32768,32768]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [65536,65536]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [131072,131072]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm15
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm15 # [262144,262144]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm14
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm14 # [524288,524288]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm13
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm13 # [1048576,1048576]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm12
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12 # [2097152,2097152]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4194304,4194304]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm11
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11 # [8388608,8388608]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm10
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm10 # [16777216,16777216]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm9
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm9 # [33554432,33554432]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm8
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm8 # [67108864,67108864]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm7
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7 # [134217728,134217728]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm6
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6 # [268435456,268435456]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm4
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [536870912,536870912]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [1073741824,1073741824]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [2147483648,2147483648]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm0
-; SSE2-NOPCLMUL-NEXT: punpckhdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
-; SSE2-NOPCLMUL-NEXT: # xmm0 = xmm0[2],mem[2],xmm0[3],mem[3]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa (%rsp), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SCALAR-NEXT: retq
+;
+; SSE2-NOPCLMUL-LABEL: clmulh_v4i32_allones:
+; SSE2-NOPCLMUL: # %bb.0:
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm2
+; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
+; SSE2-NOPCLMUL-NEXT: punpckhdq {{.*#+}} xmm0 = xmm0[2],xmm1[2],xmm0[3],xmm1[3]
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: paddq %xmm1, %xmm1
; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $2, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $4, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $8, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $16, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm15
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm15
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm14
-; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm14
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm13
-; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm13
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm12
-; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm12
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm12
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm11
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm11
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm10
-; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm10
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm9
-; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm9
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm8
-; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm8
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm7
-; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm7
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm6
-; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm6
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm4
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm5
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm5
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm2
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm0
-; SSE2-NOPCLMUL-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm4 = [2,2]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm4
; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [4,4]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm5 = [8,8]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm5
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [16,16]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm12 = [32,32]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm12
-; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm7 = [64,64]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm7
-; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [128,128]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm9 = [256,256]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm9
-; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm10 = [512,512]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm10
-; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm11 = [1024,1024]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm11
-; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm0 = [2048,2048]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [4096,4096]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm14 = [8192,8192]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm14
-; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm15 = [16384,16384]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm15
-; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [32768,32768]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm3 = [65536,65536]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [131072,131072]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [262144,262144]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [524288,524288]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [1048576,1048576]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [2097152,2097152]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm6 = [4194304,4194304]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [8388608,8388608]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm6, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [16777216,16777216]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, (%rsp) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [33554432,33554432]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [67108864,67108864]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [134217728,134217728]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [268435456,268435456]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NOPCLMUL-NEXT: paddq %xmm0, %xmm0
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $2, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm0
+; SSE2-NOPCLMUL-NEXT: psllq $4, %xmm0
; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm1 = [536870912,536870912]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm1
-; SSE2-NOPCLMUL-NEXT: movdqa {{.*#+}} xmm13 = [1073741824,1073741824]
-; SSE2-NOPCLMUL-NEXT: pmuludq %xmm2, %xmm13
-; SSE2-NOPCLMUL-NEXT: pmuludq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [2147483648,2147483648]
-; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm8
-; SSE2-NOPCLMUL-NEXT: punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Folded Reload
-; SSE2-NOPCLMUL-NEXT: # xmm8 = xmm8[0],mem[0],xmm8[1],mem[1]
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm8
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm8, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm5
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm5
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm5, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm12
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm7
-; SSE2-NOPCLMUL-NEXT: pxor %xmm12, %xmm7
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm7, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm9
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm9
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm10
-; SSE2-NOPCLMUL-NEXT: pxor %xmm9, %xmm10
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm11
-; SSE2-NOPCLMUL-NEXT: pxor %xmm10, %xmm11
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm11, %xmm0
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: psllq $8, %xmm1
+; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm1
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: psllq $16, %xmm2
+; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm2
+; SSE2-NOPCLMUL-NEXT: movdqa %xmm2, %xmm0
; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm0
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm14
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm15
-; SSE2-NOPCLMUL-NEXT: pxor %xmm14, %xmm15
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm15, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa %xmm3, %xmm0
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm6
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm6, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa (%rsp), %xmm4 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm3
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm3
-; SSE2-NOPCLMUL-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm4
-; SSE2-NOPCLMUL-NEXT: pxor %xmm3, %xmm4
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm1
-; SSE2-NOPCLMUL-NEXT: pxor %xmm4, %xmm1
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm13
-; SSE2-NOPCLMUL-NEXT: pxor %xmm1, %xmm13
-; SSE2-NOPCLMUL-NEXT: psllq $32, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm13, %xmm2
-; SSE2-NOPCLMUL-NEXT: pxor %xmm0, %xmm2
-; SSE2-NOPCLMUL-NEXT: shufps $221, {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Folded Reload
-; SSE2-NOPCLMUL-NEXT: # xmm2 = xmm2[1,3],mem[1,3]
-; SSE2-NOPCLMUL-NEXT: movaps %xmm2, %xmm0
-; SSE2-NOPCLMUL-NEXT: addq $200, %rsp
+; SSE2-NOPCLMUL-NEXT: pxor %xmm2, %xmm0
+; SSE2-NOPCLMUL-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,3],xmm3[1,3]
; SSE2-NOPCLMUL-NEXT: retq
;
; SSE2-PCLMUL-LABEL: clmulh_v4i32_allones:
@@ -13566,841 +10078,153 @@ define <2 x i64> @clmulh_v2i64_allones(<2 x i64> %x) nounwind {
;
; SSE2-NOPCLMUL-LABEL: clmulh_v2i64_allones:
; SSE2-NOPCLMUL: # %bb.0:
-; SSE2-NOPCLMUL-NEXT: pushq %r15
-; SSE2-NOPCLMUL-NEXT: pushq %r14
-; SSE2-NOPCLMUL-NEXT: pushq %r13
-; SSE2-NOPCLMUL-NEXT: pushq %r12
-; SSE2-NOPCLMUL-NEXT: pushq %rbx
; SSE2-NOPCLMUL-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
; SSE2-NOPCLMUL-NEXT: movq %xmm1, %rax
-; SSE2-NOPCLMUL-NEXT: movq %xmm0, %rcx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %xmm0, %rsi
+; SSE2-NOPCLMUL-NEXT: leaq (%rsi,%rsi), %r8
+; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r8
; SSE2-NOPCLMUL-NEXT: bswapq %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rsi, %rdx
-; SSE2-NOPCLMUL-NEXT: shrq $4, %rdx
-; SSE2-NOPCLMUL-NEXT: movabsq $1085102592571150095, %rdi # imm = 0xF0F0F0F0F0F0F0F
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %rdx
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %rsi
+; SSE2-NOPCLMUL-NEXT: movq %rsi, %rcx
+; SSE2-NOPCLMUL-NEXT: shrq $4, %rcx
+; SSE2-NOPCLMUL-NEXT: movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rcx
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rsi
; SSE2-NOPCLMUL-NEXT: shlq $4, %rsi
-; SSE2-NOPCLMUL-NEXT: orq %rdx, %rsi
-; SSE2-NOPCLMUL-NEXT: movabsq $3689348814741910323, %rdx # imm = 0x3333333333333333
-; SSE2-NOPCLMUL-NEXT: movq %rsi, %r8
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %r8
+; SSE2-NOPCLMUL-NEXT: orq %rcx, %rsi
+; SSE2-NOPCLMUL-NEXT: movabsq $3689348814741910323, %rcx # imm = 0x3333333333333333
+; SSE2-NOPCLMUL-NEXT: movq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rdi
; SSE2-NOPCLMUL-NEXT: shrq $2, %rsi
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %rsi
-; SSE2-NOPCLMUL-NEXT: leaq (%rsi,%r8,4), %r8
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rsi
+; SSE2-NOPCLMUL-NEXT: leaq (%rsi,%rdi,4), %rdi
; SSE2-NOPCLMUL-NEXT: movabsq $6148914691236517205, %rsi # imm = 0x5555555555555555
-; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r9
; SSE2-NOPCLMUL-NEXT: andq %rsi, %r9
-; SSE2-NOPCLMUL-NEXT: shrq %r8
-; SSE2-NOPCLMUL-NEXT: movq %r8, %r10
+; SSE2-NOPCLMUL-NEXT: shrq %rdi
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (%rdi,%r9,2), %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (%rdi,%rdi), %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: leaq (,%r9,4), %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $8, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: shlq $16, %r9
+; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: movq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $32, %rdi
+; SSE2-NOPCLMUL-NEXT: xorq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: bswapq %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: shrq $4, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rdi
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rdi
+; SSE2-NOPCLMUL-NEXT: orq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r9
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %r9
+; SSE2-NOPCLMUL-NEXT: shrq $2, %rdi
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (%rdi,%r9,4), %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %r10
; SSE2-NOPCLMUL-NEXT: andq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: leaq (%r10,%r9,2), %r9
-; SSE2-NOPCLMUL-NEXT: leaq (%r9,%r9), %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: leaq (,%r9,4), %r11
-; SSE2-NOPCLMUL-NEXT: leaq (,%r9,8), %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $5, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $6, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $7, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $8, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $9, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $10, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $11, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $12, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $13, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $15, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
+; SSE2-NOPCLMUL-NEXT: shrq %rdi
+; SSE2-NOPCLMUL-NEXT: movabsq $6148914691236517204, %r9 # imm = 0x5555555555555554
+; SSE2-NOPCLMUL-NEXT: andq %r9, %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (%rdi,%r10,2), %rdi
+; SSE2-NOPCLMUL-NEXT: shrq %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (,%r8,4), %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r8, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r10, %r8
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r8
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %r8
+; SSE2-NOPCLMUL-NEXT: movq %r8, %r10
+; SSE2-NOPCLMUL-NEXT: shlq $8, %r10
+; SSE2-NOPCLMUL-NEXT: xorq %r8, %r10
+; SSE2-NOPCLMUL-NEXT: movq %r10, %r11
; SSE2-NOPCLMUL-NEXT: shlq $16, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $17, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $18, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $19, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $20, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $21, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $22, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $23, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $24, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $25, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $26, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $27, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $28, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $29, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $30, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $31, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $32, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $33, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $34, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $35, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $36, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $37, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $38, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $39, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $40, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $41, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $42, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $43, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $44, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $45, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $46, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $47, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $48, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $49, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $50, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $51, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $52, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $53, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $54, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $55, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $56, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $57, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $58, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $59, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %r9, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $60, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r10
-; SSE2-NOPCLMUL-NEXT: movq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $61, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $62, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $63, %r8
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r8
+; SSE2-NOPCLMUL-NEXT: movq %r11, %r8
+; SSE2-NOPCLMUL-NEXT: shlq $32, %r8
; SSE2-NOPCLMUL-NEXT: xorq %r11, %r8
-; SSE2-NOPCLMUL-NEXT: bswapq %r8
-; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
-; SSE2-NOPCLMUL-NEXT: shrq $4, %r9
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %r9
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %r8
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r8
-; SSE2-NOPCLMUL-NEXT: orq %r9, %r8
-; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %r9
-; SSE2-NOPCLMUL-NEXT: shrq $2, %r8
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %r8
-; SSE2-NOPCLMUL-NEXT: leaq (%r8,%r9,4), %r8
-; SSE2-NOPCLMUL-NEXT: movq %r8, %r9
-; SSE2-NOPCLMUL-NEXT: andq %rsi, %r9
-; SSE2-NOPCLMUL-NEXT: shrq %r8
-; SSE2-NOPCLMUL-NEXT: movabsq $6148914691236517204, %r10 # imm = 0x5555555555555554
-; SSE2-NOPCLMUL-NEXT: andq %r10, %r8
-; SSE2-NOPCLMUL-NEXT: leaq (%r8,%r9,2), %r8
-; SSE2-NOPCLMUL-NEXT: shrq %r8
-; SSE2-NOPCLMUL-NEXT: leaq (%rcx,%rcx), %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: leaq (,%rcx,4), %r11
-; SSE2-NOPCLMUL-NEXT: leaq (,%rcx,8), %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $5, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $6, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $7, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $8, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $9, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $10, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $11, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $12, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $13, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $15, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $16, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $17, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $18, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $19, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $20, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $21, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $22, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $23, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $24, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $25, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $26, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $27, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $28, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $29, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $30, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $31, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $32, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $33, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $34, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $35, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $36, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $37, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $38, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $39, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $40, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $41, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $42, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $43, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $44, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $45, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $46, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $47, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $48, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $49, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $50, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $51, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $52, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $53, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $54, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $55, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $56, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $57, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $58, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $59, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $60, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $61, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rbx
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %r9
-; SSE2-NOPCLMUL-NEXT: shlq $62, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %r9
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %r8
+; SSE2-NOPCLMUL-NEXT: xorq %r8, %rdi
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rax), %r10
+; SSE2-NOPCLMUL-NEXT: xorq %rax, %r10
+; SSE2-NOPCLMUL-NEXT: bswapq %rax
; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
-; SSE2-NOPCLMUL-NEXT: bswapq %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: shrq $4, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r11
-; SSE2-NOPCLMUL-NEXT: orq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %rbx
-; SSE2-NOPCLMUL-NEXT: shrq $2, %r11
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %r11
-; SSE2-NOPCLMUL-NEXT: leaq (%r11,%rbx,4), %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rsi, %rbx
-; SSE2-NOPCLMUL-NEXT: shrq %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %r14
-; SSE2-NOPCLMUL-NEXT: andq %rsi, %r14
-; SSE2-NOPCLMUL-NEXT: leaq (%r14,%rbx,2), %rbx
-; SSE2-NOPCLMUL-NEXT: leaq (%rbx,%rbx), %r14
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: leaq (,%rbx,4), %r15
-; SSE2-NOPCLMUL-NEXT: leaq (,%rbx,8), %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $5, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $6, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $7, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $8, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $9, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $10, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $11, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $12, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $13, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $14, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $15, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $16, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $17, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $18, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $19, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
-; SSE2-NOPCLMUL-NEXT: shlq $20, %r13
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $21, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $22, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $23, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $24, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $25, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $26, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $27, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $28, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $29, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $30, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $31, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $32, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $33, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $34, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
-; SSE2-NOPCLMUL-NEXT: shlq $35, %r13
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $36, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $37, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $38, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $39, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $40, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $41, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $42, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $43, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $44, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $45, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $46, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $47, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $48, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $49, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $50, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $51, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $52, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $53, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r13
-; SSE2-NOPCLMUL-NEXT: shlq $54, %r13
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r13
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r15
-; SSE2-NOPCLMUL-NEXT: shlq $55, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r13, %r15
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r15
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $56, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $57, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $58, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $59, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r14
-; SSE2-NOPCLMUL-NEXT: shlq $60, %r14
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %r14
-; SSE2-NOPCLMUL-NEXT: movq %rbx, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $61, %r12
-; SSE2-NOPCLMUL-NEXT: xorq %r14, %r12
-; SSE2-NOPCLMUL-NEXT: shlq $62, %rbx
-; SSE2-NOPCLMUL-NEXT: xorq %r12, %rbx
-; SSE2-NOPCLMUL-NEXT: shlq $63, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r15, %r11
-; SSE2-NOPCLMUL-NEXT: bswapq %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %rbx
-; SSE2-NOPCLMUL-NEXT: shrq $4, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %rbx
-; SSE2-NOPCLMUL-NEXT: andq %rdi, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $4, %r11
-; SSE2-NOPCLMUL-NEXT: orq %rbx, %r11
-; SSE2-NOPCLMUL-NEXT: movq %r11, %rdi
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %rdi
-; SSE2-NOPCLMUL-NEXT: shrq $2, %r11
+; SSE2-NOPCLMUL-NEXT: shrq $4, %r11
; SSE2-NOPCLMUL-NEXT: andq %rdx, %r11
-; SSE2-NOPCLMUL-NEXT: leaq (%r11,%rdi,4), %rdx
-; SSE2-NOPCLMUL-NEXT: andq %rdx, %rsi
-; SSE2-NOPCLMUL-NEXT: shrq %rdx
-; SSE2-NOPCLMUL-NEXT: andq %r10, %rdx
-; SSE2-NOPCLMUL-NEXT: leaq (%rdx,%rsi,2), %rdx
-; SSE2-NOPCLMUL-NEXT: shrq %rdx
-; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rax), %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: leaq (,%rax,4), %rdi
-; SSE2-NOPCLMUL-NEXT: leaq (,%rax,8), %r10
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $4, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $5, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $6, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $7, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $8, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $9, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $10, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $11, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $12, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $13, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $14, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $15, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $16, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $17, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $18, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $19, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rax
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rax
+; SSE2-NOPCLMUL-NEXT: orq %r11, %rax
; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $20, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $21, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $22, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $23, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $24, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $25, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $26, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $27, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $28, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $29, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $30, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $31, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $32, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $33, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $34, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %r11
+; SSE2-NOPCLMUL-NEXT: shrq $2, %rax
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rax
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%r11,4), %rax
; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $35, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $36, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $37, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $38, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $39, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $40, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $41, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $42, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $43, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $44, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $45, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $46, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $47, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $48, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $49, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $50, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $51, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $52, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $53, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %r10
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %r11
+; SSE2-NOPCLMUL-NEXT: shrq %rax
+; SSE2-NOPCLMUL-NEXT: andq %rsi, %rax
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%r11,2), %rax
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rax), %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: leaq (,%r11,4), %rax
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rax
; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
-; SSE2-NOPCLMUL-NEXT: shlq $54, %r11
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %r11
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rdi
-; SSE2-NOPCLMUL-NEXT: shlq $55, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %r11, %rdi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $56, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $57, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $58, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $59, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $60, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: movq %rax, %r10
-; SSE2-NOPCLMUL-NEXT: shlq $61, %r10
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %r10
-; SSE2-NOPCLMUL-NEXT: movq %rax, %rsi
-; SSE2-NOPCLMUL-NEXT: shlq $62, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %r10, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rdi, %rsi
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rdx
-; SSE2-NOPCLMUL-NEXT: shlq $63, %rcx
-; SSE2-NOPCLMUL-NEXT: xorq %r9, %rcx
-; SSE2-NOPCLMUL-NEXT: shrdq $63, %r8, %rcx
-; SSE2-NOPCLMUL-NEXT: shlq $63, %rax
-; SSE2-NOPCLMUL-NEXT: xorq %rsi, %rax
-; SSE2-NOPCLMUL-NEXT: shrdq $63, %rdx, %rax
-; SSE2-NOPCLMUL-NEXT: movq %rcx, %xmm0
+; SSE2-NOPCLMUL-NEXT: shlq $4, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rax
+; SSE2-NOPCLMUL-NEXT: shlq $8, %rax
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rax
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: shlq $16, %r11
+; SSE2-NOPCLMUL-NEXT: xorq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: movq %r11, %rax
+; SSE2-NOPCLMUL-NEXT: shlq $32, %rax
+; SSE2-NOPCLMUL-NEXT: xorq %r11, %rax
+; SSE2-NOPCLMUL-NEXT: bswapq %rax
+; SSE2-NOPCLMUL-NEXT: movq %rax, %r11
+; SSE2-NOPCLMUL-NEXT: shrq $4, %r11
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %r11
+; SSE2-NOPCLMUL-NEXT: andq %rdx, %rax
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rax
+; SSE2-NOPCLMUL-NEXT: orq %r11, %rax
+; SSE2-NOPCLMUL-NEXT: movq %rax, %rdx
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rdx
+; SSE2-NOPCLMUL-NEXT: shrq $2, %rax
+; SSE2-NOPCLMUL-NEXT: andq %rcx, %rax
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rdx,4), %rax
+; SSE2-NOPCLMUL-NEXT: andq %rax, %rsi
+; SSE2-NOPCLMUL-NEXT: shrq %rax
+; SSE2-NOPCLMUL-NEXT: andq %r9, %rax
+; SSE2-NOPCLMUL-NEXT: leaq (%rax,%rsi,2), %rax
+; SSE2-NOPCLMUL-NEXT: shrq %rax
+; SSE2-NOPCLMUL-NEXT: leaq (,%r10,4), %rcx
+; SSE2-NOPCLMUL-NEXT: xorq %r10, %rcx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rdx
+; SSE2-NOPCLMUL-NEXT: shlq $4, %rdx
+; SSE2-NOPCLMUL-NEXT: xorq %rcx, %rdx
+; SSE2-NOPCLMUL-NEXT: movq %rdx, %rcx
+; SSE2-NOPCLMUL-NEXT: shlq $8, %rcx
+; SSE2-NOPCLMUL-NEXT: xorq %rdx, %rcx
+; SSE2-NOPCLMUL-NEXT: movq %rcx, %rdx
+; SSE2-NOPCLMUL-NEXT: shlq $16, %rdx
+; SSE2-NOPCLMUL-NEXT: xorq %rcx, %rdx
+; SSE2-NOPCLMUL-NEXT: movq %rdx, %rcx
+; SSE2-NOPCLMUL-NEXT: shlq $32, %rcx
+; SSE2-NOPCLMUL-NEXT: xorq %rdx, %rcx
+; SSE2-NOPCLMUL-NEXT: xorq %rcx, %rax
+; SSE2-NOPCLMUL-NEXT: shldq $1, %rcx, %rax
+; SSE2-NOPCLMUL-NEXT: shldq $1, %r8, %rdi
+; SSE2-NOPCLMUL-NEXT: movq %rdi, %xmm0
; SSE2-NOPCLMUL-NEXT: movq %rax, %xmm1
; SSE2-NOPCLMUL-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
-; SSE2-NOPCLMUL-NEXT: popq %rbx
-; SSE2-NOPCLMUL-NEXT: popq %r12
-; SSE2-NOPCLMUL-NEXT: popq %r13
-; SSE2-NOPCLMUL-NEXT: popq %r14
-; SSE2-NOPCLMUL-NEXT: popq %r15
; SSE2-NOPCLMUL-NEXT: retq
;
; SSE2-PCLMUL-LABEL: clmulh_v2i64_allones:
diff --git a/llvm/test/CodeGen/X86/clmul.ll b/llvm/test/CodeGen/X86/clmul.ll
index 1a59ce2bb3ea0..199165b3e4da3 100644
--- a/llvm/test/CodeGen/X86/clmul.ll
+++ b/llvm/test/CodeGen/X86/clmul.ll
@@ -3621,21 +3621,11 @@ define i8 @clmul_i8_allones(i8 %x) nounwind {
; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
; SCALAR-NEXT: leal (%rdi,%rdi), %eax
; SCALAR-NEXT: xorb %dil, %al
-; SCALAR-NEXT: leal (,%rdi,4), %ecx
-; SCALAR-NEXT: leal (,%rdi,8), %edx
-; SCALAR-NEXT: xorb %cl, %dl
-; SCALAR-NEXT: xorb %al, %dl
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shlb $4, %al
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shlb $5, %cl
+; SCALAR-NEXT: leal (,%rax,4), %ecx
; SCALAR-NEXT: xorb %al, %cl
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shlb $6, %al
+; SCALAR-NEXT: movl %ecx, %eax
+; SCALAR-NEXT: shlb $4, %al
; SCALAR-NEXT: xorb %cl, %al
-; SCALAR-NEXT: xorb %dl, %al
-; SCALAR-NEXT: shlb $7, %dil
-; SCALAR-NEXT: xorb %dil, %al
; SCALAR-NEXT: retq
;
; SSE-PCLMUL-LABEL: clmul_i8_allones:
@@ -3667,44 +3657,13 @@ define i16 @clmul_i16_allones(i16 %x) nounwind {
; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
; SCALAR-NEXT: leal (%rdi,%rdi), %eax
; SCALAR-NEXT: xorl %edi, %eax
-; SCALAR-NEXT: leal (,%rdi,4), %ecx
-; SCALAR-NEXT: leal (,%rdi,8), %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $4, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $5, %ecx
+; SCALAR-NEXT: leal (,%rax,4), %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $6, %eax
-; SCALAR-NEXT: xorl %ecx, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $7, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $8, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $9, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $10, %edx
+; SCALAR-NEXT: movl %ecx, %edx
+; SCALAR-NEXT: shll $4, %edx
; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $11, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $12, %ecx
-; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %esi
-; SCALAR-NEXT: shll $13, %esi
-; SCALAR-NEXT: xorl %ecx, %esi
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $14, %eax
-; SCALAR-NEXT: xorl %esi, %eax
-; SCALAR-NEXT: shll $15, %edi
-; SCALAR-NEXT: xorl %edi, %eax
+; SCALAR-NEXT: movl %edx, %eax
+; SCALAR-NEXT: shll $8, %eax
; SCALAR-NEXT: xorl %edx, %eax
; SCALAR-NEXT: # kill: def $ax killed $ax killed $eax
; SCALAR-NEXT: retq
@@ -3738,92 +3697,16 @@ define i32 @clmul_i32_allones(i32 %x) nounwind {
; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
; SCALAR-NEXT: leal (%rdi,%rdi), %eax
; SCALAR-NEXT: xorl %edi, %eax
-; SCALAR-NEXT: leal (,%rdi,4), %ecx
-; SCALAR-NEXT: leal (,%rdi,8), %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $4, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $5, %ecx
-; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $6, %eax
-; SCALAR-NEXT: xorl %ecx, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $7, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $8, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $9, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $10, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $11, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $12, %ecx
+; SCALAR-NEXT: leal (,%rax,4), %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $13, %eax
+; SCALAR-NEXT: movl %ecx, %eax
+; SCALAR-NEXT: shll $4, %eax
; SCALAR-NEXT: xorl %ecx, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $14, %ecx
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $8, %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %esi
-; SCALAR-NEXT: shll $15, %esi
-; SCALAR-NEXT: xorl %ecx, %esi
-; SCALAR-NEXT: xorl %edx, %esi
-; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: movl %ecx, %eax
; SCALAR-NEXT: shll $16, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $17, %ecx
-; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $18, %eax
-; SCALAR-NEXT: xorl %ecx, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $19, %ecx
-; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $20, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $21, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: xorl %esi, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $22, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $23, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $24, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $25, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $26, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $27, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $28, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $29, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $30, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: shll $31, %edi
-; SCALAR-NEXT: xorl %edi, %eax
; SCALAR-NEXT: xorl %ecx, %eax
; SCALAR-NEXT: retq
;
@@ -3855,189 +3738,20 @@ define i64 @clmul_i64_allones(i64 %x) nounwind {
; SCALAR: # %bb.0:
; SCALAR-NEXT: leaq (%rdi,%rdi), %rax
; SCALAR-NEXT: xorq %rdi, %rax
-; SCALAR-NEXT: leaq (,%rdi,4), %rcx
-; SCALAR-NEXT: leaq (,%rdi,8), %rdx
-; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: leaq (,%rax,4), %rcx
; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: movq %rcx, %rax
; SCALAR-NEXT: shlq $4, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $5, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $6, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: xorq %rcx, %rax
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $7, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $8, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $9, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $10, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $11, %rax
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $12, %rcx
-; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $13, %rax
-; SCALAR-NEXT: xorq %rcx, %rax
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $14, %rcx
-; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $15, %rax
-; SCALAR-NEXT: xorq %rcx, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $16, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $17, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $18, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $19, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $20, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $21, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $22, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $23, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $24, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $25, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $26, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $27, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $28, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
; SCALAR-NEXT: xorq %rcx, %rax
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $29, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $30, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $31, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $32, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $33, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $34, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $35, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $36, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $8, %rcx
; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $37, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $38, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $39, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $40, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $41, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $42, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $43, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $44, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $45, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: xorq %rcx, %rax
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $46, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $47, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $48, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $49, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $50, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $51, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $52, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $53, %rdx
+; SCALAR-NEXT: movq %rcx, %rdx
+; SCALAR-NEXT: shlq $16, %rdx
; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $54, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $55, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $56, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $57, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $58, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $59, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $60, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $61, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $62, %rax
+; SCALAR-NEXT: movq %rdx, %rax
+; SCALAR-NEXT: shlq $32, %rax
; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: shlq $63, %rdi
-; SCALAR-NEXT: xorq %rdi, %rax
-; SCALAR-NEXT: xorq %rcx, %rax
; SCALAR-NEXT: retq
;
; SSE-PCLMUL-LABEL: clmul_i64_allones:
@@ -4067,18 +3781,11 @@ define i7 @clmul_i7_allones(i7 %x) nounwind {
; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
; SCALAR-NEXT: leal (%rdi,%rdi), %eax
; SCALAR-NEXT: xorb %dil, %al
-; SCALAR-NEXT: leal (,%rdi,4), %ecx
-; SCALAR-NEXT: leal (,%rdi,8), %edx
-; SCALAR-NEXT: xorb %cl, %dl
-; SCALAR-NEXT: xorb %al, %dl
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shlb $4, %cl
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shlb $5, %al
+; SCALAR-NEXT: leal (,%rax,4), %ecx
+; SCALAR-NEXT: xorb %al, %cl
+; SCALAR-NEXT: movl %ecx, %eax
+; SCALAR-NEXT: shlb $4, %al
; SCALAR-NEXT: xorb %cl, %al
-; SCALAR-NEXT: shlb $6, %dil
-; SCALAR-NEXT: xorb %dil, %al
-; SCALAR-NEXT: xorb %dl, %al
; SCALAR-NEXT: retq
;
; SSE-PCLMUL-LABEL: clmul_i7_allones:
@@ -4110,27 +3817,14 @@ define i10 @clmul_i10_allones(i10 %x) nounwind {
; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
; SCALAR-NEXT: leal (%rdi,%rdi), %eax
; SCALAR-NEXT: xorl %edi, %eax
-; SCALAR-NEXT: leal (,%rdi,4), %ecx
-; SCALAR-NEXT: leal (,%rdi,8), %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $4, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $5, %ecx
+; SCALAR-NEXT: leal (,%rax,4), %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %esi
-; SCALAR-NEXT: shll $6, %esi
-; SCALAR-NEXT: xorl %ecx, %esi
-; SCALAR-NEXT: xorl %edx, %esi
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $7, %ecx
-; SCALAR-NEXT: movl %edi, %eax
+; SCALAR-NEXT: movl %ecx, %edx
+; SCALAR-NEXT: shll $4, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edx, %eax
; SCALAR-NEXT: shll $8, %eax
-; SCALAR-NEXT: xorl %ecx, %eax
-; SCALAR-NEXT: shll $9, %edi
-; SCALAR-NEXT: xorl %edi, %eax
-; SCALAR-NEXT: xorl %esi, %eax
+; SCALAR-NEXT: xorl %edx, %eax
; SCALAR-NEXT: # kill: def $ax killed $ax killed $eax
; SCALAR-NEXT: retq
;
@@ -4163,72 +3857,17 @@ define i25 @clmul_i25_allones(i25 %x) nounwind {
; SCALAR-NEXT: # kill: def $edi killed $edi def $rdi
; SCALAR-NEXT: leal (%rdi,%rdi), %eax
; SCALAR-NEXT: xorl %edi, %eax
-; SCALAR-NEXT: leal (,%rdi,4), %ecx
-; SCALAR-NEXT: leal (,%rdi,8), %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $4, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $5, %ecx
-; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $6, %eax
-; SCALAR-NEXT: xorl %ecx, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $7, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $8, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $9, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $10, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $11, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $12, %ecx
+; SCALAR-NEXT: leal (,%rax,4), %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $13, %eax
+; SCALAR-NEXT: movl %ecx, %eax
+; SCALAR-NEXT: shll $4, %eax
; SCALAR-NEXT: xorl %ecx, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $14, %ecx
+; SCALAR-NEXT: movl %eax, %ecx
+; SCALAR-NEXT: shll $8, %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $15, %eax
-; SCALAR-NEXT: xorl %ecx, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $16, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $17, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $18, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $19, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $20, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $21, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $22, %ecx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $23, %eax
+; SCALAR-NEXT: movl %ecx, %eax
+; SCALAR-NEXT: shll $16, %eax
; SCALAR-NEXT: xorl %ecx, %eax
-; SCALAR-NEXT: shll $24, %edi
-; SCALAR-NEXT: xorl %edi, %eax
-; SCALAR-NEXT: xorl %edx, %eax
; SCALAR-NEXT: retq
;
; SSE-PCLMUL-LABEL: clmul_i25_allones:
@@ -4259,129 +3898,20 @@ define i44 @clmul_i44_allones(i44 %x) nounwind {
; SCALAR: # %bb.0:
; SCALAR-NEXT: leaq (%rdi,%rdi), %rax
; SCALAR-NEXT: xorq %rdi, %rax
-; SCALAR-NEXT: leaq (,%rdi,4), %rcx
-; SCALAR-NEXT: leaq (,%rdi,8), %rdx
-; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: leaq (,%rax,4), %rcx
; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: movq %rcx, %rax
; SCALAR-NEXT: shlq $4, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $5, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $6, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: xorq %rcx, %rax
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $7, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $8, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $9, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $10, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $11, %rax
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $12, %rcx
-; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $13, %rax
-; SCALAR-NEXT: xorq %rcx, %rax
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $14, %rcx
-; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $15, %rax
; SCALAR-NEXT: xorq %rcx, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $16, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $17, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $18, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $19, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $20, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $21, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
+; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: shlq $8, %rcx
; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $22, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $23, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $24, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $25, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $26, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $27, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $28, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: xorq %rcx, %rax
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $29, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $30, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $31, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $32, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $33, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $34, %rdx
+; SCALAR-NEXT: movq %rcx, %rdx
+; SCALAR-NEXT: shlq $16, %rdx
; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $35, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rcx
-; SCALAR-NEXT: shlq $36, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $37, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $38, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $39, %rax
+; SCALAR-NEXT: movq %rdx, %rax
+; SCALAR-NEXT: shlq $32, %rax
; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $40, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $41, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $42, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: shlq $43, %rdi
-; SCALAR-NEXT: xorq %rdi, %rax
-; SCALAR-NEXT: xorq %rcx, %rax
; SCALAR-NEXT: retq
;
; SSE-PCLMUL-LABEL: clmul_i44_allones:
@@ -4411,41 +3941,14 @@ define i8 @clmulr_i8_allones(i8 %x) nounwind {
; SCALAR-NEXT: movzbl %dil, %eax
; SCALAR-NEXT: leal (%rax,%rax), %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: leal (,%rax,4), %edx
-; SCALAR-NEXT: leal (,%rax,8), %esi
-; SCALAR-NEXT: xorl %edx, %esi
-; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: leal (,%rcx,4), %eax
+; SCALAR-NEXT: xorl %ecx, %eax
; SCALAR-NEXT: movl %eax, %ecx
; SCALAR-NEXT: shll $4, %ecx
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $5, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %eax, %ecx
-; SCALAR-NEXT: shll $6, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: xorl %esi, %ecx
-; SCALAR-NEXT: shll $7, %eax
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $8, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $9, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $10, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $11, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $12, %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $13, %eax
+; SCALAR-NEXT: movl %ecx, %eax
+; SCALAR-NEXT: shll $8, %eax
; SCALAR-NEXT: xorl %ecx, %eax
-; SCALAR-NEXT: shll $14, %edi
-; SCALAR-NEXT: xorl %edi, %eax
-; SCALAR-NEXT: xorl %edx, %eax
; SCALAR-NEXT: shrl $7, %eax
; SCALAR-NEXT: # kill: def $al killed $al killed $eax
; SCALAR-NEXT: retq
@@ -4486,89 +3989,17 @@ define i16 @clmulr_i16_allones(i16 %x) nounwind {
; SCALAR-NEXT: movzwl %di, %eax
; SCALAR-NEXT: leal (%rax,%rax), %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: leal (,%rax,4), %edx
-; SCALAR-NEXT: leal (,%rax,8), %esi
-; SCALAR-NEXT: xorl %edx, %esi
-; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: leal (,%rcx,4), %eax
+; SCALAR-NEXT: xorl %ecx, %eax
; SCALAR-NEXT: movl %eax, %ecx
; SCALAR-NEXT: shll $4, %ecx
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $5, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %eax, %ecx
-; SCALAR-NEXT: shll $6, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: xorl %esi, %ecx
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $7, %edx
-; SCALAR-NEXT: movl %eax, %esi
-; SCALAR-NEXT: shll $8, %esi
-; SCALAR-NEXT: xorl %edx, %esi
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $9, %edx
-; SCALAR-NEXT: xorl %esi, %edx
-; SCALAR-NEXT: movl %eax, %esi
-; SCALAR-NEXT: shll $10, %esi
-; SCALAR-NEXT: xorl %edx, %esi
-; SCALAR-NEXT: xorl %ecx, %esi
-; SCALAR-NEXT: movl %eax, %ecx
-; SCALAR-NEXT: shll $11, %ecx
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $12, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %eax, %ecx
-; SCALAR-NEXT: shll $13, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $14, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: shll $15, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: xorl %esi, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $16, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $17, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $18, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $19, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $20, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $21, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $22, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $23, %eax
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $24, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $25, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $26, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $27, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $28, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $29, %eax
+; SCALAR-NEXT: movl %ecx, %edx
+; SCALAR-NEXT: shll $8, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edx, %eax
+; SCALAR-NEXT: shll $16, %eax
; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: shll $30, %edi
-; SCALAR-NEXT: xorl %edi, %eax
-; SCALAR-NEXT: xorl %ecx, %eax
; SCALAR-NEXT: shrl $15, %eax
; SCALAR-NEXT: # kill: def $ax killed $ax killed $eax
; SCALAR-NEXT: retq
@@ -4609,186 +4040,20 @@ define i32 @clmulr_i32_allones(i32 %x) nounwind {
; SCALAR-NEXT: movl %edi, %eax
; SCALAR-NEXT: leaq (%rax,%rax), %rcx
; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: leaq (,%rax,4), %rdx
-; SCALAR-NEXT: leaq (,%rax,8), %rsi
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: leaq (,%rcx,4), %rax
+; SCALAR-NEXT: xorq %rcx, %rax
; SCALAR-NEXT: movq %rax, %rcx
; SCALAR-NEXT: shlq $4, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $5, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rcx, %rax
+; SCALAR-NEXT: shlq $8, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $6, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $7, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $8, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $9, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $10, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $11, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $12, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $13, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $14, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $15, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $16, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $17, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $18, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $19, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdi
-; SCALAR-NEXT: shlq $20, %rdi
-; SCALAR-NEXT: xorq %rsi, %rdi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $21, %rdx
-; SCALAR-NEXT: xorq %rdi, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $22, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $23, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $24, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $25, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $26, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $27, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $28, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $29, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $30, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $31, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $32, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $33, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $34, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdi
-; SCALAR-NEXT: shlq $35, %rdi
-; SCALAR-NEXT: xorq %rsi, %rdi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $36, %rdx
-; SCALAR-NEXT: xorq %rdi, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $37, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $38, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $39, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $40, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $41, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $42, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $43, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $44, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $45, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $46, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $47, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $48, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $49, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $50, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $51, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $52, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $53, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdi
-; SCALAR-NEXT: shlq $54, %rdi
-; SCALAR-NEXT: xorq %rsi, %rdi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $55, %rdx
-; SCALAR-NEXT: xorq %rdi, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $56, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $57, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $58, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $59, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $60, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $61, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: shlq $62, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
+; SCALAR-NEXT: shlq $16, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rcx, %rax
+; SCALAR-NEXT: shlq $32, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
; SCALAR-NEXT: shrq $31, %rax
; SCALAR-NEXT: # kill: def $eax killed $eax killed $rax
; SCALAR-NEXT: retq
@@ -4824,419 +4089,78 @@ define i32 @clmulr_i32_allones(i32 %x) nounwind {
define i64 @clmulr_i64_allones(i64 %x) nounwind {
; SCALAR-LABEL: clmulr_i64_allones:
; SCALAR: # %bb.0:
-; SCALAR-NEXT: pushq %rbx
+; SCALAR-NEXT: leaq (%rdi,%rdi), %rcx
+; SCALAR-NEXT: xorq %rdi, %rcx
+; SCALAR-NEXT: bswapq %rdi
; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: bswapq %rax
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shrq $4, %rcx
-; SCALAR-NEXT: movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F
-; SCALAR-NEXT: andq %rdx, %rcx
-; SCALAR-NEXT: andq %rdx, %rax
-; SCALAR-NEXT: shlq $4, %rax
-; SCALAR-NEXT: orq %rcx, %rax
-; SCALAR-NEXT: movabsq $3689348814741910323, %rcx # imm = 0x3333333333333333
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: andq %rcx, %rsi
-; SCALAR-NEXT: shrq $2, %rax
-; SCALAR-NEXT: andq %rcx, %rax
-; SCALAR-NEXT: leaq (%rax,%rsi,4), %rsi
-; SCALAR-NEXT: movabsq $6148914691236517205, %rax # imm = 0x5555555555555555
-; SCALAR-NEXT: movq %rsi, %r8
-; SCALAR-NEXT: andq %rax, %r8
-; SCALAR-NEXT: shrq %rsi
-; SCALAR-NEXT: movq %rsi, %r9
-; SCALAR-NEXT: andq %rax, %r9
-; SCALAR-NEXT: leaq (%r9,%r8,2), %r8
-; SCALAR-NEXT: leaq (%r8,%r8), %r9
-; SCALAR-NEXT: xorq %r8, %r9
-; SCALAR-NEXT: leaq (,%r8,4), %r10
-; SCALAR-NEXT: leaq (,%r8,8), %r11
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $4, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $5, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $6, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: xorq %r10, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $7, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $8, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $9, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $10, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $11, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $12, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $13, %r9
-; SCALAR-NEXT: xorq %r10, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $14, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $15, %r9
-; SCALAR-NEXT: xorq %r10, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $16, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $17, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $18, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $19, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %rbx
-; SCALAR-NEXT: shlq $20, %rbx
-; SCALAR-NEXT: xorq %r11, %rbx
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $21, %r10
-; SCALAR-NEXT: xorq %rbx, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $22, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $23, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $24, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $25, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $26, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $27, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $28, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: xorq %r10, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $29, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $30, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $31, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $32, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $33, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $34, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %rbx
-; SCALAR-NEXT: shlq $35, %rbx
-; SCALAR-NEXT: xorq %r11, %rbx
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $36, %r10
-; SCALAR-NEXT: xorq %rbx, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $37, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $38, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $39, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $40, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $41, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $42, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $43, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $44, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $45, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: xorq %r10, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $46, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $47, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $48, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $49, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $50, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $51, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $52, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $53, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %rbx
-; SCALAR-NEXT: shlq $54, %rbx
-; SCALAR-NEXT: xorq %r11, %rbx
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $55, %r10
-; SCALAR-NEXT: xorq %rbx, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $56, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $57, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $58, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $59, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $60, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $61, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: shlq $62, %r8
-; SCALAR-NEXT: xorq %r11, %r8
-; SCALAR-NEXT: shlq $63, %rsi
-; SCALAR-NEXT: xorq %r8, %rsi
-; SCALAR-NEXT: xorq %r10, %rsi
-; SCALAR-NEXT: bswapq %rsi
-; SCALAR-NEXT: movq %rsi, %r8
-; SCALAR-NEXT: shrq $4, %r8
-; SCALAR-NEXT: andq %rdx, %r8
-; SCALAR-NEXT: andq %rdx, %rsi
-; SCALAR-NEXT: shlq $4, %rsi
-; SCALAR-NEXT: orq %r8, %rsi
-; SCALAR-NEXT: movq %rsi, %rdx
-; SCALAR-NEXT: andq %rcx, %rdx
-; SCALAR-NEXT: shrq $2, %rsi
-; SCALAR-NEXT: andq %rcx, %rsi
-; SCALAR-NEXT: leaq (%rsi,%rdx,4), %rcx
-; SCALAR-NEXT: andq %rcx, %rax
-; SCALAR-NEXT: shrq %rcx
-; SCALAR-NEXT: movabsq $6148914691236517204, %rdx # imm = 0x5555555555555554
-; SCALAR-NEXT: andq %rcx, %rdx
-; SCALAR-NEXT: leaq (%rdx,%rax,2), %rcx
-; SCALAR-NEXT: shrq %rcx
-; SCALAR-NEXT: leaq (%rdi,%rdi), %rax
-; SCALAR-NEXT: xorq %rdi, %rax
-; SCALAR-NEXT: leaq (,%rdi,4), %rdx
-; SCALAR-NEXT: leaq (,%rdi,8), %rsi
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $4, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $5, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $6, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $7, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $8, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $9, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $10, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $11, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $12, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $13, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $14, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $15, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $16, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $17, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: shrq $4, %rax
+; SCALAR-NEXT: movabsq $1085102592571150095, %rsi # imm = 0xF0F0F0F0F0F0F0F
+; SCALAR-NEXT: andq %rsi, %rax
+; SCALAR-NEXT: andq %rsi, %rdi
+; SCALAR-NEXT: shlq $4, %rdi
+; SCALAR-NEXT: orq %rax, %rdi
+; SCALAR-NEXT: movabsq $3689348814741910323, %rax # imm = 0x3333333333333333
; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $18, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $19, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: andq %rax, %rdx
+; SCALAR-NEXT: shrq $2, %rdi
+; SCALAR-NEXT: andq %rax, %rdi
+; SCALAR-NEXT: leaq (%rdi,%rdx,4), %rdi
+; SCALAR-NEXT: movabsq $6148914691236517205, %rdx # imm = 0x5555555555555555
; SCALAR-NEXT: movq %rdi, %r8
-; SCALAR-NEXT: shlq $20, %r8
-; SCALAR-NEXT: xorq %rsi, %r8
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $21, %rdx
-; SCALAR-NEXT: xorq %r8, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $22, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $23, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $24, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $25, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $26, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $27, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $28, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $29, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $30, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $31, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $32, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $33, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $34, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: andq %rdx, %r8
+; SCALAR-NEXT: shrq %rdi
+; SCALAR-NEXT: andq %rdx, %rdi
+; SCALAR-NEXT: leaq (%rdi,%r8,2), %rdi
+; SCALAR-NEXT: leaq (%rdi,%rdi), %r8
+; SCALAR-NEXT: xorq %rdi, %r8
+; SCALAR-NEXT: leaq (,%r8,4), %rdi
+; SCALAR-NEXT: xorq %r8, %rdi
; SCALAR-NEXT: movq %rdi, %r8
-; SCALAR-NEXT: shlq $35, %r8
-; SCALAR-NEXT: xorq %rsi, %r8
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $36, %rdx
-; SCALAR-NEXT: xorq %r8, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $37, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $38, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $39, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $40, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $41, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $42, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $43, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $44, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $45, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $46, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $47, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $48, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $49, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $50, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $51, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $52, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $53, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
+; SCALAR-NEXT: shlq $4, %r8
+; SCALAR-NEXT: xorq %rdi, %r8
+; SCALAR-NEXT: movq %r8, %rdi
+; SCALAR-NEXT: shlq $8, %rdi
+; SCALAR-NEXT: xorq %r8, %rdi
; SCALAR-NEXT: movq %rdi, %r8
-; SCALAR-NEXT: shlq $54, %r8
-; SCALAR-NEXT: xorq %rsi, %r8
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $55, %rdx
-; SCALAR-NEXT: xorq %r8, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $56, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $57, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $58, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $59, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $60, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: shlq $16, %r8
+; SCALAR-NEXT: xorq %rdi, %r8
+; SCALAR-NEXT: movq %r8, %rdi
+; SCALAR-NEXT: shlq $32, %rdi
+; SCALAR-NEXT: xorq %r8, %rdi
+; SCALAR-NEXT: bswapq %rdi
+; SCALAR-NEXT: movq %rdi, %r8
+; SCALAR-NEXT: shrq $4, %r8
+; SCALAR-NEXT: andq %rsi, %r8
+; SCALAR-NEXT: andq %rsi, %rdi
+; SCALAR-NEXT: shlq $4, %rdi
+; SCALAR-NEXT: orq %r8, %rdi
; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $61, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $62, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
+; SCALAR-NEXT: andq %rax, %rsi
+; SCALAR-NEXT: shrq $2, %rdi
+; SCALAR-NEXT: andq %rax, %rdi
+; SCALAR-NEXT: leaq (%rdi,%rsi,4), %rax
+; SCALAR-NEXT: andq %rax, %rdx
+; SCALAR-NEXT: shrq %rax
+; SCALAR-NEXT: movabsq $6148914691236517204, %rsi # imm = 0x5555555555555554
+; SCALAR-NEXT: andq %rax, %rsi
+; SCALAR-NEXT: leaq (%rsi,%rdx,2), %rax
+; SCALAR-NEXT: shrq %rax
+; SCALAR-NEXT: leaq (,%rcx,4), %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdx, %rcx
+; SCALAR-NEXT: shlq $4, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rcx, %rdx
+; SCALAR-NEXT: shlq $8, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: movq %rdx, %rcx
+; SCALAR-NEXT: shlq $16, %rcx
+; SCALAR-NEXT: xorq %rdx, %rcx
+; SCALAR-NEXT: movq %rcx, %rdx
+; SCALAR-NEXT: shlq $32, %rdx
+; SCALAR-NEXT: xorq %rcx, %rdx
; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: shlq $63, %rdi
-; SCALAR-NEXT: xorq %rdi, %rax
-; SCALAR-NEXT: shrdq $63, %rcx, %rax
-; SCALAR-NEXT: popq %rbx
+; SCALAR-NEXT: shldq $1, %rdx, %rax
; SCALAR-NEXT: retq
;
; SSE2-PCLMUL-LABEL: clmulr_i64_allones:
@@ -5288,44 +4212,14 @@ define i8 @clmulh_i8_allones(i8 %x) nounwind {
; SCALAR-NEXT: movzbl %dil, %eax
; SCALAR-NEXT: leal (%rax,%rax), %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: leal (,%rax,4), %edx
-; SCALAR-NEXT: leal (,%rax,8), %esi
-; SCALAR-NEXT: xorl %edx, %esi
-; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: leal (,%rcx,4), %eax
+; SCALAR-NEXT: xorl %ecx, %eax
; SCALAR-NEXT: movl %eax, %ecx
; SCALAR-NEXT: shll $4, %ecx
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $5, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %eax, %ecx
-; SCALAR-NEXT: shll $6, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: xorl %esi, %ecx
-; SCALAR-NEXT: shll $7, %eax
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $8, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $9, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $10, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $11, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $12, %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %esi
-; SCALAR-NEXT: shll $13, %esi
-; SCALAR-NEXT: xorl %ecx, %esi
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $14, %eax
-; SCALAR-NEXT: xorl %esi, %eax
-; SCALAR-NEXT: shll $15, %edi
-; SCALAR-NEXT: xorl %edi, %eax
-; SCALAR-NEXT: xorl %edx, %eax
+; SCALAR-NEXT: movl %ecx, %eax
+; SCALAR-NEXT: shll $8, %eax
+; SCALAR-NEXT: xorl %ecx, %eax
; SCALAR-NEXT: shrl $8, %eax
; SCALAR-NEXT: # kill: def $al killed $al killed $eax
; SCALAR-NEXT: retq
@@ -5366,92 +4260,17 @@ define i16 @clmulh_i16_allones(i16 %x) nounwind {
; SCALAR-NEXT: movzwl %di, %eax
; SCALAR-NEXT: leal (%rax,%rax), %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: leal (,%rax,4), %edx
-; SCALAR-NEXT: leal (,%rax,8), %esi
-; SCALAR-NEXT: xorl %edx, %esi
-; SCALAR-NEXT: xorl %ecx, %esi
+; SCALAR-NEXT: leal (,%rcx,4), %eax
+; SCALAR-NEXT: xorl %ecx, %eax
; SCALAR-NEXT: movl %eax, %ecx
; SCALAR-NEXT: shll $4, %ecx
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $5, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %eax, %ecx
-; SCALAR-NEXT: shll $6, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: xorl %esi, %ecx
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $7, %edx
-; SCALAR-NEXT: movl %eax, %esi
-; SCALAR-NEXT: shll $8, %esi
-; SCALAR-NEXT: xorl %edx, %esi
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $9, %edx
-; SCALAR-NEXT: xorl %esi, %edx
-; SCALAR-NEXT: movl %eax, %esi
-; SCALAR-NEXT: shll $10, %esi
-; SCALAR-NEXT: xorl %edx, %esi
-; SCALAR-NEXT: xorl %ecx, %esi
-; SCALAR-NEXT: movl %eax, %ecx
-; SCALAR-NEXT: shll $11, %ecx
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $12, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %eax, %ecx
-; SCALAR-NEXT: shll $13, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %eax, %edx
-; SCALAR-NEXT: shll $14, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: shll $15, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: xorl %esi, %eax
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $16, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $17, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $18, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $19, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $20, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $21, %edx
-; SCALAR-NEXT: xorl %ecx, %edx
-; SCALAR-NEXT: movl %edi, %ecx
-; SCALAR-NEXT: shll $22, %ecx
-; SCALAR-NEXT: xorl %edx, %ecx
; SCALAR-NEXT: xorl %eax, %ecx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $23, %eax
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $24, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $25, %eax
-; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $26, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $27, %eax
+; SCALAR-NEXT: movl %ecx, %edx
+; SCALAR-NEXT: shll $8, %edx
+; SCALAR-NEXT: xorl %ecx, %edx
+; SCALAR-NEXT: movl %edx, %eax
+; SCALAR-NEXT: shll $16, %eax
; SCALAR-NEXT: xorl %edx, %eax
-; SCALAR-NEXT: movl %edi, %edx
-; SCALAR-NEXT: shll $28, %edx
-; SCALAR-NEXT: xorl %eax, %edx
-; SCALAR-NEXT: movl %edi, %esi
-; SCALAR-NEXT: shll $29, %esi
-; SCALAR-NEXT: xorl %edx, %esi
-; SCALAR-NEXT: movl %edi, %eax
-; SCALAR-NEXT: shll $30, %eax
-; SCALAR-NEXT: xorl %esi, %eax
-; SCALAR-NEXT: xorl %ecx, %eax
-; SCALAR-NEXT: shll $31, %edi
-; SCALAR-NEXT: xorl %edi, %eax
; SCALAR-NEXT: shrl $16, %eax
; SCALAR-NEXT: # kill: def $ax killed $ax killed $eax
; SCALAR-NEXT: retq
@@ -5492,189 +4311,20 @@ define i32 @clmulh_i32_allones(i32 %x) nounwind {
; SCALAR-NEXT: movl %edi, %eax
; SCALAR-NEXT: leaq (%rax,%rax), %rcx
; SCALAR-NEXT: xorq %rax, %rcx
-; SCALAR-NEXT: leaq (,%rax,4), %rdx
-; SCALAR-NEXT: leaq (,%rax,8), %rsi
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
+; SCALAR-NEXT: leaq (,%rcx,4), %rax
+; SCALAR-NEXT: xorq %rcx, %rax
; SCALAR-NEXT: movq %rax, %rcx
; SCALAR-NEXT: shlq $4, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $5, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $6, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $7, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $8, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $9, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $10, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $11, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $12, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $13, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $14, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $15, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $16, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $17, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $18, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $19, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdi
-; SCALAR-NEXT: shlq $20, %rdi
-; SCALAR-NEXT: xorq %rsi, %rdi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $21, %rdx
-; SCALAR-NEXT: xorq %rdi, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $22, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $23, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $24, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $25, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $26, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $27, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $28, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $29, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $30, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $31, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $32, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $33, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $34, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdi
-; SCALAR-NEXT: shlq $35, %rdi
-; SCALAR-NEXT: xorq %rsi, %rdi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $36, %rdx
-; SCALAR-NEXT: xorq %rdi, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $37, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $38, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $39, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $40, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $41, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $42, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $43, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $44, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $45, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: xorq %rdx, %rcx
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $46, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $47, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $48, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $49, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $50, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $51, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $52, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $53, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rax, %rdi
-; SCALAR-NEXT: shlq $54, %rdi
-; SCALAR-NEXT: xorq %rsi, %rdi
-; SCALAR-NEXT: movq %rax, %rdx
-; SCALAR-NEXT: shlq $55, %rdx
-; SCALAR-NEXT: xorq %rdi, %rdx
-; SCALAR-NEXT: xorq %rcx, %rdx
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $56, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $57, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $58, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $59, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
-; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $60, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: shlq $61, %rsi
-; SCALAR-NEXT: xorq %rcx, %rsi
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rcx, %rax
+; SCALAR-NEXT: shlq $8, %rax
+; SCALAR-NEXT: xorq %rcx, %rax
; SCALAR-NEXT: movq %rax, %rcx
-; SCALAR-NEXT: shlq $62, %rcx
-; SCALAR-NEXT: xorq %rsi, %rcx
-; SCALAR-NEXT: shlq $63, %rax
+; SCALAR-NEXT: shlq $16, %rcx
+; SCALAR-NEXT: xorq %rax, %rcx
+; SCALAR-NEXT: movq %rcx, %rax
+; SCALAR-NEXT: shlq $32, %rax
; SCALAR-NEXT: xorq %rcx, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
; SCALAR-NEXT: shrq $32, %rax
; SCALAR-NEXT: # kill: def $eax killed $eax killed $rax
; SCALAR-NEXT: retq
@@ -5710,418 +4360,77 @@ define i32 @clmulh_i32_allones(i32 %x) nounwind {
define i64 @clmulh_i64_allones(i64 %x) nounwind {
; SCALAR-LABEL: clmulh_i64_allones:
; SCALAR: # %bb.0:
-; SCALAR-NEXT: pushq %rbx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: bswapq %rax
-; SCALAR-NEXT: movq %rax, %rcx
+; SCALAR-NEXT: leaq (%rdi,%rdi), %rax
+; SCALAR-NEXT: xorq %rdi, %rax
+; SCALAR-NEXT: bswapq %rdi
+; SCALAR-NEXT: movq %rdi, %rcx
; SCALAR-NEXT: shrq $4, %rcx
-; SCALAR-NEXT: movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F
-; SCALAR-NEXT: andq %rdx, %rcx
-; SCALAR-NEXT: andq %rdx, %rax
-; SCALAR-NEXT: shlq $4, %rax
-; SCALAR-NEXT: orq %rcx, %rax
+; SCALAR-NEXT: movabsq $1085102592571150095, %rsi # imm = 0xF0F0F0F0F0F0F0F
+; SCALAR-NEXT: andq %rsi, %rcx
+; SCALAR-NEXT: andq %rsi, %rdi
+; SCALAR-NEXT: shlq $4, %rdi
+; SCALAR-NEXT: orq %rcx, %rdi
; SCALAR-NEXT: movabsq $3689348814741910323, %rcx # imm = 0x3333333333333333
-; SCALAR-NEXT: movq %rax, %rsi
-; SCALAR-NEXT: andq %rcx, %rsi
-; SCALAR-NEXT: shrq $2, %rax
-; SCALAR-NEXT: andq %rcx, %rax
-; SCALAR-NEXT: leaq (%rax,%rsi,4), %rsi
-; SCALAR-NEXT: movabsq $6148914691236517205, %rax # imm = 0x5555555555555555
-; SCALAR-NEXT: movq %rsi, %r8
-; SCALAR-NEXT: andq %rax, %r8
-; SCALAR-NEXT: shrq %rsi
-; SCALAR-NEXT: movq %rsi, %r9
-; SCALAR-NEXT: andq %rax, %r9
-; SCALAR-NEXT: leaq (%r9,%r8,2), %r8
-; SCALAR-NEXT: leaq (%r8,%r8), %r9
-; SCALAR-NEXT: xorq %r8, %r9
-; SCALAR-NEXT: leaq (,%r8,4), %r10
-; SCALAR-NEXT: leaq (,%r8,8), %r11
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $4, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $5, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $6, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: xorq %r10, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $7, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $8, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $9, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $10, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $11, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $12, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $13, %r9
-; SCALAR-NEXT: xorq %r10, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $14, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $15, %r9
-; SCALAR-NEXT: xorq %r10, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $16, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $17, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $18, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $19, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %rbx
-; SCALAR-NEXT: shlq $20, %rbx
-; SCALAR-NEXT: xorq %r11, %rbx
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $21, %r10
-; SCALAR-NEXT: xorq %rbx, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $22, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $23, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $24, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $25, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $26, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $27, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $28, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: xorq %r10, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $29, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $30, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $31, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $32, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $33, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $34, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %rbx
-; SCALAR-NEXT: shlq $35, %rbx
-; SCALAR-NEXT: xorq %r11, %rbx
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $36, %r10
-; SCALAR-NEXT: xorq %rbx, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $37, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $38, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $39, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $40, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $41, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $42, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $43, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $44, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $45, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: xorq %r10, %r9
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $46, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $47, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $48, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $49, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $50, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $51, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $52, %r10
-; SCALAR-NEXT: xorq %r11, %r10
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $53, %r11
-; SCALAR-NEXT: xorq %r10, %r11
-; SCALAR-NEXT: movq %r8, %rbx
-; SCALAR-NEXT: shlq $54, %rbx
-; SCALAR-NEXT: xorq %r11, %rbx
-; SCALAR-NEXT: movq %r8, %r10
-; SCALAR-NEXT: shlq $55, %r10
-; SCALAR-NEXT: xorq %rbx, %r10
-; SCALAR-NEXT: xorq %r9, %r10
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $56, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $57, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $58, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $59, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: movq %r8, %r9
-; SCALAR-NEXT: shlq $60, %r9
-; SCALAR-NEXT: xorq %r11, %r9
-; SCALAR-NEXT: movq %r8, %r11
-; SCALAR-NEXT: shlq $61, %r11
-; SCALAR-NEXT: xorq %r9, %r11
-; SCALAR-NEXT: shlq $62, %r8
-; SCALAR-NEXT: xorq %r11, %r8
-; SCALAR-NEXT: shlq $63, %rsi
-; SCALAR-NEXT: xorq %r8, %rsi
-; SCALAR-NEXT: xorq %r10, %rsi
-; SCALAR-NEXT: bswapq %rsi
-; SCALAR-NEXT: movq %rsi, %r8
-; SCALAR-NEXT: shrq $4, %r8
-; SCALAR-NEXT: andq %rdx, %r8
-; SCALAR-NEXT: andq %rdx, %rsi
-; SCALAR-NEXT: shlq $4, %rsi
-; SCALAR-NEXT: orq %r8, %rsi
-; SCALAR-NEXT: movq %rsi, %rdx
+; SCALAR-NEXT: movq %rdi, %rdx
; SCALAR-NEXT: andq %rcx, %rdx
-; SCALAR-NEXT: shrq $2, %rsi
+; SCALAR-NEXT: shrq $2, %rdi
+; SCALAR-NEXT: andq %rcx, %rdi
+; SCALAR-NEXT: leaq (%rdi,%rdx,4), %rdi
+; SCALAR-NEXT: movabsq $6148914691236517205, %rdx # imm = 0x5555555555555555
+; SCALAR-NEXT: movq %rdi, %r8
+; SCALAR-NEXT: andq %rdx, %r8
+; SCALAR-NEXT: shrq %rdi
+; SCALAR-NEXT: andq %rdx, %rdi
+; SCALAR-NEXT: leaq (%rdi,%r8,2), %rdi
+; SCALAR-NEXT: leaq (%rdi,%rdi), %r8
+; SCALAR-NEXT: xorq %rdi, %r8
+; SCALAR-NEXT: leaq (,%r8,4), %rdi
+; SCALAR-NEXT: xorq %r8, %rdi
+; SCALAR-NEXT: movq %rdi, %r8
+; SCALAR-NEXT: shlq $4, %r8
+; SCALAR-NEXT: xorq %rdi, %r8
+; SCALAR-NEXT: movq %r8, %rdi
+; SCALAR-NEXT: shlq $8, %rdi
+; SCALAR-NEXT: xorq %r8, %rdi
+; SCALAR-NEXT: movq %rdi, %r8
+; SCALAR-NEXT: shlq $16, %r8
+; SCALAR-NEXT: xorq %rdi, %r8
+; SCALAR-NEXT: movq %r8, %rdi
+; SCALAR-NEXT: shlq $32, %rdi
+; SCALAR-NEXT: xorq %r8, %rdi
+; SCALAR-NEXT: bswapq %rdi
+; SCALAR-NEXT: movq %rdi, %r8
+; SCALAR-NEXT: shrq $4, %r8
+; SCALAR-NEXT: andq %rsi, %r8
+; SCALAR-NEXT: andq %rsi, %rdi
+; SCALAR-NEXT: shlq $4, %rdi
+; SCALAR-NEXT: orq %r8, %rdi
+; SCALAR-NEXT: movq %rdi, %rsi
; SCALAR-NEXT: andq %rcx, %rsi
-; SCALAR-NEXT: leaq (%rsi,%rdx,4), %rcx
-; SCALAR-NEXT: andq %rcx, %rax
-; SCALAR-NEXT: shrq %rcx
-; SCALAR-NEXT: movabsq $6148914691236517204, %rdx # imm = 0x5555555555555554
+; SCALAR-NEXT: shrq $2, %rdi
+; SCALAR-NEXT: andq %rcx, %rdi
+; SCALAR-NEXT: leaq (%rdi,%rsi,4), %rcx
; SCALAR-NEXT: andq %rcx, %rdx
-; SCALAR-NEXT: leaq (%rdx,%rax,2), %rcx
; SCALAR-NEXT: shrq %rcx
-; SCALAR-NEXT: leaq (%rdi,%rdi), %rax
-; SCALAR-NEXT: xorq %rdi, %rax
-; SCALAR-NEXT: leaq (,%rdi,4), %rdx
-; SCALAR-NEXT: leaq (,%rdi,8), %rsi
-; SCALAR-NEXT: xorq %rsi, %rdx
+; SCALAR-NEXT: movabsq $6148914691236517204, %rsi # imm = 0x5555555555555554
+; SCALAR-NEXT: andq %rcx, %rsi
+; SCALAR-NEXT: leaq (%rsi,%rdx,2), %rcx
+; SCALAR-NEXT: shrq %rcx
+; SCALAR-NEXT: leaq (,%rax,4), %rdx
; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
+; SCALAR-NEXT: movq %rdx, %rax
; SCALAR-NEXT: shlq $4, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $5, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $6, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $7, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $8, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $9, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $10, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $11, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $12, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $13, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $14, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $15, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $16, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $17, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $18, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $19, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %r8
-; SCALAR-NEXT: shlq $20, %r8
-; SCALAR-NEXT: xorq %rsi, %r8
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $21, %rdx
-; SCALAR-NEXT: xorq %r8, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $22, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $23, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $24, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $25, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $26, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $27, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $28, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $29, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $30, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $31, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $32, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $33, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $34, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %r8
-; SCALAR-NEXT: shlq $35, %r8
-; SCALAR-NEXT: xorq %rsi, %r8
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $36, %rdx
-; SCALAR-NEXT: xorq %r8, %rdx
+; SCALAR-NEXT: movq %rax, %rdx
+; SCALAR-NEXT: shlq $8, %rdx
; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $37, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $38, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $39, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $40, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $41, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $42, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $43, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $44, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $45, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $46, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $47, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $48, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $49, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $50, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $51, %rsi
+; SCALAR-NEXT: movq %rdx, %rsi
+; SCALAR-NEXT: shlq $16, %rsi
; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $52, %rdx
-; SCALAR-NEXT: xorq %rsi, %rdx
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $53, %rsi
-; SCALAR-NEXT: xorq %rdx, %rsi
-; SCALAR-NEXT: movq %rdi, %r8
-; SCALAR-NEXT: shlq $54, %r8
-; SCALAR-NEXT: xorq %rsi, %r8
-; SCALAR-NEXT: movq %rdi, %rdx
-; SCALAR-NEXT: shlq $55, %rdx
-; SCALAR-NEXT: xorq %r8, %rdx
-; SCALAR-NEXT: xorq %rax, %rdx
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $56, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $57, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $58, %rax
+; SCALAR-NEXT: movq %rsi, %rax
+; SCALAR-NEXT: shlq $32, %rax
; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $59, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $60, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: movq %rdi, %rsi
-; SCALAR-NEXT: shlq $61, %rsi
-; SCALAR-NEXT: xorq %rax, %rsi
-; SCALAR-NEXT: movq %rdi, %rax
-; SCALAR-NEXT: shlq $62, %rax
-; SCALAR-NEXT: xorq %rsi, %rax
-; SCALAR-NEXT: shlq $63, %rdi
-; SCALAR-NEXT: xorq %rdi, %rax
-; SCALAR-NEXT: xorq %rdx, %rax
; SCALAR-NEXT: xorq %rcx, %rax
-; SCALAR-NEXT: popq %rbx
; SCALAR-NEXT: retq
;
; SSE2-PCLMUL-LABEL: clmulh_i64_allones:
More information about the llvm-commits
mailing list