[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