[llvm] [X86] clmul-vector.ll - add missing clmulr_v2i64 test coverage (PR #176743)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 19 04:20:00 PST 2026


https://github.com/RKSimon created https://github.com/llvm/llvm-project/pull/176743

None

>From 60e48015085dc722dad848b54bc7b6108fdba009 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Mon, 19 Jan 2026 12:18:03 +0000
Subject: [PATCH] [X86] clmul-vector.ll - add missing clmulr_v2i64 test
 coverage

---
 llvm/test/CodeGen/X86/clmul-vector.ll | 1883 +++++++++++++++++++++++++
 1 file changed, 1883 insertions(+)

diff --git a/llvm/test/CodeGen/X86/clmul-vector.ll b/llvm/test/CodeGen/X86/clmul-vector.ll
index 1b590bd655158..fd0af9d0d49f3 100644
--- a/llvm/test/CodeGen/X86/clmul-vector.ll
+++ b/llvm/test/CodeGen/X86/clmul-vector.ll
@@ -4223,6 +4223,1889 @@ define <4 x i32> @clmulr_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
   ret <4 x i32> %res
 }
 
+define <2 x i64> @clmulr_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
+; SSE2-LABEL: clmulr_v2i64:
+; SSE2:       # %bb.0:
+; SSE2-NEXT:    movdqa %xmm1, %xmm12
+; SSE2-NEXT:    movdqa %xmm0, %xmm6
+; SSE2-NEXT:    psrlq $24, %xmm6
+; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [16711680,16711680]
+; SSE2-NEXT:    pand %xmm4, %xmm6
+; SSE2-NEXT:    movdqa %xmm0, %xmm2
+; SSE2-NEXT:    psrlq $8, %xmm2
+; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4278190080,4278190080]
+; SSE2-NEXT:    pand %xmm5, %xmm2
+; SSE2-NEXT:    por %xmm6, %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    psrlq $40, %xmm7
+; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [65280,65280]
+; SSE2-NEXT:    pand %xmm8, %xmm7
+; SSE2-NEXT:    movdqa %xmm0, %xmm3
+; SSE2-NEXT:    psrlq $56, %xmm3
+; SSE2-NEXT:    por %xmm7, %xmm3
+; SSE2-NEXT:    por %xmm2, %xmm3
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pand %xmm5, %xmm7
+; SSE2-NEXT:    psllq $8, %xmm7
+; SSE2-NEXT:    movdqa %xmm0, %xmm2
+; SSE2-NEXT:    pand %xmm4, %xmm2
+; SSE2-NEXT:    psllq $24, %xmm2
+; SSE2-NEXT:    por %xmm7, %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pand %xmm8, %xmm7
+; SSE2-NEXT:    psllq $40, %xmm7
+; SSE2-NEXT:    psllq $56, %xmm0
+; SSE2-NEXT:    por %xmm7, %xmm0
+; SSE2-NEXT:    por %xmm2, %xmm0
+; SSE2-NEXT:    por %xmm3, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm2
+; SSE2-NEXT:    psrlq $4, %xmm2
+; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [1085102592571150095,1085102592571150095]
+; SSE2-NEXT:    pand %xmm6, %xmm2
+; SSE2-NEXT:    pand %xmm6, %xmm0
+; SSE2-NEXT:    psllq $4, %xmm0
+; SSE2-NEXT:    por %xmm2, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm2
+; SSE2-NEXT:    psrlq $2, %xmm2
+; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [3689348814741910323,3689348814741910323]
+; SSE2-NEXT:    pand %xmm7, %xmm2
+; SSE2-NEXT:    pand %xmm7, %xmm0
+; SSE2-NEXT:    psllq $2, %xmm0
+; SSE2-NEXT:    por %xmm2, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm3
+; SSE2-NEXT:    psrlq $1, %xmm3
+; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [6148914691236517205,6148914691236517205]
+; SSE2-NEXT:    pand %xmm10, %xmm3
+; SSE2-NEXT:    pand %xmm10, %xmm0
+; SSE2-NEXT:    paddq %xmm0, %xmm0
+; SSE2-NEXT:    por %xmm3, %xmm0
+; SSE2-NEXT:    movdqa %xmm1, %xmm3
+; SSE2-NEXT:    psrlq $24, %xmm3
+; SSE2-NEXT:    pand %xmm4, %xmm3
+; SSE2-NEXT:    movdqa %xmm1, %xmm2
+; SSE2-NEXT:    psrlq $8, %xmm2
+; SSE2-NEXT:    pand %xmm5, %xmm2
+; SSE2-NEXT:    por %xmm3, %xmm2
+; SSE2-NEXT:    movdqa %xmm1, %xmm9
+; SSE2-NEXT:    psrlq $40, %xmm9
+; SSE2-NEXT:    pand %xmm8, %xmm9
+; SSE2-NEXT:    movdqa %xmm1, %xmm3
+; SSE2-NEXT:    psrlq $56, %xmm3
+; SSE2-NEXT:    por %xmm9, %xmm3
+; SSE2-NEXT:    por %xmm2, %xmm3
+; SSE2-NEXT:    movdqa %xmm1, %xmm2
+; SSE2-NEXT:    pand %xmm5, %xmm2
+; SSE2-NEXT:    psllq $8, %xmm2
+; SSE2-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NEXT:    pand %xmm4, %xmm1
+; SSE2-NEXT:    psllq $24, %xmm1
+; SSE2-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NEXT:    por %xmm2, %xmm1
+; SSE2-NEXT:    movdqa %xmm12, %xmm2
+; SSE2-NEXT:    pand %xmm8, %xmm2
+; SSE2-NEXT:    movdqa %xmm8, %xmm13
+; SSE2-NEXT:    psllq $40, %xmm2
+; SSE2-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NEXT:    psllq $56, %xmm12
+; SSE2-NEXT:    movdqa %xmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE2-NEXT:    por %xmm2, %xmm12
+; SSE2-NEXT:    por %xmm1, %xmm12
+; SSE2-NEXT:    por %xmm3, %xmm12
+; SSE2-NEXT:    movdqa %xmm12, %xmm11
+; SSE2-NEXT:    psrlq $4, %xmm11
+; SSE2-NEXT:    pand %xmm6, %xmm11
+; SSE2-NEXT:    pand %xmm6, %xmm12
+; SSE2-NEXT:    psllq $4, %xmm12
+; SSE2-NEXT:    por %xmm12, %xmm11
+; SSE2-NEXT:    movdqa %xmm11, %xmm8
+; SSE2-NEXT:    psrlq $2, %xmm8
+; SSE2-NEXT:    pand %xmm7, %xmm8
+; SSE2-NEXT:    pand %xmm7, %xmm11
+; SSE2-NEXT:    psllq $2, %xmm11
+; SSE2-NEXT:    por %xmm11, %xmm8
+; SSE2-NEXT:    movdqa %xmm8, %xmm9
+; SSE2-NEXT:    pand %xmm10, %xmm9
+; SSE2-NEXT:    paddq %xmm9, %xmm9
+; SSE2-NEXT:    movdqa %xmm9, %xmm4
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
+; SSE2-NEXT:    movdqa %xmm0, %xmm2
+; SSE2-NEXT:    pmuludq %xmm4, %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm5
+; SSE2-NEXT:    psrlq $32, %xmm5
+; SSE2-NEXT:    pmuludq %xmm5, %xmm4
+; SSE2-NEXT:    psllq $32, %xmm4
+; SSE2-NEXT:    por %xmm2, %xmm4
+; SSE2-NEXT:    psrlq $1, %xmm8
+; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [1,1]
+; SSE2-NEXT:    pand %xmm8, %xmm6
+; SSE2-NEXT:    movdqa %xmm0, %xmm2
+; SSE2-NEXT:    pmuludq %xmm6, %xmm2
+; SSE2-NEXT:    pmuludq %xmm5, %xmm6
+; SSE2-NEXT:    psllq $32, %xmm6
+; SSE2-NEXT:    por %xmm2, %xmm6
+; SSE2-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pmuludq %xmm2, %xmm7
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm7, %xmm2
+; SSE2-NEXT:    pxor %xmm4, %xmm2
+; SSE2-NEXT:    pxor %xmm6, %xmm2
+; SSE2-NEXT:    movdqa %xmm9, %xmm4
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
+; SSE2-NEXT:    movdqa %xmm0, %xmm6
+; SSE2-NEXT:    pmuludq %xmm4, %xmm6
+; SSE2-NEXT:    pmuludq %xmm5, %xmm4
+; SSE2-NEXT:    psllq $32, %xmm4
+; SSE2-NEXT:    por %xmm6, %xmm4
+; SSE2-NEXT:    movdqa %xmm8, %xmm7
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7
+; SSE2-NEXT:    movdqa %xmm0, %xmm6
+; SSE2-NEXT:    pmuludq %xmm7, %xmm6
+; SSE2-NEXT:    pmuludq %xmm5, %xmm7
+; SSE2-NEXT:    psllq $32, %xmm7
+; SSE2-NEXT:    por %xmm6, %xmm7
+; SSE2-NEXT:    pxor %xmm4, %xmm7
+; SSE2-NEXT:    movdqa %xmm9, %xmm6
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
+; SSE2-NEXT:    movdqa %xmm0, %xmm4
+; SSE2-NEXT:    pmuludq %xmm6, %xmm4
+; SSE2-NEXT:    pmuludq %xmm5, %xmm6
+; SSE2-NEXT:    psllq $32, %xmm6
+; SSE2-NEXT:    por %xmm4, %xmm6
+; SSE2-NEXT:    pxor %xmm7, %xmm6
+; SSE2-NEXT:    pxor %xmm2, %xmm6
+; SSE2-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm4
+; SSE2-NEXT:    pmuludq %xmm2, %xmm4
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm4, %xmm2
+; SSE2-NEXT:    movdqa %xmm9, %xmm4
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pmuludq %xmm4, %xmm7
+; SSE2-NEXT:    pmuludq %xmm5, %xmm4
+; SSE2-NEXT:    psllq $32, %xmm4
+; SSE2-NEXT:    por %xmm7, %xmm4
+; SSE2-NEXT:    pxor %xmm2, %xmm4
+; SSE2-NEXT:    pxor %xmm6, %xmm4
+; SSE2-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm6
+; SSE2-NEXT:    pmuludq %xmm2, %xmm6
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm6, %xmm2
+; SSE2-NEXT:    movdqa %xmm9, %xmm6
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pmuludq %xmm6, %xmm7
+; SSE2-NEXT:    pmuludq %xmm5, %xmm6
+; SSE2-NEXT:    psllq $32, %xmm6
+; SSE2-NEXT:    por %xmm7, %xmm6
+; SSE2-NEXT:    pxor %xmm2, %xmm6
+; SSE2-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pmuludq %xmm2, %xmm7
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm7, %xmm2
+; SSE2-NEXT:    pxor %xmm6, %xmm2
+; SSE2-NEXT:    movdqa %xmm9, %xmm6
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pmuludq %xmm6, %xmm7
+; SSE2-NEXT:    pmuludq %xmm5, %xmm6
+; SSE2-NEXT:    psllq $32, %xmm6
+; SSE2-NEXT:    por %xmm7, %xmm6
+; SSE2-NEXT:    pxor %xmm2, %xmm6
+; SSE2-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pmuludq %xmm2, %xmm7
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm7, %xmm2
+; SSE2-NEXT:    pxor %xmm6, %xmm2
+; SSE2-NEXT:    movdqa %xmm9, %xmm6
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pmuludq %xmm6, %xmm7
+; SSE2-NEXT:    pmuludq %xmm5, %xmm6
+; SSE2-NEXT:    psllq $32, %xmm6
+; SSE2-NEXT:    por %xmm7, %xmm6
+; SSE2-NEXT:    movdqa %xmm8, %xmm10
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm10
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pmuludq %xmm10, %xmm7
+; SSE2-NEXT:    pmuludq %xmm5, %xmm10
+; SSE2-NEXT:    psllq $32, %xmm10
+; SSE2-NEXT:    por %xmm7, %xmm10
+; SSE2-NEXT:    pxor %xmm6, %xmm10
+; SSE2-NEXT:    movdqa %xmm9, %xmm7
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7
+; SSE2-NEXT:    movdqa %xmm0, %xmm6
+; SSE2-NEXT:    pmuludq %xmm7, %xmm6
+; SSE2-NEXT:    pmuludq %xmm5, %xmm7
+; SSE2-NEXT:    psllq $32, %xmm7
+; SSE2-NEXT:    por %xmm6, %xmm7
+; SSE2-NEXT:    pxor %xmm10, %xmm7
+; SSE2-NEXT:    pxor %xmm4, %xmm2
+; SSE2-NEXT:    pxor %xmm2, %xmm7
+; SSE2-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm6
+; SSE2-NEXT:    pmuludq %xmm2, %xmm6
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm6, %xmm2
+; SSE2-NEXT:    movdqa %xmm9, %xmm6
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
+; SSE2-NEXT:    movdqa %xmm0, %xmm10
+; SSE2-NEXT:    pmuludq %xmm6, %xmm10
+; SSE2-NEXT:    pmuludq %xmm5, %xmm6
+; SSE2-NEXT:    psllq $32, %xmm6
+; SSE2-NEXT:    por %xmm10, %xmm6
+; SSE2-NEXT:    pxor %xmm2, %xmm6
+; SSE2-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm10
+; SSE2-NEXT:    pmuludq %xmm2, %xmm10
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm10, %xmm2
+; SSE2-NEXT:    pxor %xmm6, %xmm2
+; SSE2-NEXT:    movdqa %xmm9, %xmm6
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
+; SSE2-NEXT:    movdqa %xmm0, %xmm10
+; SSE2-NEXT:    pmuludq %xmm6, %xmm10
+; SSE2-NEXT:    pmuludq %xmm5, %xmm6
+; SSE2-NEXT:    psllq $32, %xmm6
+; SSE2-NEXT:    por %xmm10, %xmm6
+; SSE2-NEXT:    pxor %xmm2, %xmm6
+; SSE2-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm10
+; SSE2-NEXT:    pmuludq %xmm2, %xmm10
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm10, %xmm2
+; SSE2-NEXT:    pxor %xmm6, %xmm2
+; SSE2-NEXT:    movdqa %xmm9, %xmm6
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
+; SSE2-NEXT:    movdqa %xmm0, %xmm10
+; SSE2-NEXT:    pmuludq %xmm6, %xmm10
+; SSE2-NEXT:    pmuludq %xmm5, %xmm6
+; SSE2-NEXT:    psllq $32, %xmm6
+; SSE2-NEXT:    por %xmm10, %xmm6
+; SSE2-NEXT:    pxor %xmm2, %xmm6
+; SSE2-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm10
+; SSE2-NEXT:    pmuludq %xmm2, %xmm10
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm10, %xmm2
+; SSE2-NEXT:    pxor %xmm6, %xmm2
+; SSE2-NEXT:    psllq $56, %xmm4
+; SSE2-NEXT:    pxor %xmm7, %xmm2
+; SSE2-NEXT:    pand %xmm13, %xmm7
+; SSE2-NEXT:    psllq $40, %xmm7
+; SSE2-NEXT:    por %xmm4, %xmm7
+; SSE2-NEXT:    movdqa %xmm9, %xmm10
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm10
+; SSE2-NEXT:    movdqa %xmm0, %xmm4
+; SSE2-NEXT:    pmuludq %xmm10, %xmm4
+; SSE2-NEXT:    pmuludq %xmm5, %xmm10
+; SSE2-NEXT:    psllq $32, %xmm10
+; SSE2-NEXT:    por %xmm4, %xmm10
+; SSE2-NEXT:    pxor %xmm2, %xmm10
+; SSE2-NEXT:    movdqa {{.*#+}} xmm15 = [16777216,16777216]
+; SSE2-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NEXT:    pand %xmm15, %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm4
+; SSE2-NEXT:    pmuludq %xmm2, %xmm4
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm4, %xmm2
+; SSE2-NEXT:    movdqa {{.*#+}} xmm14 = [33554432,33554432]
+; SSE2-NEXT:    movdqa %xmm9, %xmm4
+; SSE2-NEXT:    pand %xmm14, %xmm4
+; SSE2-NEXT:    movdqa %xmm0, %xmm6
+; SSE2-NEXT:    pmuludq %xmm4, %xmm6
+; SSE2-NEXT:    pmuludq %xmm5, %xmm4
+; SSE2-NEXT:    psllq $32, %xmm4
+; SSE2-NEXT:    por %xmm6, %xmm4
+; SSE2-NEXT:    pxor %xmm2, %xmm4
+; SSE2-NEXT:    movdqa {{.*#+}} xmm13 = [67108864,67108864]
+; SSE2-NEXT:    movdqa %xmm8, %xmm2
+; SSE2-NEXT:    pand %xmm13, %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm6
+; SSE2-NEXT:    pmuludq %xmm2, %xmm6
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm6, %xmm2
+; SSE2-NEXT:    pxor %xmm4, %xmm2
+; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [134217728,134217728]
+; SSE2-NEXT:    movdqa %xmm9, %xmm4
+; SSE2-NEXT:    pand %xmm6, %xmm4
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    pmuludq %xmm4, %xmm1
+; SSE2-NEXT:    pmuludq %xmm5, %xmm4
+; SSE2-NEXT:    psllq $32, %xmm4
+; SSE2-NEXT:    por %xmm1, %xmm4
+; SSE2-NEXT:    pxor %xmm2, %xmm4
+; SSE2-NEXT:    movdqa %xmm8, %xmm1
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE2-NEXT:    movdqa %xmm0, %xmm2
+; SSE2-NEXT:    pmuludq %xmm1, %xmm2
+; SSE2-NEXT:    pmuludq %xmm5, %xmm1
+; SSE2-NEXT:    psllq $32, %xmm1
+; SSE2-NEXT:    por %xmm2, %xmm1
+; SSE2-NEXT:    pxor %xmm4, %xmm1
+; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [536870912,536870912]
+; SSE2-NEXT:    movdqa %xmm9, %xmm2
+; SSE2-NEXT:    pand %xmm4, %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm3
+; SSE2-NEXT:    pmuludq %xmm2, %xmm3
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm3, %xmm2
+; SSE2-NEXT:    pxor %xmm1, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm8
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    pmuludq %xmm8, %xmm1
+; SSE2-NEXT:    pmuludq %xmm5, %xmm8
+; SSE2-NEXT:    psllq $32, %xmm8
+; SSE2-NEXT:    por %xmm1, %xmm8
+; SSE2-NEXT:    pxor %xmm2, %xmm8
+; SSE2-NEXT:    movdqa %xmm9, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    pmuludq %xmm2, %xmm1
+; SSE2-NEXT:    pmuludq %xmm5, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    por %xmm1, %xmm2
+; SSE2-NEXT:    pxor %xmm8, %xmm2
+; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NEXT:    psrlq $39, %xmm1
+; SSE2-NEXT:    pmuludq %xmm0, %xmm1
+; SSE2-NEXT:    psllq $32, %xmm1
+; SSE2-NEXT:    psrlq $32, %xmm9
+; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2,2]
+; SSE2-NEXT:    pand %xmm9, %xmm3
+; SSE2-NEXT:    pmuludq %xmm0, %xmm3
+; SSE2-NEXT:    psllq $32, %xmm3
+; SSE2-NEXT:    pxor %xmm1, %xmm3
+; SSE2-NEXT:    psrlq $33, %xmm11
+; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [4,4]
+; SSE2-NEXT:    pand %xmm11, %xmm1
+; SSE2-NEXT:    pmuludq %xmm0, %xmm1
+; SSE2-NEXT:    psllq $32, %xmm1
+; SSE2-NEXT:    pxor %xmm3, %xmm1
+; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [8,8]
+; SSE2-NEXT:    pand %xmm9, %xmm3
+; SSE2-NEXT:    pmuludq %xmm0, %xmm3
+; SSE2-NEXT:    psllq $32, %xmm3
+; SSE2-NEXT:    pxor %xmm1, %xmm3
+; SSE2-NEXT:    psrlq $35, %xmm12
+; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [16,16]
+; SSE2-NEXT:    pand %xmm12, %xmm1
+; SSE2-NEXT:    pmuludq %xmm0, %xmm1
+; SSE2-NEXT:    psllq $32, %xmm1
+; SSE2-NEXT:    pxor %xmm3, %xmm1
+; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [32,32]
+; SSE2-NEXT:    pand %xmm9, %xmm3
+; SSE2-NEXT:    pmuludq %xmm0, %xmm3
+; SSE2-NEXT:    psllq $32, %xmm3
+; SSE2-NEXT:    pxor %xmm1, %xmm3
+; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [64,64]
+; SSE2-NEXT:    pand %xmm11, %xmm1
+; SSE2-NEXT:    pmuludq %xmm0, %xmm1
+; SSE2-NEXT:    psllq $32, %xmm1
+; SSE2-NEXT:    pxor %xmm3, %xmm1
+; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [128,128]
+; SSE2-NEXT:    pand %xmm9, %xmm3
+; SSE2-NEXT:    pmuludq %xmm0, %xmm3
+; SSE2-NEXT:    psllq $32, %xmm3
+; SSE2-NEXT:    pxor %xmm1, %xmm3
+; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE2-NEXT:    psrlq $39, %xmm1
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE2-NEXT:    pmuludq %xmm0, %xmm1
+; SSE2-NEXT:    psllq $32, %xmm1
+; SSE2-NEXT:    pxor %xmm3, %xmm1
+; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [512,512]
+; SSE2-NEXT:    pand %xmm9, %xmm3
+; SSE2-NEXT:    pmuludq %xmm0, %xmm3
+; SSE2-NEXT:    psllq $32, %xmm3
+; SSE2-NEXT:    pxor %xmm1, %xmm3
+; SSE2-NEXT:    movdqa %xmm3, %xmm1
+; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [1024,1024]
+; SSE2-NEXT:    pand %xmm11, %xmm3
+; SSE2-NEXT:    pmuludq %xmm0, %xmm3
+; SSE2-NEXT:    psllq $32, %xmm3
+; SSE2-NEXT:    pxor %xmm1, %xmm3
+; SSE2-NEXT:    pxor %xmm10, %xmm2
+; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [16711680,16711680]
+; SSE2-NEXT:    pand %xmm8, %xmm10
+; SSE2-NEXT:    psllq $24, %xmm10
+; SSE2-NEXT:    pxor %xmm2, %xmm3
+; SSE2-NEXT:    movdqa %xmm2, %xmm1
+; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4278190080,4278190080]
+; SSE2-NEXT:    pand %xmm5, %xmm1
+; SSE2-NEXT:    psllq $8, %xmm1
+; SSE2-NEXT:    por %xmm10, %xmm1
+; SSE2-NEXT:    por %xmm7, %xmm1
+; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2048,2048]
+; SSE2-NEXT:    pand %xmm9, %xmm2
+; SSE2-NEXT:    pmuludq %xmm0, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [4096,4096]
+; SSE2-NEXT:    pand %xmm12, %xmm7
+; SSE2-NEXT:    pmuludq %xmm0, %xmm7
+; SSE2-NEXT:    psllq $32, %xmm7
+; SSE2-NEXT:    pxor %xmm2, %xmm7
+; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [8192,8192]
+; SSE2-NEXT:    pand %xmm9, %xmm2
+; SSE2-NEXT:    pmuludq %xmm0, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    pxor %xmm7, %xmm2
+; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [16384,16384]
+; SSE2-NEXT:    pand %xmm11, %xmm7
+; SSE2-NEXT:    pmuludq %xmm0, %xmm7
+; SSE2-NEXT:    psllq $32, %xmm7
+; SSE2-NEXT:    pxor %xmm2, %xmm7
+; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [32768,32768]
+; SSE2-NEXT:    pand %xmm9, %xmm2
+; SSE2-NEXT:    pmuludq %xmm0, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    pxor %xmm7, %xmm2
+; SSE2-NEXT:    movdqa %xmm2, %xmm7
+; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NEXT:    psrlq $39, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    pmuludq %xmm0, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    pxor %xmm7, %xmm2
+; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [131072,131072]
+; SSE2-NEXT:    pand %xmm9, %xmm7
+; SSE2-NEXT:    pmuludq %xmm0, %xmm7
+; SSE2-NEXT:    psllq $32, %xmm7
+; SSE2-NEXT:    pxor %xmm2, %xmm7
+; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [262144,262144]
+; SSE2-NEXT:    pand %xmm11, %xmm2
+; SSE2-NEXT:    pmuludq %xmm0, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    pxor %xmm7, %xmm2
+; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [524288,524288]
+; SSE2-NEXT:    pand %xmm9, %xmm7
+; SSE2-NEXT:    pmuludq %xmm0, %xmm7
+; SSE2-NEXT:    psllq $32, %xmm7
+; SSE2-NEXT:    pxor %xmm2, %xmm7
+; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1048576,1048576]
+; SSE2-NEXT:    pand %xmm12, %xmm2
+; SSE2-NEXT:    pmuludq %xmm0, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    pxor %xmm7, %xmm2
+; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [2097152,2097152]
+; SSE2-NEXT:    pand %xmm9, %xmm7
+; SSE2-NEXT:    pmuludq %xmm0, %xmm7
+; SSE2-NEXT:    psllq $32, %xmm7
+; SSE2-NEXT:    pxor %xmm2, %xmm7
+; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [4194304,4194304]
+; SSE2-NEXT:    pand %xmm11, %xmm2
+; SSE2-NEXT:    pmuludq %xmm0, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    pxor %xmm7, %xmm2
+; SSE2-NEXT:    pxor %xmm3, %xmm2
+; SSE2-NEXT:    movdqa %xmm2, %xmm3
+; SSE2-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE2-NEXT:    psrlq $39, %xmm2
+; SSE2-NEXT:    pand %xmm2, %xmm15
+; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [8388608,8388608]
+; SSE2-NEXT:    pand %xmm9, %xmm2
+; SSE2-NEXT:    pmuludq %xmm0, %xmm2
+; SSE2-NEXT:    psllq $32, %xmm2
+; SSE2-NEXT:    pmuludq %xmm0, %xmm15
+; SSE2-NEXT:    psllq $32, %xmm15
+; SSE2-NEXT:    pxor %xmm2, %xmm15
+; SSE2-NEXT:    pand %xmm9, %xmm14
+; SSE2-NEXT:    pmuludq %xmm0, %xmm14
+; SSE2-NEXT:    psllq $32, %xmm14
+; SSE2-NEXT:    pxor %xmm15, %xmm14
+; SSE2-NEXT:    pand %xmm11, %xmm13
+; SSE2-NEXT:    pmuludq %xmm0, %xmm13
+; SSE2-NEXT:    psllq $32, %xmm13
+; SSE2-NEXT:    pxor %xmm14, %xmm13
+; SSE2-NEXT:    pand %xmm9, %xmm6
+; SSE2-NEXT:    pmuludq %xmm0, %xmm6
+; SSE2-NEXT:    psllq $32, %xmm6
+; SSE2-NEXT:    pxor %xmm13, %xmm6
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12
+; SSE2-NEXT:    pmuludq %xmm0, %xmm12
+; SSE2-NEXT:    psllq $32, %xmm12
+; SSE2-NEXT:    pxor %xmm6, %xmm12
+; SSE2-NEXT:    pand %xmm9, %xmm4
+; SSE2-NEXT:    pmuludq %xmm0, %xmm4
+; SSE2-NEXT:    psllq $32, %xmm4
+; SSE2-NEXT:    pxor %xmm12, %xmm4
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11
+; SSE2-NEXT:    pmuludq %xmm0, %xmm11
+; SSE2-NEXT:    psllq $32, %xmm11
+; SSE2-NEXT:    pxor %xmm4, %xmm11
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm9
+; SSE2-NEXT:    pmuludq %xmm9, %xmm0
+; SSE2-NEXT:    psllq $32, %xmm0
+; SSE2-NEXT:    pxor %xmm11, %xmm0
+; SSE2-NEXT:    pxor %xmm3, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm2
+; SSE2-NEXT:    psrlq $40, %xmm2
+; SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    movdqa %xmm0, %xmm3
+; SSE2-NEXT:    psrlq $56, %xmm3
+; SSE2-NEXT:    por %xmm2, %xmm3
+; SSE2-NEXT:    movdqa %xmm0, %xmm2
+; SSE2-NEXT:    psrlq $24, %xmm2
+; SSE2-NEXT:    pand %xmm8, %xmm2
+; SSE2-NEXT:    psrlq $8, %xmm0
+; SSE2-NEXT:    pand %xmm5, %xmm0
+; SSE2-NEXT:    por %xmm2, %xmm0
+; SSE2-NEXT:    por %xmm3, %xmm0
+; SSE2-NEXT:    por %xmm1, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    psrlq $4, %xmm1
+; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [1085102592571150095,1085102592571150095]
+; SSE2-NEXT:    pand %xmm2, %xmm1
+; SSE2-NEXT:    pand %xmm2, %xmm0
+; SSE2-NEXT:    psllq $4, %xmm0
+; SSE2-NEXT:    por %xmm1, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    psrlq $2, %xmm1
+; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [3689348814741910323,3689348814741910323]
+; SSE2-NEXT:    pand %xmm2, %xmm1
+; SSE2-NEXT:    pand %xmm2, %xmm0
+; SSE2-NEXT:    psllq $2, %xmm0
+; SSE2-NEXT:    por %xmm1, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    psrlq $1, %xmm1
+; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [6148914691236517205,6148914691236517205]
+; SSE2-NEXT:    pand %xmm2, %xmm1
+; SSE2-NEXT:    pand %xmm2, %xmm0
+; SSE2-NEXT:    paddq %xmm0, %xmm0
+; SSE2-NEXT:    por %xmm1, %xmm0
+; SSE2-NEXT:    retq
+;
+; SSE42-LABEL: clmulr_v2i64:
+; SSE42:       # %bb.0:
+; SSE42-NEXT:    subq $312, %rsp # imm = 0x138
+; SSE42-NEXT:    movdqa %xmm0, %xmm2
+; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,u,u,u,u,15,14,13,12,u,u,u,u]
+; SSE42-NEXT:    movdqa %xmm2, %xmm3
+; SSE42-NEXT:    pshufb {{.*#+}} xmm3 = xmm3[u,u,u,u,3],zero,zero,zero,xmm3[u,u,u,u,11],zero,zero,zero
+; SSE42-NEXT:    movdqa %xmm2, %xmm4
+; SSE42-NEXT:    pshufb {{.*#+}} xmm4 = xmm4[u,u,u,u],zero,xmm4[2],zero,zero,xmm4[u,u,u,u],zero,xmm4[10],zero,zero
+; SSE42-NEXT:    por %xmm3, %xmm4
+; SSE42-NEXT:    pshufb {{.*#+}} xmm2 = xmm2[u,u,u,u],zero,zero,xmm2[1,0,u,u,u,u],zero,zero,xmm2[9,8]
+; SSE42-NEXT:    por %xmm4, %xmm2
+; SSE42-NEXT:    pblendw {{.*#+}} xmm2 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
+; SSE42-NEXT:    movdqa {{.*#+}} xmm8 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
+; SSE42-NEXT:    movdqa %xmm2, %xmm0
+; SSE42-NEXT:    pand %xmm8, %xmm0
+; SSE42-NEXT:    movdqa {{.*#+}} xmm11 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
+; SSE42-NEXT:    movdqa %xmm11, %xmm3
+; SSE42-NEXT:    pshufb %xmm0, %xmm3
+; SSE42-NEXT:    psrlw $4, %xmm2
+; SSE42-NEXT:    pand %xmm8, %xmm2
+; SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
+; SSE42-NEXT:    movdqa %xmm0, %xmm9
+; SSE42-NEXT:    movdqa %xmm0, %xmm4
+; SSE42-NEXT:    pshufb %xmm2, %xmm9
+; SSE42-NEXT:    por %xmm3, %xmm9
+; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
+; SSE42-NEXT:    movdqa %xmm1, %xmm0
+; SSE42-NEXT:    psrlw $4, %xmm0
+; SSE42-NEXT:    pand %xmm8, %xmm0
+; SSE42-NEXT:    pshufb %xmm0, %xmm4
+; SSE42-NEXT:    movdqa %xmm4, %xmm0
+; SSE42-NEXT:    movdqa %xmm4, %xmm10
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; SSE42-NEXT:    movdqa %xmm9, %xmm3
+; SSE42-NEXT:    movdqa %xmm9, %xmm2
+; SSE42-NEXT:    movdqa %xmm9, %xmm5
+; SSE42-NEXT:    movdqa %xmm9, %xmm6
+; SSE42-NEXT:    movdqa %xmm9, %xmm4
+; SSE42-NEXT:    pmuludq %xmm0, %xmm4
+; SSE42-NEXT:    psrlq $32, %xmm3
+; SSE42-NEXT:    pmuludq %xmm3, %xmm0
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    por %xmm4, %xmm0
+; SSE42-NEXT:    movdqa %xmm10, %xmm4
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
+; SSE42-NEXT:    pmuludq %xmm4, %xmm2
+; SSE42-NEXT:    pmuludq %xmm3, %xmm4
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    por %xmm2, %xmm4
+; SSE42-NEXT:    pxor %xmm0, %xmm4
+; SSE42-NEXT:    movdqa %xmm10, %xmm2
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE42-NEXT:    pmuludq %xmm2, %xmm5
+; SSE42-NEXT:    pmuludq %xmm3, %xmm2
+; SSE42-NEXT:    psllq $32, %xmm2
+; SSE42-NEXT:    por %xmm5, %xmm2
+; SSE42-NEXT:    movdqa %xmm10, %xmm0
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; SSE42-NEXT:    pmuludq %xmm0, %xmm6
+; SSE42-NEXT:    pmuludq %xmm3, %xmm0
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    por %xmm6, %xmm0
+; SSE42-NEXT:    movdqa %xmm9, %xmm5
+; SSE42-NEXT:    pxor %xmm2, %xmm0
+; SSE42-NEXT:    pxor %xmm4, %xmm0
+; SSE42-NEXT:    pand %xmm8, %xmm1
+; SSE42-NEXT:    pshufb %xmm1, %xmm11
+; SSE42-NEXT:    movdqa %xmm11, %xmm1
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE42-NEXT:    pmuludq %xmm1, %xmm5
+; SSE42-NEXT:    pmuludq %xmm3, %xmm1
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    por %xmm5, %xmm1
+; SSE42-NEXT:    movdqa %xmm11, %xmm4
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
+; SSE42-NEXT:    movdqa %xmm9, %xmm5
+; SSE42-NEXT:    pmuludq %xmm4, %xmm5
+; SSE42-NEXT:    pmuludq %xmm3, %xmm4
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    por %xmm5, %xmm4
+; SSE42-NEXT:    pxor %xmm1, %xmm4
+; SSE42-NEXT:    movdqa %xmm11, %xmm1
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE42-NEXT:    movdqa %xmm9, %xmm5
+; SSE42-NEXT:    pmuludq %xmm1, %xmm5
+; SSE42-NEXT:    pmuludq %xmm3, %xmm1
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    por %xmm5, %xmm1
+; SSE42-NEXT:    pxor %xmm4, %xmm1
+; SSE42-NEXT:    pxor %xmm0, %xmm1
+; SSE42-NEXT:    movdqa %xmm11, %xmm4
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
+; SSE42-NEXT:    movdqa %xmm9, %xmm0
+; SSE42-NEXT:    pmuludq %xmm4, %xmm0
+; SSE42-NEXT:    pmuludq %xmm3, %xmm4
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    por %xmm0, %xmm4
+; SSE42-NEXT:    pxor %xmm1, %xmm4
+; SSE42-NEXT:    movdqa %xmm4, %xmm6
+; SSE42-NEXT:    movdqa %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pmovsxwq {{.*#+}} xmm1 = [256,256]
+; SSE42-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm10, %xmm0
+; SSE42-NEXT:    pand %xmm1, %xmm0
+; SSE42-NEXT:    movdqa %xmm9, %xmm1
+; SSE42-NEXT:    pmuludq %xmm0, %xmm1
+; SSE42-NEXT:    pmuludq %xmm3, %xmm0
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    por %xmm1, %xmm0
+; SSE42-NEXT:    movdqa %xmm10, %xmm1
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE42-NEXT:    movdqa %xmm9, %xmm4
+; SSE42-NEXT:    pmuludq %xmm1, %xmm4
+; SSE42-NEXT:    pmuludq %xmm3, %xmm1
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    por %xmm4, %xmm1
+; SSE42-NEXT:    pxor %xmm0, %xmm1
+; SSE42-NEXT:    movdqa %xmm10, %xmm0
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; SSE42-NEXT:    movdqa %xmm9, %xmm4
+; SSE42-NEXT:    pmuludq %xmm0, %xmm4
+; SSE42-NEXT:    pmuludq %xmm3, %xmm0
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    por %xmm4, %xmm0
+; SSE42-NEXT:    pxor %xmm1, %xmm0
+; SSE42-NEXT:    movdqa %xmm10, %xmm4
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
+; SSE42-NEXT:    movdqa %xmm9, %xmm1
+; SSE42-NEXT:    pmuludq %xmm4, %xmm1
+; SSE42-NEXT:    pmuludq %xmm3, %xmm4
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    por %xmm1, %xmm4
+; SSE42-NEXT:    pxor %xmm0, %xmm4
+; SSE42-NEXT:    pmovsxwq {{.*#+}} xmm0 = [4096,4096]
+; SSE42-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm11, %xmm1
+; SSE42-NEXT:    pand %xmm0, %xmm1
+; SSE42-NEXT:    movdqa %xmm9, %xmm0
+; SSE42-NEXT:    pmuludq %xmm1, %xmm0
+; SSE42-NEXT:    pmuludq %xmm3, %xmm1
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    por %xmm0, %xmm1
+; SSE42-NEXT:    pxor %xmm4, %xmm1
+; SSE42-NEXT:    pmovsxwq {{.*#+}} xmm2 = [8192,8192]
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm11, %xmm0
+; SSE42-NEXT:    pand %xmm2, %xmm0
+; SSE42-NEXT:    movdqa %xmm9, %xmm4
+; SSE42-NEXT:    pmuludq %xmm0, %xmm4
+; SSE42-NEXT:    pmuludq %xmm3, %xmm0
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    por %xmm4, %xmm0
+; SSE42-NEXT:    pmovsxwq {{.*#+}} xmm2 = [16384,16384]
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm11, %xmm4
+; SSE42-NEXT:    pand %xmm2, %xmm4
+; SSE42-NEXT:    movdqa %xmm9, %xmm5
+; SSE42-NEXT:    pmuludq %xmm4, %xmm5
+; SSE42-NEXT:    pmuludq %xmm3, %xmm4
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    por %xmm5, %xmm4
+; SSE42-NEXT:    pxor %xmm0, %xmm4
+; SSE42-NEXT:    pmovzxwq {{.*#+}} xmm2 = [32768,32768]
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm11, %xmm0
+; SSE42-NEXT:    pand %xmm2, %xmm0
+; SSE42-NEXT:    movdqa %xmm9, %xmm5
+; SSE42-NEXT:    pmuludq %xmm0, %xmm5
+; SSE42-NEXT:    pmuludq %xmm3, %xmm0
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    por %xmm5, %xmm0
+; SSE42-NEXT:    pxor %xmm4, %xmm0
+; SSE42-NEXT:    pmovsxbw {{.*#+}} xmm15 = [0,1,0,0,0,1,0,0]
+; SSE42-NEXT:    movdqa %xmm10, %xmm4
+; SSE42-NEXT:    pand %xmm15, %xmm4
+; SSE42-NEXT:    movdqa %xmm9, %xmm5
+; SSE42-NEXT:    pmuludq %xmm4, %xmm5
+; SSE42-NEXT:    pmuludq %xmm3, %xmm4
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    por %xmm5, %xmm4
+; SSE42-NEXT:    pxor %xmm0, %xmm4
+; SSE42-NEXT:    pmovsxbw {{.*#+}} xmm14 = [0,2,0,0,0,2,0,0]
+; SSE42-NEXT:    movdqa %xmm10, %xmm5
+; SSE42-NEXT:    pand %xmm14, %xmm5
+; SSE42-NEXT:    movdqa %xmm9, %xmm0
+; SSE42-NEXT:    pmuludq %xmm5, %xmm0
+; SSE42-NEXT:    pmuludq %xmm3, %xmm5
+; SSE42-NEXT:    psllq $32, %xmm5
+; SSE42-NEXT:    por %xmm0, %xmm5
+; SSE42-NEXT:    pxor %xmm4, %xmm5
+; SSE42-NEXT:    pmovsxbw {{.*#+}} xmm13 = [0,4,0,0,0,4,0,0]
+; SSE42-NEXT:    movdqa %xmm10, %xmm0
+; SSE42-NEXT:    pand %xmm13, %xmm0
+; SSE42-NEXT:    movdqa %xmm9, %xmm4
+; SSE42-NEXT:    pmuludq %xmm0, %xmm4
+; SSE42-NEXT:    pmuludq %xmm3, %xmm0
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    por %xmm4, %xmm0
+; SSE42-NEXT:    pxor %xmm5, %xmm0
+; SSE42-NEXT:    pxor %xmm6, %xmm1
+; SSE42-NEXT:    pxor %xmm1, %xmm0
+; SSE42-NEXT:    pmovsxbw {{.*#+}} xmm12 = [0,8,0,0,0,8,0,0]
+; SSE42-NEXT:    movdqa %xmm10, %xmm1
+; SSE42-NEXT:    pand %xmm12, %xmm1
+; SSE42-NEXT:    movdqa %xmm9, %xmm4
+; SSE42-NEXT:    pmuludq %xmm1, %xmm4
+; SSE42-NEXT:    pmuludq %xmm3, %xmm1
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    por %xmm4, %xmm1
+; SSE42-NEXT:    pmovsxbw {{.*#+}} xmm5 = [0,16,0,0,0,16,0,0]
+; SSE42-NEXT:    movdqa %xmm5, (%rsp) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm11, %xmm4
+; SSE42-NEXT:    pand %xmm5, %xmm4
+; SSE42-NEXT:    movdqa %xmm9, %xmm5
+; SSE42-NEXT:    pmuludq %xmm4, %xmm5
+; SSE42-NEXT:    pmuludq %xmm3, %xmm4
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    por %xmm5, %xmm4
+; SSE42-NEXT:    pxor %xmm1, %xmm4
+; SSE42-NEXT:    pmovsxbw {{.*#+}} xmm2 = [0,32,0,0,0,32,0,0]
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm11, %xmm1
+; SSE42-NEXT:    pand %xmm2, %xmm1
+; SSE42-NEXT:    movdqa %xmm9, %xmm5
+; SSE42-NEXT:    pmuludq %xmm1, %xmm5
+; SSE42-NEXT:    pmuludq %xmm3, %xmm1
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    por %xmm5, %xmm1
+; SSE42-NEXT:    pxor %xmm4, %xmm1
+; SSE42-NEXT:    pmovsxbw {{.*#+}} xmm5 = [0,64,0,0,0,64,0,0]
+; SSE42-NEXT:    movdqa %xmm5, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm11, %xmm4
+; SSE42-NEXT:    pand %xmm5, %xmm4
+; SSE42-NEXT:    movdqa %xmm9, %xmm5
+; SSE42-NEXT:    pmuludq %xmm4, %xmm5
+; SSE42-NEXT:    pmuludq %xmm3, %xmm4
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    por %xmm5, %xmm4
+; SSE42-NEXT:    pxor %xmm1, %xmm4
+; SSE42-NEXT:    pmovzxbw {{.*#+}} xmm2 = [0,128,0,0,0,128,0,0]
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm11, %xmm1
+; SSE42-NEXT:    pand %xmm2, %xmm1
+; SSE42-NEXT:    movdqa %xmm9, %xmm5
+; SSE42-NEXT:    pmuludq %xmm1, %xmm5
+; SSE42-NEXT:    pmuludq %xmm3, %xmm1
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    por %xmm5, %xmm1
+; SSE42-NEXT:    pxor %xmm4, %xmm1
+; SSE42-NEXT:    pmovsxdq {{.*#+}} xmm2 = [16777216,16777216]
+; SSE42-NEXT:    movdqa %xmm10, %xmm6
+; SSE42-NEXT:    pand %xmm2, %xmm6
+; SSE42-NEXT:    movdqa %xmm9, %xmm4
+; SSE42-NEXT:    pmuludq %xmm6, %xmm4
+; SSE42-NEXT:    pmuludq %xmm3, %xmm6
+; SSE42-NEXT:    psllq $32, %xmm6
+; SSE42-NEXT:    por %xmm4, %xmm6
+; SSE42-NEXT:    pxor %xmm1, %xmm6
+; SSE42-NEXT:    pmovsxdq {{.*#+}} xmm1 = [33554432,33554432]
+; SSE42-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm10, %xmm4
+; SSE42-NEXT:    pand %xmm1, %xmm4
+; SSE42-NEXT:    movdqa %xmm9, %xmm1
+; SSE42-NEXT:    pmuludq %xmm4, %xmm1
+; SSE42-NEXT:    pmuludq %xmm3, %xmm4
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    por %xmm1, %xmm4
+; SSE42-NEXT:    pxor %xmm6, %xmm4
+; SSE42-NEXT:    pxor %xmm0, %xmm4
+; SSE42-NEXT:    movdqa %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pmovsxdq {{.*#+}} xmm1 = [67108864,67108864]
+; SSE42-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm10, %xmm0
+; SSE42-NEXT:    pand %xmm1, %xmm0
+; SSE42-NEXT:    movdqa %xmm9, %xmm1
+; SSE42-NEXT:    pmuludq %xmm0, %xmm1
+; SSE42-NEXT:    pmuludq %xmm3, %xmm0
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    por %xmm1, %xmm0
+; SSE42-NEXT:    movdqa %xmm10, %xmm1
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE42-NEXT:    movdqa %xmm9, %xmm6
+; SSE42-NEXT:    pmuludq %xmm1, %xmm6
+; SSE42-NEXT:    pmuludq %xmm3, %xmm1
+; SSE42-NEXT:    movdqa %xmm3, %xmm4
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    por %xmm6, %xmm1
+; SSE42-NEXT:    pxor %xmm0, %xmm1
+; SSE42-NEXT:    pmovsxdq {{.*#+}} xmm3 = [268435456,268435456]
+; SSE42-NEXT:    movdqa %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm11, %xmm0
+; SSE42-NEXT:    pand %xmm3, %xmm0
+; SSE42-NEXT:    movdqa %xmm9, %xmm6
+; SSE42-NEXT:    pmuludq %xmm0, %xmm6
+; SSE42-NEXT:    pmuludq %xmm4, %xmm0
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    por %xmm6, %xmm0
+; SSE42-NEXT:    pxor %xmm1, %xmm0
+; SSE42-NEXT:    pmovsxdq {{.*#+}} xmm1 = [536870912,536870912]
+; SSE42-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm11, %xmm8
+; SSE42-NEXT:    pand %xmm1, %xmm8
+; SSE42-NEXT:    movdqa %xmm9, %xmm1
+; SSE42-NEXT:    pmuludq %xmm8, %xmm1
+; SSE42-NEXT:    movdqa %xmm4, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pmuludq %xmm4, %xmm8
+; SSE42-NEXT:    psllq $32, %xmm8
+; SSE42-NEXT:    por %xmm1, %xmm8
+; SSE42-NEXT:    pxor %xmm0, %xmm8
+; SSE42-NEXT:    movdqa %xmm11, %xmm1
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE42-NEXT:    movdqa %xmm9, %xmm7
+; SSE42-NEXT:    pmuludq %xmm1, %xmm7
+; SSE42-NEXT:    pmuludq %xmm4, %xmm1
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    por %xmm7, %xmm1
+; SSE42-NEXT:    pxor %xmm8, %xmm1
+; SSE42-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    psrlq $32, %xmm10
+; SSE42-NEXT:    movaps {{.*#+}} xmm0 = [1,1]
+; SSE42-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm10, %xmm0
+; SSE42-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa %xmm10, %xmm8
+; SSE42-NEXT:    pmovsxbq {{.*#+}} xmm7 = [2,2]
+; SSE42-NEXT:    pand %xmm10, %xmm7
+; SSE42-NEXT:    pmovsxbq {{.*#+}} xmm4 = [4,4]
+; SSE42-NEXT:    pand %xmm10, %xmm4
+; SSE42-NEXT:    pmovsxbq {{.*#+}} xmm5 = [8,8]
+; SSE42-NEXT:    pand %xmm10, %xmm5
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm10, %xmm0
+; SSE42-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pmovsxwq {{.*#+}} xmm3 = [512,512]
+; SSE42-NEXT:    pand %xmm10, %xmm3
+; SSE42-NEXT:    pmovsxwq {{.*#+}} xmm6 = [1024,1024]
+; SSE42-NEXT:    pand %xmm10, %xmm6
+; SSE42-NEXT:    pmovsxwq {{.*#+}} xmm10 = [2048,2048]
+; SSE42-NEXT:    pand %xmm8, %xmm10
+; SSE42-NEXT:    pand %xmm8, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pand %xmm8, %xmm14
+; SSE42-NEXT:    movdqa %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pand %xmm8, %xmm13
+; SSE42-NEXT:    movdqa %xmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pand %xmm8, %xmm12
+; SSE42-NEXT:    movdqa %xmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pand %xmm8, %xmm2
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm8, %xmm2
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm8, %xmm0
+; SSE42-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm8
+; SSE42-NEXT:    movdqa %xmm8, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pmovzxdq {{.*#+}} xmm1 = [2147483648,2147483648]
+; SSE42-NEXT:    movdqa %xmm11, %xmm8
+; SSE42-NEXT:    pand %xmm1, %xmm8
+; SSE42-NEXT:    psrlq $32, %xmm11
+; SSE42-NEXT:    pmovsxbq {{.*#+}} xmm12 = [16,16]
+; SSE42-NEXT:    pand %xmm11, %xmm12
+; SSE42-NEXT:    pmovsxbq {{.*#+}} xmm13 = [32,32]
+; SSE42-NEXT:    pand %xmm11, %xmm13
+; SSE42-NEXT:    pmovsxbq {{.*#+}} xmm14 = [64,64]
+; SSE42-NEXT:    pand %xmm11, %xmm14
+; SSE42-NEXT:    pmovzxbq {{.*#+}} xmm15 = [128,128]
+; SSE42-NEXT:    pand %xmm11, %xmm15
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm11, %xmm2
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm11, %xmm2
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm11, %xmm2
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm11, %xmm2
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa (%rsp), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm11, %xmm2
+; SSE42-NEXT:    movdqa %xmm2, (%rsp) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm11, %xmm2
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm11, %xmm2
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm11, %xmm2
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm11, %xmm2
+; SSE42-NEXT:    movdqa %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE42-NEXT:    pand %xmm11, %xmm0
+; SSE42-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pmovsxdq {{.*#+}} xmm0 = [1073741824,1073741824]
+; SSE42-NEXT:    pand %xmm11, %xmm0
+; SSE42-NEXT:    pand %xmm1, %xmm11
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm1
+; SSE42-NEXT:    pmuludq %xmm9, %xmm7
+; SSE42-NEXT:    pmuludq %xmm9, %xmm4
+; SSE42-NEXT:    pmuludq %xmm9, %xmm5
+; SSE42-NEXT:    pmuludq %xmm9, %xmm12
+; SSE42-NEXT:    movdqa %xmm12, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pmuludq %xmm9, %xmm13
+; SSE42-NEXT:    movdqa %xmm13, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pmuludq %xmm9, %xmm14
+; SSE42-NEXT:    movdqa %xmm14, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm2
+; SSE42-NEXT:    pmuludq %xmm9, %xmm3
+; SSE42-NEXT:    pmuludq %xmm9, %xmm6
+; SSE42-NEXT:    pmuludq %xmm9, %xmm10
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm12 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm12
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm14 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm14
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm13 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm13
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa (%rsp), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, (%rsp) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    movdqa %xmm15, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm15 # 16-byte Reload
+; SSE42-NEXT:    pmuludq %xmm9, %xmm15
+; SSE42-NEXT:    pmuludq %xmm9, %xmm0
+; SSE42-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; SSE42-NEXT:    pmuludq %xmm9, %xmm11
+; SSE42-NEXT:    pmuludq %xmm8, %xmm9
+; SSE42-NEXT:    pmuludq {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Folded Reload
+; SSE42-NEXT:    psllq $32, %xmm8
+; SSE42-NEXT:    por %xmm9, %xmm8
+; SSE42-NEXT:    pxor {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Folded Reload
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    pxor %xmm8, %xmm1
+; SSE42-NEXT:    movdqa %xmm1, %xmm8
+; SSE42-NEXT:    movdqa %xmm7, %xmm1
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    pxor %xmm8, %xmm1
+; SSE42-NEXT:    pxor {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    psllq $32, %xmm5
+; SSE42-NEXT:    pxor %xmm4, %xmm5
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    pxor %xmm5, %xmm4
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm5 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm5
+; SSE42-NEXT:    pxor %xmm4, %xmm5
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm4 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm4
+; SSE42-NEXT:    pxor %xmm5, %xmm4
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm5 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm5
+; SSE42-NEXT:    pxor %xmm4, %xmm5
+; SSE42-NEXT:    psllq $32, %xmm2
+; SSE42-NEXT:    pxor %xmm5, %xmm2
+; SSE42-NEXT:    psllq $32, %xmm3
+; SSE42-NEXT:    pxor %xmm2, %xmm3
+; SSE42-NEXT:    psllq $32, %xmm6
+; SSE42-NEXT:    pxor %xmm3, %xmm6
+; SSE42-NEXT:    psllq $32, %xmm10
+; SSE42-NEXT:    pxor %xmm6, %xmm10
+; SSE42-NEXT:    psllq $32, %xmm12
+; SSE42-NEXT:    pxor %xmm10, %xmm12
+; SSE42-NEXT:    pxor %xmm1, %xmm12
+; SSE42-NEXT:    psllq $32, %xmm14
+; SSE42-NEXT:    psllq $32, %xmm13
+; SSE42-NEXT:    pxor %xmm14, %xmm13
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    pxor %xmm13, %xmm1
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm3
+; SSE42-NEXT:    pxor %xmm1, %xmm3
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    pxor %xmm3, %xmm1
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm3 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm3
+; SSE42-NEXT:    pxor %xmm1, %xmm3
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    pxor %xmm3, %xmm1
+; SSE42-NEXT:    movdqa (%rsp), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm2
+; SSE42-NEXT:    pxor %xmm1, %xmm2
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    pxor %xmm2, %xmm1
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm2
+; SSE42-NEXT:    pxor %xmm1, %xmm2
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    pxor %xmm2, %xmm1
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm2 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm2
+; SSE42-NEXT:    pxor %xmm1, %xmm2
+; SSE42-NEXT:    pxor %xmm12, %xmm2
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    pxor %xmm0, %xmm1
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    pxor %xmm1, %xmm0
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm1
+; SSE42-NEXT:    pxor %xmm0, %xmm1
+; SSE42-NEXT:    movdqa %xmm15, %xmm0
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    pxor %xmm1, %xmm0
+; SSE42-NEXT:    movdqa %xmm0, %xmm1
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
+; SSE42-NEXT:    psllq $32, %xmm0
+; SSE42-NEXT:    pxor %xmm1, %xmm0
+; SSE42-NEXT:    pxor %xmm2, %xmm0
+; SSE42-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
+; SSE42-NEXT:    psllq $56, %xmm1
+; SSE42-NEXT:    psllq $32, %xmm11
+; SSE42-NEXT:    pxor %xmm0, %xmm11
+; SSE42-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,3,2],zero,zero,xmm0[u,u,u,u,11,10],zero,zero
+; SSE42-NEXT:    por %xmm1, %xmm0
+; SSE42-NEXT:    movdqa %xmm11, %xmm1
+; SSE42-NEXT:    pshufb {{.*#+}} xmm1 = xmm1[u,u,u,u],zero,zero,xmm1[1],zero,xmm1[u,u,u,u],zero,zero,xmm1[9],zero
+; SSE42-NEXT:    por %xmm1, %xmm0
+; SSE42-NEXT:    pshufb {{.*#+}} xmm11 = xmm11[7,6,5,4,u,u,u,u,15,14,13,12,u,u,u,u]
+; SSE42-NEXT:    pblendw {{.*#+}} xmm11 = xmm11[0,1],xmm0[2,3],xmm11[4,5],xmm0[6,7]
+; SSE42-NEXT:    movdqa %xmm11, %xmm0
+; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
+; SSE42-NEXT:    pand %xmm3, %xmm0
+; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
+; SSE42-NEXT:    pshufb %xmm0, %xmm1
+; SSE42-NEXT:    psrlw $4, %xmm11
+; SSE42-NEXT:    pand %xmm3, %xmm11
+; SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
+; SSE42-NEXT:    pshufb %xmm11, %xmm0
+; SSE42-NEXT:    por %xmm1, %xmm0
+; SSE42-NEXT:    addq $312, %rsp # imm = 0x138
+; SSE42-NEXT:    retq
+;
+; AVX2-LABEL: clmulr_v2i64:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    vpshufb {{.*#+}} xmm2 = xmm0[7,6,5,4,u,u,u,u,15,14,13,12,u,u,u,u]
+; AVX2-NEXT:    vpshufb {{.*#+}} xmm3 = xmm0[u,u,u,u,3],zero,zero,zero,xmm0[u,u,u,u,11],zero,zero,zero
+; AVX2-NEXT:    vpshufb {{.*#+}} xmm4 = xmm0[u,u,u,u],zero,xmm0[2],zero,zero,xmm0[u,u,u,u],zero,xmm0[10],zero,zero
+; AVX2-NEXT:    vpor %xmm3, %xmm4, %xmm3
+; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u,u,u,u],zero,zero,xmm0[1,0,u,u,u,u],zero,zero,xmm0[9,8]
+; AVX2-NEXT:    vpor %xmm3, %xmm0, %xmm0
+; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3]
+; AVX2-NEXT:    vpbroadcastb {{.*#+}} xmm14 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
+; AVX2-NEXT:    vpand %xmm0, %xmm14, %xmm2
+; AVX2-NEXT:    vmovdqa {{.*#+}} xmm6 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
+; AVX2-NEXT:    vpshufb %xmm2, %xmm6, %xmm2
+; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
+; AVX2-NEXT:    vpand %xmm0, %xmm14, %xmm0
+; AVX2-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
+; AVX2-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
+; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm5
+; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm1[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
+; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm1
+; AVX2-NEXT:    vpand %xmm1, %xmm14, %xmm1
+; AVX2-NEXT:    vpshufb %xmm1, %xmm3, %xmm7
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX2-NEXT:    vpsrlq $32, %xmm5, %xmm11
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm11, %xmm1
+; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm3, %xmm2
+; AVX2-NEXT:    vpxor %xmm1, %xmm2, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm3, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm11, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpor %xmm3, %xmm4, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpand %xmm0, %xmm14, %xmm0
+; AVX2-NEXT:    vpshufb %xmm0, %xmm6, %xmm12
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm0
+; AVX2-NEXT:    vpmuludq %xmm0, %xmm5, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm0, %xmm11, %xmm0
+; AVX2-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm3, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm3, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
+; AVX2-NEXT:    vpxor %xmm0, %xmm1, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm11, %xmm1
+; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm6
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm0
+; AVX2-NEXT:    vpmuludq %xmm0, %xmm5, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm0, %xmm11, %xmm0
+; AVX2-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm11, %xmm1
+; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm11, %xmm1
+; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm11, %xmm1
+; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm11, %xmm1
+; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm11, %xmm1
+; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpxor %xmm0, %xmm6, %xmm0
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm11, %xmm1
+; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm12, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm15 = [33554432,33554432]
+; AVX2-NEXT:    vpand %xmm7, %xmm15, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm3
+; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm13 = [67108864,67108864]
+; AVX2-NEXT:    vpand %xmm7, %xmm13, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm11, %xmm1
+; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX2-NEXT:    vpor %xmm1, %xmm2, %xmm1
+; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm10 = [134217728,134217728]
+; AVX2-NEXT:    vpand %xmm7, %xmm10, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm9 = [268435456,268435456]
+; AVX2-NEXT:    vpand %xmm9, %xmm12, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm4
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm4, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm1
+; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm8 = [536870912,536870912]
+; AVX2-NEXT:    vpand %xmm8, %xmm12, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm0
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpor %xmm2, %xmm0, %xmm0
+; AVX2-NEXT:    vpxor %xmm0, %xmm1, %xmm2
+; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm4 = [1073741824,1073741824]
+; AVX2-NEXT:    vpand %xmm4, %xmm12, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm5, %xmm0
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm11, %xmm1
+; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vpxor %xmm0, %xmm2, %xmm0
+; AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [2147483648,2147483648]
+; AVX2-NEXT:    vpand %xmm1, %xmm12, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm11, %xmm11
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm11, %xmm11
+; AVX2-NEXT:    vpor %xmm2, %xmm11, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
+; AVX2-NEXT:    vpsrlq $32, %xmm7, %xmm7
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
+; AVX2-NEXT:    vpxor %xmm0, %xmm3, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpsrlq $32, %xmm12, %xmm11
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm7, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
+; AVX2-NEXT:    vpand %xmm7, %xmm15, %xmm2
+; AVX2-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX2-NEXT:    vpand %xmm7, %xmm13, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand %xmm7, %xmm10, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand %xmm9, %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand %xmm8, %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpand %xmm4, %xmm11, %xmm3
+; AVX2-NEXT:    vpmuludq %xmm3, %xmm5, %xmm3
+; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
+; AVX2-NEXT:    vpxor %xmm3, %xmm2, %xmm2
+; AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm0
+; AVX2-NEXT:    vpand %xmm1, %xmm11, %xmm1
+; AVX2-NEXT:    vpmuludq %xmm1, %xmm5, %xmm1
+; AVX2-NEXT:    vpsllq $56, %xmm6, %xmm2
+; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm1
+; AVX2-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[u,u,u,u,3,2],zero,zero,xmm0[u,u,u,u,11,10],zero,zero
+; AVX2-NEXT:    vpor %xmm0, %xmm2, %xmm0
+; AVX2-NEXT:    vpshufb {{.*#+}} xmm2 = xmm1[u,u,u,u],zero,zero,xmm1[1],zero,xmm1[u,u,u,u],zero,zero,xmm1[9],zero
+; AVX2-NEXT:    vpor %xmm2, %xmm0, %xmm0
+; AVX2-NEXT:    vpshufb {{.*#+}} xmm1 = xmm1[7,6,5,4,u,u,u,u,15,14,13,12,u,u,u,u]
+; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2],xmm0[3]
+; AVX2-NEXT:    vpand %xmm0, %xmm14, %xmm1
+; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
+; AVX2-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
+; AVX2-NEXT:    vpsrlw $4, %xmm0, %xmm0
+; AVX2-NEXT:    vpand %xmm0, %xmm14, %xmm0
+; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
+; AVX2-NEXT:    vpshufb %xmm0, %xmm2, %xmm0
+; AVX2-NEXT:    vpor %xmm0, %xmm1, %xmm0
+; AVX2-NEXT:    retq
+;
+; AVX512-LABEL: clmulr_v2i64:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vpshufb {{.*#+}} xmm2 = xmm0[u,u,u,u,3],zero,zero,zero,xmm0[u,u,u,u,11],zero,zero,zero
+; AVX512-NEXT:    vpshufb {{.*#+}} xmm3 = xmm0[u,u,u,u],zero,xmm0[2],zero,zero,xmm0[u,u,u,u],zero,xmm0[10],zero,zero
+; AVX512-NEXT:    vpshufb {{.*#+}} xmm4 = xmm0[u,u,u,u],zero,zero,xmm0[1,0,u,u,u,u],zero,zero,xmm0[9,8]
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm4 = xmm4 | xmm3 | xmm2
+; AVX512-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,u,u,u,u,15,14,13,12,u,u,u,u]
+; AVX512-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3]
+; AVX512-NEXT:    vpbroadcastd {{.*#+}} xmm13 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
+; AVX512-NEXT:    vpand %xmm0, %xmm13, %xmm2
+; AVX512-NEXT:    vmovdqa {{.*#+}} xmm4 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
+; AVX512-NEXT:    vpshufb %xmm2, %xmm4, %xmm2
+; AVX512-NEXT:    vpsrlw $4, %xmm0, %xmm0
+; AVX512-NEXT:    vpand %xmm0, %xmm13, %xmm0
+; AVX512-NEXT:    vmovdqa {{.*#+}} xmm3 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
+; AVX512-NEXT:    vpshufb %xmm0, %xmm3, %xmm0
+; AVX512-NEXT:    vpor %xmm0, %xmm2, %xmm5
+; AVX512-NEXT:    vpshufb {{.*#+}} xmm0 = xmm1[7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8]
+; AVX512-NEXT:    vpsrlw $4, %xmm0, %xmm1
+; AVX512-NEXT:    vpand %xmm1, %xmm13, %xmm1
+; AVX512-NEXT:    vpshufb %xmm1, %xmm3, %xmm6
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm6, %xmm1
+; AVX512-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX512-NEXT:    vpsrlq $32, %xmm5, %xmm10
+; AVX512-NEXT:    vpmuludq %xmm1, %xmm10, %xmm1
+; AVX512-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX512-NEXT:    vpor %xmm1, %xmm2, %xmm1
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm6, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm1 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm6, %xmm1
+; AVX512-NEXT:    vpmuludq %xmm1, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm1, %xmm10, %xmm1
+; AVX512-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm1 = xmm2 ^ (xmm1 | xmm3)
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm6, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm1 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpand %xmm0, %xmm13, %xmm0
+; AVX512-NEXT:    vpshufb %xmm0, %xmm4, %xmm12
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm12, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm1
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm1)
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm12, %xmm1
+; AVX512-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm1, %xmm10, %xmm1
+; AVX512-NEXT:    vpsllq $32, %xmm1, %xmm1
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm1 = xmm0 ^ (xmm1 | xmm2)
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm12, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm1 ^ (xmm0 | xmm2)
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm12, %xmm1
+; AVX512-NEXT:    vpmuludq %xmm1, %xmm5, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm1, %xmm10, %xmm1
+; AVX512-NEXT:    vpsllq $32, %xmm1, %xmm4
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm4 = xmm0 ^ (xmm4 | xmm2)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm17 = [256,256]
+; AVX512-NEXT:    vpandq %xmm17, %xmm6, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm4 ^ (xmm0 | xmm2)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm18 = [512,512]
+; AVX512-NEXT:    vpandq %xmm18, %xmm6, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm0 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm19 = [1024,1024]
+; AVX512-NEXT:    vpandq %xmm19, %xmm6, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm20 = [2048,2048]
+; AVX512-NEXT:    vpandq %xmm20, %xmm6, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm0 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm21 = [4096,4096]
+; AVX512-NEXT:    vpandq %xmm21, %xmm12, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm22 = [8192,8192]
+; AVX512-NEXT:    vpandq %xmm22, %xmm12, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm0 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm23 = [16384,16384]
+; AVX512-NEXT:    vpandq %xmm23, %xmm12, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm24 = [32768,32768]
+; AVX512-NEXT:    vpandq %xmm24, %xmm12, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm0 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm25 = [65536,65536]
+; AVX512-NEXT:    vpandq %xmm25, %xmm6, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm26 = [131072,131072]
+; AVX512-NEXT:    vpandq %xmm26, %xmm6, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm0 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm27 = [262144,262144]
+; AVX512-NEXT:    vpandq %xmm27, %xmm6, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm28 = [524288,524288]
+; AVX512-NEXT:    vpandq %xmm28, %xmm6, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm0 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm29 = [1048576,1048576]
+; AVX512-NEXT:    vpandq %xmm29, %xmm12, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm30 = [2097152,2097152]
+; AVX512-NEXT:    vpandq %xmm30, %xmm12, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm0 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm31 = [4194304,4194304]
+; AVX512-NEXT:    vpandq %xmm31, %xmm12, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm16 = [8388608,8388608]
+; AVX512-NEXT:    vpandq %xmm16, %xmm12, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm0 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm15 = [16777216,16777216]
+; AVX512-NEXT:    vpand %xmm6, %xmm15, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm14 = [33554432,33554432]
+; AVX512-NEXT:    vpand %xmm6, %xmm14, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm0 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm11 = [67108864,67108864]
+; AVX512-NEXT:    vpand %xmm6, %xmm11, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm9 = [134217728,134217728]
+; AVX512-NEXT:    vpand %xmm6, %xmm9, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm0 ^ (xmm2 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm8 = [268435456,268435456]
+; AVX512-NEXT:    vpand %xmm8, %xmm12, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm3
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm3)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm7 = [536870912,536870912]
+; AVX512-NEXT:    vpand %xmm7, %xmm12, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm1
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm0 ^ (xmm2 | xmm1)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm3 = [1073741824,1073741824]
+; AVX512-NEXT:    vpand %xmm3, %xmm12, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm1
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm10, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = xmm2 ^ (xmm0 | xmm1)
+; AVX512-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [2147483648,2147483648]
+; AVX512-NEXT:    vpand %xmm1, %xmm12, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm10, %xmm10
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm10, %xmm10
+; AVX512-NEXT:    vpor %xmm2, %xmm10, %xmm2
+; AVX512-NEXT:    vpsrlq $32, %xmm6, %xmm6
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm6, %xmm10
+; AVX512-NEXT:    vpmuludq %xmm5, %xmm10, %xmm10
+; AVX512-NEXT:    vpsllq $32, %xmm10, %xmm10
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm10 = xmm10 ^ xmm0 ^ xmm2
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm6, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm6, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm2 ^ xmm10 ^ xmm0
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm6, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpsrlq $32, %xmm12, %xmm10
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm10, %xmm12
+; AVX512-NEXT:    vpmuludq %xmm5, %xmm12, %xmm12
+; AVX512-NEXT:    vpsllq $32, %xmm12, %xmm12
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm12 = xmm12 ^ xmm2 ^ xmm0
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm10, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm10, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm2 ^ xmm12 ^ xmm0
+; AVX512-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm10, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpandq %xmm17, %xmm6, %xmm12
+; AVX512-NEXT:    vpmuludq %xmm5, %xmm12, %xmm12
+; AVX512-NEXT:    vpsllq $32, %xmm12, %xmm12
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm12 = xmm12 ^ xmm2 ^ xmm0
+; AVX512-NEXT:    vpandq %xmm18, %xmm6, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpandq %xmm19, %xmm6, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm2 ^ xmm12 ^ xmm0
+; AVX512-NEXT:    vpandq %xmm20, %xmm6, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpandq %xmm21, %xmm10, %xmm12
+; AVX512-NEXT:    vpmuludq %xmm5, %xmm12, %xmm12
+; AVX512-NEXT:    vpsllq $32, %xmm12, %xmm12
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm12 = xmm12 ^ xmm2 ^ xmm0
+; AVX512-NEXT:    vpandq %xmm22, %xmm10, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpandq %xmm23, %xmm10, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm2 ^ xmm12 ^ xmm0
+; AVX512-NEXT:    vpandq %xmm24, %xmm10, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpandq %xmm25, %xmm6, %xmm12
+; AVX512-NEXT:    vpmuludq %xmm5, %xmm12, %xmm12
+; AVX512-NEXT:    vpsllq $32, %xmm12, %xmm12
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm12 = xmm12 ^ xmm2 ^ xmm0
+; AVX512-NEXT:    vpandq %xmm26, %xmm6, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpandq %xmm27, %xmm6, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm2 ^ xmm12 ^ xmm0
+; AVX512-NEXT:    vpandq %xmm28, %xmm6, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpandq %xmm29, %xmm10, %xmm12
+; AVX512-NEXT:    vpmuludq %xmm5, %xmm12, %xmm12
+; AVX512-NEXT:    vpsllq $32, %xmm12, %xmm12
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm12 = xmm12 ^ xmm2 ^ xmm0
+; AVX512-NEXT:    vpandq %xmm30, %xmm10, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpandq %xmm31, %xmm10, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm2 ^ xmm12 ^ xmm0
+; AVX512-NEXT:    vpandq %xmm16, %xmm10, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpand %xmm6, %xmm15, %xmm12
+; AVX512-NEXT:    vpmuludq %xmm5, %xmm12, %xmm12
+; AVX512-NEXT:    vpsllq $32, %xmm12, %xmm12
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm12 = xmm12 ^ xmm2 ^ xmm0
+; AVX512-NEXT:    vpand %xmm6, %xmm14, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpand %xmm6, %xmm11, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm2 ^ xmm12 ^ xmm0
+; AVX512-NEXT:    vpand %xmm6, %xmm9, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpand %xmm8, %xmm10, %xmm6
+; AVX512-NEXT:    vpmuludq %xmm6, %xmm5, %xmm6
+; AVX512-NEXT:    vpsllq $32, %xmm6, %xmm6
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm6 = xmm6 ^ xmm2 ^ xmm0
+; AVX512-NEXT:    vpand %xmm7, %xmm10, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpand %xmm3, %xmm10, %xmm2
+; AVX512-NEXT:    vpmuludq %xmm2, %xmm5, %xmm2
+; AVX512-NEXT:    vpsllq $32, %xmm2, %xmm2
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm2 = xmm2 ^ xmm6 ^ xmm0
+; AVX512-NEXT:    vpand %xmm1, %xmm10, %xmm0
+; AVX512-NEXT:    vpmuludq %xmm0, %xmm5, %xmm0
+; AVX512-NEXT:    vpshufb {{.*#+}} xmm1 = xmm2[u,u,u,u,3,2],zero,zero,xmm2[u,u,u,u,11,10],zero,zero
+; AVX512-NEXT:    vpsllq $32, %xmm0, %xmm0
+; AVX512-NEXT:    vpxor %xmm0, %xmm2, %xmm0
+; AVX512-NEXT:    vpshufb {{.*#+}} xmm2 = xmm0[u,u,u,u],zero,zero,xmm0[1],zero,xmm0[u,u,u,u],zero,zero,xmm0[9],zero
+; AVX512-NEXT:    vpsllq $56, %xmm4, %xmm3
+; AVX512-NEXT:    vpternlogq {{.*#+}} xmm3 = xmm3 | xmm1 | xmm2
+; AVX512-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[7,6,5,4,u,u,u,u,15,14,13,12,u,u,u,u]
+; AVX512-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm3[1],xmm0[2],xmm3[3]
+; AVX512-NEXT:    vpand %xmm0, %xmm13, %xmm1
+; AVX512-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240]
+; AVX512-NEXT:    vpshufb %xmm1, %xmm2, %xmm1
+; AVX512-NEXT:    vpsrlw $4, %xmm0, %xmm0
+; AVX512-NEXT:    vpand %xmm0, %xmm13, %xmm0
+; AVX512-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15]
+; AVX512-NEXT:    vpshufb %xmm0, %xmm2, %xmm0
+; AVX512-NEXT:    vpor %xmm0, %xmm1, %xmm0
+; AVX512-NEXT:    retq
+  %a.ext = zext <2 x i64> %a to <2 x i128>
+  %b.ext = zext <2 x i64> %b to <2 x i128>
+  %clmul = call <2 x i128> @llvm.clmul.v2i128(<2 x i128> %a.ext, <2 x i128> %b.ext)
+  %res.ext = lshr <2 x i128> %clmul, splat (i128 63)
+  %res = trunc <2 x i128> %res.ext to <2 x i64>
+  ret <2 x i64> %res
+}
+
 define <16 x i8> @clmulh_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
 ; SSE2-LABEL: clmulh_v16i8:
 ; SSE2:       # %bb.0:



More information about the llvm-commits mailing list