blob: c57c827080814031328cbaddc27237b604125c8f [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64 | FileCheck %s --check-prefixes=CHECK,SSE
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=CHECK,SSE
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=CHECK,AVX
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=CHECK,AVX
define i8 @clmul_i8(i8 %a, i8 %b) nounwind {
; CHECK-LABEL: clmul_i8:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andb $1, %dl
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andb $2, %cl
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: mulb %cl
; CHECK-NEXT: movl %eax, %ecx
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: mulb %dl
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: xorb %cl, %dl
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andb $4, %cl
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: mulb %cl
; CHECK-NEXT: movl %eax, %r8d
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andb $8, %cl
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: mulb %cl
; CHECK-NEXT: movl %eax, %ecx
; CHECK-NEXT: xorb %r8b, %cl
; CHECK-NEXT: xorb %dl, %cl
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andb $16, %dl
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: mulb %dl
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: andb $32, %r8b
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: mulb %r8b
; CHECK-NEXT: movl %eax, %r8d
; CHECK-NEXT: movl %esi, %r9d
; CHECK-NEXT: andb $64, %r9b
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: mulb %r9b
; CHECK-NEXT: movl %eax, %r9d
; CHECK-NEXT: xorb %dl, %r8b
; CHECK-NEXT: xorb %r8b, %r9b
; CHECK-NEXT: xorb %cl, %r9b
; CHECK-NEXT: andb $-128, %sil
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: mulb %sil
; CHECK-NEXT: xorb %r9b, %al
; CHECK-NEXT: retq
%res = call i8 @llvm.clmul.i8(i8 %a, i8 %b)
ret i8 %res
}
define i16 @clmul_i16(i16 %a, i16 %b) nounwind {
; CHECK-LABEL: clmul_i16:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $2, %eax
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $1, %ecx
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: xorl %eax, %ecx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $4, %eax
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $8, %edx
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %eax, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $16, %eax
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $32, %ecx
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: xorl %eax, %ecx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $64, %eax
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: xorl %ecx, %eax
; CHECK-NEXT: xorl %edx, %eax
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $128, %ecx
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $256, %edx # imm = 0x100
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: andl $512, %r8d # imm = 0x200
; CHECK-NEXT: imull %edi, %r8d
; CHECK-NEXT: xorl %edx, %r8d
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $1024, %ecx # imm = 0x400
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: xorl %r8d, %ecx
; CHECK-NEXT: xorl %eax, %ecx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $2048, %eax # imm = 0x800
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $4096, %edx # imm = 0x1000
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %eax, %edx
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: andl $8192, %r8d # imm = 0x2000
; CHECK-NEXT: imull %edi, %r8d
; CHECK-NEXT: xorl %edx, %r8d
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $16384, %eax # imm = 0x4000
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: xorl %r8d, %eax
; CHECK-NEXT: andl $-32768, %esi # imm = 0x8000
; CHECK-NEXT: imull %edi, %esi
; CHECK-NEXT: xorl %esi, %eax
; CHECK-NEXT: xorl %ecx, %eax
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
; CHECK-NEXT: retq
%res = call i16 @llvm.clmul.i16(i16 %a, i16 %b)
ret i16 %res
}
define i32 @clmul_i32(i32 %a, i32 %b) nounwind {
; CHECK-LABEL: clmul_i32:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $2, %eax
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $1, %ecx
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: xorl %eax, %ecx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $4, %eax
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $8, %edx
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %eax, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $16, %eax
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: andl $32, %r8d
; CHECK-NEXT: imull %edi, %r8d
; CHECK-NEXT: xorl %eax, %r8d
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $64, %ecx
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: xorl %r8d, %ecx
; CHECK-NEXT: xorl %edx, %ecx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $128, %eax
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $256, %edx # imm = 0x100
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %eax, %edx
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: andl $512, %r8d # imm = 0x200
; CHECK-NEXT: imull %edi, %r8d
; CHECK-NEXT: xorl %edx, %r8d
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $1024, %eax # imm = 0x400
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: xorl %r8d, %eax
; CHECK-NEXT: xorl %ecx, %eax
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $2048, %ecx # imm = 0x800
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $4096, %edx # imm = 0x1000
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $8192, %ecx # imm = 0x2000
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: xorl %edx, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $16384, %edx # imm = 0x4000
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $32768, %ecx # imm = 0x8000
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: xorl %edx, %ecx
; CHECK-NEXT: xorl %eax, %ecx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $65536, %eax # imm = 0x10000
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $131072, %edx # imm = 0x20000
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %eax, %edx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $262144, %eax # imm = 0x40000
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: xorl %edx, %eax
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $524288, %edx # imm = 0x80000
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %eax, %edx
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: andl $1048576, %r8d # imm = 0x100000
; CHECK-NEXT: imull %edi, %r8d
; CHECK-NEXT: xorl %edx, %r8d
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $2097152, %eax # imm = 0x200000
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: xorl %r8d, %eax
; CHECK-NEXT: xorl %ecx, %eax
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $4194304, %ecx # imm = 0x400000
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $8388608, %edx # imm = 0x800000
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $16777216, %ecx # imm = 0x1000000
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: xorl %edx, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $33554432, %edx # imm = 0x2000000
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $67108864, %ecx # imm = 0x4000000
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: xorl %edx, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $134217728, %edx # imm = 0x8000000
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $268435456, %ecx # imm = 0x10000000
; CHECK-NEXT: imull %edi, %ecx
; CHECK-NEXT: xorl %edx, %ecx
; CHECK-NEXT: xorl %eax, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $536870912, %edx # imm = 0x20000000
; CHECK-NEXT: imull %edi, %edx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: andl $1073741824, %eax # imm = 0x40000000
; CHECK-NEXT: imull %edi, %eax
; CHECK-NEXT: xorl %edx, %eax
; CHECK-NEXT: andl $-2147483648, %esi # imm = 0x80000000
; CHECK-NEXT: imull %edi, %esi
; CHECK-NEXT: xorl %esi, %eax
; CHECK-NEXT: xorl %ecx, %eax
; CHECK-NEXT: retq
%res = call i32 @llvm.clmul.i32(i32 %a, i32 %b)
ret i32 %res
}
define i64 @clmul_i64(i64 %a, i64 %b) nounwind {
; CHECK-LABEL: clmul_i64:
; CHECK: # %bb.0:
; CHECK-NEXT: pushq %rbp
; CHECK-NEXT: pushq %r15
; CHECK-NEXT: pushq %r14
; CHECK-NEXT: pushq %r13
; CHECK-NEXT: pushq %r12
; CHECK-NEXT: pushq %rbx
; CHECK-NEXT: subq $40, %rsp
; CHECK-NEXT: movl %esi, %r10d
; CHECK-NEXT: movl %esi, %r15d
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: movl %esi, %r13d
; CHECK-NEXT: movl %esi, %r12d
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: movl %esi, %ebp
; CHECK-NEXT: movl %esi, %r9d
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: movl %esi, %r11d
; CHECK-NEXT: movl %esi, %ebx
; CHECK-NEXT: movl %esi, %r14d
; CHECK-NEXT: andl $2, %r14d
; CHECK-NEXT: imulq %rdi, %r14
; CHECK-NEXT: andl $1, %r10d
; CHECK-NEXT: imulq %rdi, %r10
; CHECK-NEXT: xorq %r14, %r10
; CHECK-NEXT: movl %esi, %r14d
; CHECK-NEXT: andl $4, %r15d
; CHECK-NEXT: imulq %rdi, %r15
; CHECK-NEXT: andl $8, %eax
; CHECK-NEXT: imulq %rdi, %rax
; CHECK-NEXT: xorq %r15, %rax
; CHECK-NEXT: movl %esi, %r15d
; CHECK-NEXT: xorq %r10, %rax
; CHECK-NEXT: movl %esi, %r10d
; CHECK-NEXT: andl $16, %r13d
; CHECK-NEXT: imulq %rdi, %r13
; CHECK-NEXT: andl $32, %r12d
; CHECK-NEXT: imulq %rdi, %r12
; CHECK-NEXT: xorq %r13, %r12
; CHECK-NEXT: movl %esi, %r13d
; CHECK-NEXT: movq %r13, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: andl $64, %r8d
; CHECK-NEXT: imulq %rdi, %r8
; CHECK-NEXT: xorq %r12, %r8
; CHECK-NEXT: xorq %rax, %r8
; CHECK-NEXT: movl %esi, %r12d
; CHECK-NEXT: andl $128, %ebp
; CHECK-NEXT: imulq %rdi, %rbp
; CHECK-NEXT: andl $256, %r9d # imm = 0x100
; CHECK-NEXT: imulq %rdi, %r9
; CHECK-NEXT: xorq %rbp, %r9
; CHECK-NEXT: movl %esi, %ebp
; CHECK-NEXT: andl $512, %ecx # imm = 0x200
; CHECK-NEXT: imulq %rdi, %rcx
; CHECK-NEXT: xorq %r9, %rcx
; CHECK-NEXT: movl %esi, %r9d
; CHECK-NEXT: andl $1024, %edx # imm = 0x400
; CHECK-NEXT: imulq %rdi, %rdx
; CHECK-NEXT: xorq %rcx, %rdx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: xorq %r8, %rdx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: andl $2048, %r11d # imm = 0x800
; CHECK-NEXT: imulq %rdi, %r11
; CHECK-NEXT: andl $4096, %ebx # imm = 0x1000
; CHECK-NEXT: imulq %rdi, %rbx
; CHECK-NEXT: xorq %r11, %rbx
; CHECK-NEXT: movl %esi, %r11d
; CHECK-NEXT: andl $8192, %r14d # imm = 0x2000
; CHECK-NEXT: imulq %rdi, %r14
; CHECK-NEXT: xorq %rbx, %r14
; CHECK-NEXT: movl %esi, %ebx
; CHECK-NEXT: andl $16384, %r15d # imm = 0x4000
; CHECK-NEXT: imulq %rdi, %r15
; CHECK-NEXT: xorq %r14, %r15
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: andl $32768, %r10d # imm = 0x8000
; CHECK-NEXT: imulq %rdi, %r10
; CHECK-NEXT: xorq %r15, %r10
; CHECK-NEXT: movl %esi, %r14d
; CHECK-NEXT: xorq %rdx, %r10
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
; CHECK-NEXT: andl $65536, %ecx # imm = 0x10000
; CHECK-NEXT: imulq %rdi, %rcx
; CHECK-NEXT: andl $131072, %r13d # imm = 0x20000
; CHECK-NEXT: imulq %rdi, %r13
; CHECK-NEXT: xorq %rcx, %r13
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $262144, %r12d # imm = 0x40000
; CHECK-NEXT: imulq %rdi, %r12
; CHECK-NEXT: xorq %r13, %r12
; CHECK-NEXT: movl %esi, %r15d
; CHECK-NEXT: andl $524288, %ebp # imm = 0x80000
; CHECK-NEXT: imulq %rdi, %rbp
; CHECK-NEXT: xorq %r12, %rbp
; CHECK-NEXT: movl %esi, %r12d
; CHECK-NEXT: andl $1048576, %r9d # imm = 0x100000
; CHECK-NEXT: imulq %rdi, %r9
; CHECK-NEXT: xorq %rbp, %r9
; CHECK-NEXT: movabsq $4294967296, %rbp # imm = 0x100000000
; CHECK-NEXT: andq %rsi, %rbp
; CHECK-NEXT: andl $2097152, %eax # imm = 0x200000
; CHECK-NEXT: imulq %rdi, %rax
; CHECK-NEXT: xorq %r9, %rax
; CHECK-NEXT: movabsq $8589934592, %r9 # imm = 0x200000000
; CHECK-NEXT: andq %rsi, %r9
; CHECK-NEXT: movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: xorq %r10, %rax
; CHECK-NEXT: movabsq $17179869184, %r9 # imm = 0x400000000
; CHECK-NEXT: andq %rsi, %r9
; CHECK-NEXT: movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload
; CHECK-NEXT: andl $4194304, %r9d # imm = 0x400000
; CHECK-NEXT: imulq %rdi, %r9
; CHECK-NEXT: andl $8388608, %r11d # imm = 0x800000
; CHECK-NEXT: imulq %rdi, %r11
; CHECK-NEXT: xorq %r9, %r11
; CHECK-NEXT: movabsq $34359738368, %r9 # imm = 0x800000000
; CHECK-NEXT: andq %rsi, %r9
; CHECK-NEXT: movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: andl $16777216, %ebx # imm = 0x1000000
; CHECK-NEXT: imulq %rdi, %rbx
; CHECK-NEXT: xorq %r11, %rbx
; CHECK-NEXT: movabsq $68719476736, %r9 # imm = 0x1000000000
; CHECK-NEXT: andq %rsi, %r9
; CHECK-NEXT: movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: andl $33554432, %r8d # imm = 0x2000000
; CHECK-NEXT: imulq %rdi, %r8
; CHECK-NEXT: xorq %rbx, %r8
; CHECK-NEXT: movabsq $137438953472, %r9 # imm = 0x2000000000
; CHECK-NEXT: andq %rsi, %r9
; CHECK-NEXT: movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: andl $67108864, %r14d # imm = 0x4000000
; CHECK-NEXT: imulq %rdi, %r14
; CHECK-NEXT: xorq %r8, %r14
; CHECK-NEXT: movabsq $274877906944, %r8 # imm = 0x4000000000
; CHECK-NEXT: andq %rsi, %r8
; CHECK-NEXT: movq %r8, (%rsp) # 8-byte Spill
; CHECK-NEXT: andl $134217728, %edx # imm = 0x8000000
; CHECK-NEXT: imulq %rdi, %rdx
; CHECK-NEXT: xorq %r14, %rdx
; CHECK-NEXT: movabsq $549755813888, %r8 # imm = 0x8000000000
; CHECK-NEXT: andq %rsi, %r8
; CHECK-NEXT: movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movq %rcx, %r13
; CHECK-NEXT: andl $268435456, %r13d # imm = 0x10000000
; CHECK-NEXT: imulq %rdi, %r13
; CHECK-NEXT: xorq %rdx, %r13
; CHECK-NEXT: movabsq $1099511627776, %rcx # imm = 0x10000000000
; CHECK-NEXT: andq %rsi, %rcx
; CHECK-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: xorq %rax, %r13
; CHECK-NEXT: movabsq $2199023255552, %rax # imm = 0x20000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: andl $536870912, %r15d # imm = 0x20000000
; CHECK-NEXT: imulq %rdi, %r15
; CHECK-NEXT: andl $1073741824, %r12d # imm = 0x40000000
; CHECK-NEXT: imulq %rdi, %r12
; CHECK-NEXT: xorq %r15, %r12
; CHECK-NEXT: movq %r12, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $4398046511104, %rax # imm = 0x40000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $8796093022208, %rax # imm = 0x80000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $17592186044416, %rax # imm = 0x100000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $35184372088832, %rax # imm = 0x200000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $70368744177664, %rax # imm = 0x400000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $140737488355328, %rax # imm = 0x800000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $281474976710656, %rax # imm = 0x1000000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $562949953421312, %rax # imm = 0x2000000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $1125899906842624, %rax # imm = 0x4000000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $2251799813685248, %rax # imm = 0x8000000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $4503599627370496, %r12 # imm = 0x10000000000000
; CHECK-NEXT: andq %rsi, %r12
; CHECK-NEXT: movabsq $9007199254740992, %r14 # imm = 0x20000000000000
; CHECK-NEXT: andq %rsi, %r14
; CHECK-NEXT: movabsq $18014398509481984, %rax # imm = 0x40000000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; CHECK-NEXT: movabsq $36028797018963968, %r15 # imm = 0x80000000000000
; CHECK-NEXT: andq %rsi, %r15
; CHECK-NEXT: movabsq $72057594037927936, %rbx # imm = 0x100000000000000
; CHECK-NEXT: andq %rsi, %rbx
; CHECK-NEXT: movabsq $144115188075855872, %r11 # imm = 0x200000000000000
; CHECK-NEXT: andq %rsi, %r11
; CHECK-NEXT: movabsq $288230376151711744, %r10 # imm = 0x400000000000000
; CHECK-NEXT: andq %rsi, %r10
; CHECK-NEXT: movabsq $576460752303423488, %r9 # imm = 0x800000000000000
; CHECK-NEXT: andq %rsi, %r9
; CHECK-NEXT: movabsq $1152921504606846976, %r8 # imm = 0x1000000000000000
; CHECK-NEXT: andq %rsi, %r8
; CHECK-NEXT: movabsq $2305843009213693952, %rdx # imm = 0x2000000000000000
; CHECK-NEXT: andq %rsi, %rdx
; CHECK-NEXT: movabsq $4611686018427387904, %rcx # imm = 0x4000000000000000
; CHECK-NEXT: andq %rsi, %rcx
; CHECK-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
; CHECK-NEXT: andq %rsi, %rax
; CHECK-NEXT: # kill: def $esi killed $esi killed $rsi def $rsi
; CHECK-NEXT: andl $-2147483648, %esi # imm = 0x80000000
; CHECK-NEXT: imulq %rdi, %rsi
; CHECK-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
; CHECK-NEXT: imulq %rdi, %rbp
; CHECK-NEXT: xorq %rsi, %rbp
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rsi
; CHECK-NEXT: xorq %rbp, %rsi
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rbp
; CHECK-NEXT: xorq %rsi, %rbp
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rsi
; CHECK-NEXT: xorq %rbp, %rsi
; CHECK-NEXT: movq %rsi, %rbp
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rsi
; CHECK-NEXT: xorq %rbp, %rsi
; CHECK-NEXT: xorq %r13, %rsi
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rbp
; CHECK-NEXT: movq (%rsp), %r13 # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %r13
; CHECK-NEXT: xorq %rbp, %r13
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rbp
; CHECK-NEXT: xorq %r13, %rbp
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %r13
; CHECK-NEXT: xorq %rbp, %r13
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rbp
; CHECK-NEXT: xorq %r13, %rbp
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %r13
; CHECK-NEXT: xorq %rbp, %r13
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rbp
; CHECK-NEXT: xorq %r13, %rbp
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %r13
; CHECK-NEXT: xorq %rbp, %r13
; CHECK-NEXT: xorq %rsi, %r13
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rsi
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rbp
; CHECK-NEXT: xorq %rsi, %rbp
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rsi
; CHECK-NEXT: xorq %rbp, %rsi
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rbp
; CHECK-NEXT: xorq %rsi, %rbp
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rsi
; CHECK-NEXT: xorq %rbp, %rsi
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rbp
; CHECK-NEXT: xorq %rsi, %rbp
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rsi
; CHECK-NEXT: xorq %rbp, %rsi
; CHECK-NEXT: imulq %rdi, %r12
; CHECK-NEXT: xorq %rsi, %r12
; CHECK-NEXT: imulq %rdi, %r14
; CHECK-NEXT: xorq %r12, %r14
; CHECK-NEXT: xorq %r13, %r14
; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; CHECK-NEXT: imulq %rdi, %rsi
; CHECK-NEXT: imulq %rdi, %r15
; CHECK-NEXT: xorq %rsi, %r15
; CHECK-NEXT: imulq %rdi, %rbx
; CHECK-NEXT: xorq %r15, %rbx
; CHECK-NEXT: imulq %rdi, %r11
; CHECK-NEXT: xorq %rbx, %r11
; CHECK-NEXT: imulq %rdi, %r10
; CHECK-NEXT: xorq %r11, %r10
; CHECK-NEXT: imulq %rdi, %r9
; CHECK-NEXT: xorq %r10, %r9
; CHECK-NEXT: imulq %rdi, %r8
; CHECK-NEXT: xorq %r9, %r8
; CHECK-NEXT: imulq %rdi, %rdx
; CHECK-NEXT: xorq %r8, %rdx
; CHECK-NEXT: imulq %rdi, %rcx
; CHECK-NEXT: xorq %rdx, %rcx
; CHECK-NEXT: imulq %rdi, %rax
; CHECK-NEXT: xorq %rcx, %rax
; CHECK-NEXT: xorq %r14, %rax
; CHECK-NEXT: addq $40, %rsp
; CHECK-NEXT: popq %rbx
; CHECK-NEXT: popq %r12
; CHECK-NEXT: popq %r13
; CHECK-NEXT: popq %r14
; CHECK-NEXT: popq %r15
; CHECK-NEXT: popq %rbp
; CHECK-NEXT: retq
%res = call i64 @llvm.clmul.i64(i64 %a, i64 %b)
ret i64 %res
}
define i8 @clmulr_i8(i8 %a, i8 %b) nounwind {
; CHECK-LABEL: clmulr_i8:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $2, %ecx
; CHECK-NEXT: movzbl %dil, %eax
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $1, %edx
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $4, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: andl $8, %edi
; CHECK-NEXT: imull %eax, %edi
; CHECK-NEXT: xorl %ecx, %edi
; CHECK-NEXT: xorl %edx, %edi
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $16, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $32, %edx
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $64, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: xorl %edx, %ecx
; CHECK-NEXT: xorl %edi, %ecx
; CHECK-NEXT: andl $128, %esi
; CHECK-NEXT: imull %esi, %eax
; CHECK-NEXT: xorl %ecx, %eax
; CHECK-NEXT: shrl $7, %eax
; CHECK-NEXT: # kill: def $al killed $al killed $eax
; CHECK-NEXT: retq
%a.ext = zext i8 %a to i16
%b.ext = zext i8 %b to i16
%clmul = call i16 @llvm.clmul.i16(i16 %a.ext, i16 %b.ext)
%res.ext = lshr i16 %clmul, 7
%res = trunc i16 %res.ext to i8
ret i8 %res
}
define i16 @clmulr_i16(i16 %a, i16 %b) nounwind {
; CHECK-LABEL: clmulr_i16:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $2, %ecx
; CHECK-NEXT: movzwl %di, %eax
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $1, %edx
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $4, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: andl $8, %edi
; CHECK-NEXT: imull %eax, %edi
; CHECK-NEXT: xorl %ecx, %edi
; CHECK-NEXT: xorl %edx, %edi
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $16, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: andl $32, %r8d
; CHECK-NEXT: imull %eax, %r8d
; CHECK-NEXT: xorl %ecx, %r8d
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $64, %edx
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: xorl %r8d, %edx
; CHECK-NEXT: xorl %edi, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $128, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: andl $256, %edi # imm = 0x100
; CHECK-NEXT: imull %eax, %edi
; CHECK-NEXT: xorl %ecx, %edi
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: andl $512, %r8d # imm = 0x200
; CHECK-NEXT: imull %eax, %r8d
; CHECK-NEXT: xorl %edi, %r8d
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $1024, %ecx # imm = 0x400
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: xorl %r8d, %ecx
; CHECK-NEXT: xorl %edx, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $2048, %edx # imm = 0x800
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: andl $4096, %edi # imm = 0x1000
; CHECK-NEXT: imull %eax, %edi
; CHECK-NEXT: xorl %edx, %edi
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $8192, %edx # imm = 0x2000
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: xorl %edi, %edx
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: andl $16384, %edi # imm = 0x4000
; CHECK-NEXT: imull %eax, %edi
; CHECK-NEXT: xorl %edx, %edi
; CHECK-NEXT: andl $32768, %esi # imm = 0x8000
; CHECK-NEXT: imull %esi, %eax
; CHECK-NEXT: xorl %edi, %eax
; CHECK-NEXT: xorl %ecx, %eax
; CHECK-NEXT: shrl $15, %eax
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
; CHECK-NEXT: retq
%a.ext = zext i16 %a to i32
%b.ext = zext i16 %b to i32
%clmul = call i32 @llvm.clmul.i32(i32 %a.ext, i32 %b.ext)
%res.ext = lshr i32 %clmul, 15
%res = trunc i32 %res.ext to i16
ret i16 %res
}
define i32 @clmulr_i32(i32 %a, i32 %b) nounwind {
; CHECK-LABEL: clmulr_i32:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %ecx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $2, %edx
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $1, %esi
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdx, %rsi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $4, %edx
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $8, %edi
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rdx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $16, %edx
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %r8d
; CHECK-NEXT: andl $32, %r8d
; CHECK-NEXT: imulq %rcx, %r8
; CHECK-NEXT: xorq %rdx, %r8
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $64, %esi
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %r8, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $128, %edx
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $256, %edi # imm = 0x100
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rdx, %rdi
; CHECK-NEXT: movl %eax, %r8d
; CHECK-NEXT: andl $512, %r8d # imm = 0x200
; CHECK-NEXT: imulq %rcx, %r8
; CHECK-NEXT: xorq %rdi, %r8
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $1024, %edx # imm = 0x400
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: xorq %r8, %rdx
; CHECK-NEXT: xorq %rsi, %rdx
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $2048, %esi # imm = 0x800
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $4096, %edi # imm = 0x1000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $8192, %esi # imm = 0x2000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $16384, %edi # imm = 0x4000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $32768, %esi # imm = 0x8000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: xorq %rdx, %rsi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $65536, %edx # imm = 0x10000
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $131072, %edi # imm = 0x20000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rdx, %rdi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $262144, %edx # imm = 0x40000
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: xorq %rdi, %rdx
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $524288, %edi # imm = 0x80000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rdx, %rdi
; CHECK-NEXT: movl %eax, %r8d
; CHECK-NEXT: andl $1048576, %r8d # imm = 0x100000
; CHECK-NEXT: imulq %rcx, %r8
; CHECK-NEXT: xorq %rdi, %r8
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $2097152, %edx # imm = 0x200000
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: xorq %r8, %rdx
; CHECK-NEXT: xorq %rsi, %rdx
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $4194304, %esi # imm = 0x400000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $8388608, %edi # imm = 0x800000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $16777216, %esi # imm = 0x1000000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $33554432, %edi # imm = 0x2000000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $67108864, %esi # imm = 0x4000000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $134217728, %edi # imm = 0x8000000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $268435456, %esi # imm = 0x10000000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: xorq %rdx, %rsi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $536870912, %edx # imm = 0x20000000
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $1073741824, %edi # imm = 0x40000000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rdx, %rdi
; CHECK-NEXT: andl $-2147483648, %eax # imm = 0x80000000
; CHECK-NEXT: imulq %rcx, %rax
; CHECK-NEXT: xorq %rdi, %rax
; CHECK-NEXT: xorq %rsi, %rax
; CHECK-NEXT: shrq $31, %rax
; CHECK-NEXT: # kill: def $eax killed $eax killed $rax
; CHECK-NEXT: retq
%a.ext = zext i32 %a to i64
%b.ext = zext i32 %b to i64
%clmul = call i64 @llvm.clmul.i64(i64 %a.ext, i64 %b.ext)
%res.ext = lshr i64 %clmul, 31
%res = trunc i64 %res.ext to i32
ret i32 %res
}
define i8 @clmulh_i8(i8 %a, i8 %b) nounwind {
; CHECK-LABEL: clmulh_i8:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $2, %ecx
; CHECK-NEXT: movzbl %dil, %eax
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $1, %edx
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $4, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: andl $8, %edi
; CHECK-NEXT: imull %eax, %edi
; CHECK-NEXT: xorl %ecx, %edi
; CHECK-NEXT: xorl %edx, %edi
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $16, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $32, %edx
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $64, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: xorl %edx, %ecx
; CHECK-NEXT: xorl %edi, %ecx
; CHECK-NEXT: andl $128, %esi
; CHECK-NEXT: imull %esi, %eax
; CHECK-NEXT: xorl %ecx, %eax
; CHECK-NEXT: shrl $8, %eax
; CHECK-NEXT: # kill: def $al killed $al killed $eax
; CHECK-NEXT: retq
%a.ext = zext i8 %a to i16
%b.ext = zext i8 %b to i16
%clmul = call i16 @llvm.clmul.i16(i16 %a.ext, i16 %b.ext)
%res.ext = lshr i16 %clmul, 8
%res = trunc i16 %res.ext to i8
ret i8 %res
}
define i16 @clmulh_i16(i16 %a, i16 %b) nounwind {
; CHECK-LABEL: clmulh_i16:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $2, %ecx
; CHECK-NEXT: movzwl %di, %eax
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $1, %edx
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: xorl %ecx, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $4, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: andl $8, %edi
; CHECK-NEXT: imull %eax, %edi
; CHECK-NEXT: xorl %ecx, %edi
; CHECK-NEXT: xorl %edx, %edi
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $16, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: andl $32, %r8d
; CHECK-NEXT: imull %eax, %r8d
; CHECK-NEXT: xorl %ecx, %r8d
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $64, %edx
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: xorl %r8d, %edx
; CHECK-NEXT: xorl %edi, %edx
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $128, %ecx
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: andl $256, %edi # imm = 0x100
; CHECK-NEXT: imull %eax, %edi
; CHECK-NEXT: xorl %ecx, %edi
; CHECK-NEXT: movl %esi, %r8d
; CHECK-NEXT: andl $512, %r8d # imm = 0x200
; CHECK-NEXT: imull %eax, %r8d
; CHECK-NEXT: xorl %edi, %r8d
; CHECK-NEXT: movl %esi, %ecx
; CHECK-NEXT: andl $1024, %ecx # imm = 0x400
; CHECK-NEXT: imull %eax, %ecx
; CHECK-NEXT: xorl %r8d, %ecx
; CHECK-NEXT: xorl %edx, %ecx
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $2048, %edx # imm = 0x800
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: andl $4096, %edi # imm = 0x1000
; CHECK-NEXT: imull %eax, %edi
; CHECK-NEXT: xorl %edx, %edi
; CHECK-NEXT: movl %esi, %edx
; CHECK-NEXT: andl $8192, %edx # imm = 0x2000
; CHECK-NEXT: imull %eax, %edx
; CHECK-NEXT: xorl %edi, %edx
; CHECK-NEXT: movl %esi, %edi
; CHECK-NEXT: andl $16384, %edi # imm = 0x4000
; CHECK-NEXT: imull %eax, %edi
; CHECK-NEXT: xorl %edx, %edi
; CHECK-NEXT: andl $32768, %esi # imm = 0x8000
; CHECK-NEXT: imull %esi, %eax
; CHECK-NEXT: xorl %edi, %eax
; CHECK-NEXT: xorl %ecx, %eax
; CHECK-NEXT: shrl $16, %eax
; CHECK-NEXT: # kill: def $ax killed $ax killed $eax
; CHECK-NEXT: retq
%a.ext = zext i16 %a to i32
%b.ext = zext i16 %b to i32
%clmul = call i32 @llvm.clmul.i32(i32 %a.ext, i32 %b.ext)
%res.ext = lshr i32 %clmul, 16
%res = trunc i32 %res.ext to i16
ret i16 %res
}
define i32 @clmulh_i32(i32 %a, i32 %b) nounwind {
; CHECK-LABEL: clmulh_i32:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %ecx
; CHECK-NEXT: movl %esi, %eax
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $2, %edx
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $1, %esi
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdx, %rsi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $4, %edx
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $8, %edi
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rdx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $16, %edx
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %r8d
; CHECK-NEXT: andl $32, %r8d
; CHECK-NEXT: imulq %rcx, %r8
; CHECK-NEXT: xorq %rdx, %r8
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $64, %esi
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %r8, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $128, %edx
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $256, %edi # imm = 0x100
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rdx, %rdi
; CHECK-NEXT: movl %eax, %r8d
; CHECK-NEXT: andl $512, %r8d # imm = 0x200
; CHECK-NEXT: imulq %rcx, %r8
; CHECK-NEXT: xorq %rdi, %r8
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $1024, %edx # imm = 0x400
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: xorq %r8, %rdx
; CHECK-NEXT: xorq %rsi, %rdx
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $2048, %esi # imm = 0x800
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $4096, %edi # imm = 0x1000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $8192, %esi # imm = 0x2000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $16384, %edi # imm = 0x4000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $32768, %esi # imm = 0x8000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: xorq %rdx, %rsi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $65536, %edx # imm = 0x10000
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $131072, %edi # imm = 0x20000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rdx, %rdi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $262144, %edx # imm = 0x40000
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: xorq %rdi, %rdx
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $524288, %edi # imm = 0x80000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rdx, %rdi
; CHECK-NEXT: movl %eax, %r8d
; CHECK-NEXT: andl $1048576, %r8d # imm = 0x100000
; CHECK-NEXT: imulq %rcx, %r8
; CHECK-NEXT: xorq %rdi, %r8
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $2097152, %edx # imm = 0x200000
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: xorq %r8, %rdx
; CHECK-NEXT: xorq %rsi, %rdx
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $4194304, %esi # imm = 0x400000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $8388608, %edi # imm = 0x800000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $16777216, %esi # imm = 0x1000000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $33554432, %edi # imm = 0x2000000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $67108864, %esi # imm = 0x4000000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $134217728, %edi # imm = 0x8000000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rsi, %rdi
; CHECK-NEXT: movl %eax, %esi
; CHECK-NEXT: andl $268435456, %esi # imm = 0x10000000
; CHECK-NEXT: imulq %rcx, %rsi
; CHECK-NEXT: xorq %rdi, %rsi
; CHECK-NEXT: xorq %rdx, %rsi
; CHECK-NEXT: movl %eax, %edx
; CHECK-NEXT: andl $536870912, %edx # imm = 0x20000000
; CHECK-NEXT: imulq %rcx, %rdx
; CHECK-NEXT: movl %eax, %edi
; CHECK-NEXT: andl $1073741824, %edi # imm = 0x40000000
; CHECK-NEXT: imulq %rcx, %rdi
; CHECK-NEXT: xorq %rdx, %rdi
; CHECK-NEXT: andl $-2147483648, %eax # imm = 0x80000000
; CHECK-NEXT: imulq %rcx, %rax
; CHECK-NEXT: xorq %rdi, %rax
; CHECK-NEXT: xorq %rsi, %rax
; CHECK-NEXT: shrq $32, %rax
; CHECK-NEXT: # kill: def $eax killed $eax killed $rax
; CHECK-NEXT: retq
%a.ext = zext i32 %a to i64
%b.ext = zext i32 %b to i64
%clmul = call i64 @llvm.clmul.i64(i64 %a.ext, i64 %b.ext)
%res.ext = lshr i64 %clmul, 32
%res = trunc i64 %res.ext to i32
ret i32 %res
}
define i64 @clmulh_i64(i64 %a, i64 %b) nounwind {
; SSE-LABEL: clmulh_i64:
; SSE: # %bb.0:
; SSE-NEXT: pushq %rbp
; SSE-NEXT: pushq %r15
; SSE-NEXT: pushq %r14
; SSE-NEXT: pushq %r13
; SSE-NEXT: pushq %r12
; SSE-NEXT: pushq %rbx
; SSE-NEXT: subq $40, %rsp
; SSE-NEXT: bswapq %rdi
; SSE-NEXT: movq %rdi, %rax
; SSE-NEXT: shrq $4, %rax
; SSE-NEXT: movabsq $1085102592571150095, %r9 # imm = 0xF0F0F0F0F0F0F0F
; SSE-NEXT: andq %r9, %rax
; SSE-NEXT: andq %r9, %rdi
; SSE-NEXT: shlq $4, %rdi
; SSE-NEXT: orq %rax, %rdi
; SSE-NEXT: movabsq $3689348814741910323, %r8 # imm = 0x3333333333333333
; SSE-NEXT: movq %rdi, %rax
; SSE-NEXT: andq %r8, %rax
; SSE-NEXT: shrq $2, %rdi
; SSE-NEXT: andq %r8, %rdi
; SSE-NEXT: leaq (%rdi,%rax,4), %rax
; SSE-NEXT: movabsq $6148914691236517205, %rdx # imm = 0x5555555555555555
; SSE-NEXT: movq %rax, %rcx
; SSE-NEXT: andq %rdx, %rcx
; SSE-NEXT: shrq %rax
; SSE-NEXT: andq %rdx, %rax
; SSE-NEXT: bswapq %rsi
; SSE-NEXT: leaq (%rax,%rcx,2), %rdi
; SSE-NEXT: movq %rsi, %rax
; SSE-NEXT: shrq $4, %rax
; SSE-NEXT: andq %r9, %rax
; SSE-NEXT: andq %r9, %rsi
; SSE-NEXT: shlq $4, %rsi
; SSE-NEXT: orq %rax, %rsi
; SSE-NEXT: movq %rsi, %rax
; SSE-NEXT: andq %r8, %rax
; SSE-NEXT: shrq $2, %rsi
; SSE-NEXT: andq %r8, %rsi
; SSE-NEXT: leaq (%rsi,%rax,4), %rax
; SSE-NEXT: movq %rax, %rcx
; SSE-NEXT: andq %rdx, %rcx
; SSE-NEXT: shrq %rax
; SSE-NEXT: andq %rdx, %rax
; SSE-NEXT: leaq (%rax,%rcx,2), %rsi
; SSE-NEXT: movl %esi, %r10d
; SSE-NEXT: movl %esi, %r15d
; SSE-NEXT: movl %esi, %ecx
; SSE-NEXT: movl %esi, %r14d
; SSE-NEXT: movl %esi, %r11d
; SSE-NEXT: movl %esi, %eax
; SSE-NEXT: movl %esi, %ebx
; SSE-NEXT: movl %esi, %r9d
; SSE-NEXT: movl %esi, %r8d
; SSE-NEXT: movl %esi, %edx
; SSE-NEXT: andl $2, %edx
; SSE-NEXT: imulq %rdi, %rdx
; SSE-NEXT: andl $1, %r10d
; SSE-NEXT: imulq %rdi, %r10
; SSE-NEXT: xorq %rdx, %r10
; SSE-NEXT: movl %esi, %edx
; SSE-NEXT: andl $4, %r15d
; SSE-NEXT: imulq %rdi, %r15
; SSE-NEXT: andl $8, %ecx
; SSE-NEXT: imulq %rdi, %rcx
; SSE-NEXT: xorq %r15, %rcx
; SSE-NEXT: movl %esi, %r13d
; SSE-NEXT: xorq %r10, %rcx
; SSE-NEXT: movl %esi, %r10d
; SSE-NEXT: andl $16, %r14d
; SSE-NEXT: imulq %rdi, %r14
; SSE-NEXT: andl $32, %r11d
; SSE-NEXT: imulq %rdi, %r11
; SSE-NEXT: xorq %r14, %r11
; SSE-NEXT: movl %esi, %r14d
; SSE-NEXT: andl $64, %eax
; SSE-NEXT: imulq %rdi, %rax
; SSE-NEXT: xorq %r11, %rax
; SSE-NEXT: movl %esi, %r11d
; SSE-NEXT: xorq %rcx, %rax
; SSE-NEXT: movl %esi, %ecx
; SSE-NEXT: andl $128, %ebx
; SSE-NEXT: imulq %rdi, %rbx
; SSE-NEXT: andl $256, %r9d # imm = 0x100
; SSE-NEXT: imulq %rdi, %r9
; SSE-NEXT: xorq %rbx, %r9
; SSE-NEXT: movl %esi, %ebp
; SSE-NEXT: andl $512, %r8d # imm = 0x200
; SSE-NEXT: imulq %rdi, %r8
; SSE-NEXT: xorq %r9, %r8
; SSE-NEXT: movl %esi, %r15d
; SSE-NEXT: andl $1024, %edx # imm = 0x400
; SSE-NEXT: imulq %rdi, %rdx
; SSE-NEXT: xorq %r8, %rdx
; SSE-NEXT: movl %esi, %r12d
; SSE-NEXT: xorq %rax, %rdx
; SSE-NEXT: movl %esi, %ebx
; SSE-NEXT: andl $2048, %r13d # imm = 0x800
; SSE-NEXT: imulq %rdi, %r13
; SSE-NEXT: andl $4096, %r10d # imm = 0x1000
; SSE-NEXT: imulq %rdi, %r10
; SSE-NEXT: xorq %r13, %r10
; SSE-NEXT: movl %esi, %r13d
; SSE-NEXT: andl $8192, %r14d # imm = 0x2000
; SSE-NEXT: imulq %rdi, %r14
; SSE-NEXT: xorq %r10, %r14
; SSE-NEXT: movl %esi, %eax
; SSE-NEXT: andl $16384, %r11d # imm = 0x4000
; SSE-NEXT: imulq %rdi, %r11
; SSE-NEXT: xorq %r14, %r11
; SSE-NEXT: movl %esi, %r14d
; SSE-NEXT: andl $32768, %ecx # imm = 0x8000
; SSE-NEXT: imulq %rdi, %rcx
; SSE-NEXT: xorq %r11, %rcx
; SSE-NEXT: movl %esi, %r8d
; SSE-NEXT: xorq %rdx, %rcx
; SSE-NEXT: movl %esi, %edx
; SSE-NEXT: andl $65536, %ebp # imm = 0x10000
; SSE-NEXT: imulq %rdi, %rbp
; SSE-NEXT: andl $131072, %r15d # imm = 0x20000
; SSE-NEXT: imulq %rdi, %r15
; SSE-NEXT: xorq %rbp, %r15
; SSE-NEXT: movl %esi, %r9d
; SSE-NEXT: andl $262144, %r12d # imm = 0x40000
; SSE-NEXT: imulq %rdi, %r12
; SSE-NEXT: xorq %r15, %r12
; SSE-NEXT: movl %esi, %r10d
; SSE-NEXT: andl $524288, %ebx # imm = 0x80000
; SSE-NEXT: imulq %rdi, %rbx
; SSE-NEXT: xorq %r12, %rbx
; SSE-NEXT: movl %esi, %r11d
; SSE-NEXT: andl $1048576, %r13d # imm = 0x100000
; SSE-NEXT: imulq %rdi, %r13
; SSE-NEXT: xorq %rbx, %r13
; SSE-NEXT: movl %esi, %r15d
; SSE-NEXT: andl $2097152, %eax # imm = 0x200000
; SSE-NEXT: imulq %rdi, %rax
; SSE-NEXT: xorq %r13, %rax
; SSE-NEXT: movl %esi, %ebx
; SSE-NEXT: xorq %rcx, %rax
; SSE-NEXT: movl %esi, %ecx
; SSE-NEXT: andl $4194304, %r14d # imm = 0x400000
; SSE-NEXT: imulq %rdi, %r14
; SSE-NEXT: andl $8388608, %r8d # imm = 0x800000
; SSE-NEXT: imulq %rdi, %r8
; SSE-NEXT: xorq %r14, %r8
; SSE-NEXT: movabsq $4294967296, %rbp # imm = 0x100000000
; SSE-NEXT: andq %rsi, %rbp
; SSE-NEXT: andl $16777216, %edx # imm = 0x1000000
; SSE-NEXT: imulq %rdi, %rdx
; SSE-NEXT: xorq %r8, %rdx
; SSE-NEXT: movabsq $8589934592, %r8 # imm = 0x200000000
; SSE-NEXT: andq %rsi, %r8
; SSE-NEXT: movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: andl $33554432, %r9d # imm = 0x2000000
; SSE-NEXT: imulq %rdi, %r9
; SSE-NEXT: xorq %rdx, %r9
; SSE-NEXT: movabsq $17179869184, %rdx # imm = 0x400000000
; SSE-NEXT: andq %rsi, %rdx
; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: andl $67108864, %r10d # imm = 0x4000000
; SSE-NEXT: imulq %rdi, %r10
; SSE-NEXT: xorq %r9, %r10
; SSE-NEXT: movabsq $34359738368, %rdx # imm = 0x800000000
; SSE-NEXT: andq %rsi, %rdx
; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: andl $134217728, %r11d # imm = 0x8000000
; SSE-NEXT: imulq %rdi, %r11
; SSE-NEXT: xorq %r10, %r11
; SSE-NEXT: movabsq $68719476736, %rdx # imm = 0x1000000000
; SSE-NEXT: andq %rsi, %rdx
; SSE-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: andl $268435456, %r15d # imm = 0x10000000
; SSE-NEXT: imulq %rdi, %r15
; SSE-NEXT: xorq %r11, %r15
; SSE-NEXT: movabsq $137438953472, %rdx # imm = 0x2000000000
; SSE-NEXT: andq %rsi, %rdx
; SSE-NEXT: movq %rdx, (%rsp) # 8-byte Spill
; SSE-NEXT: xorq %rax, %r15
; SSE-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $274877906944, %r13 # imm = 0x4000000000
; SSE-NEXT: andq %rsi, %r13
; SSE-NEXT: andl $536870912, %ebx # imm = 0x20000000
; SSE-NEXT: imulq %rdi, %rbx
; SSE-NEXT: andl $1073741824, %ecx # imm = 0x40000000
; SSE-NEXT: imulq %rdi, %rcx
; SSE-NEXT: xorq %rbx, %rcx
; SSE-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $549755813888, %rax # imm = 0x8000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $1099511627776, %rax # imm = 0x10000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $2199023255552, %rax # imm = 0x20000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $4398046511104, %rax # imm = 0x40000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $8796093022208, %rax # imm = 0x80000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $17592186044416, %rax # imm = 0x100000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $35184372088832, %rax # imm = 0x200000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $70368744177664, %rax # imm = 0x400000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $140737488355328, %rax # imm = 0x800000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $281474976710656, %rax # imm = 0x1000000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $562949953421312, %rax # imm = 0x2000000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $1125899906842624, %rax # imm = 0x4000000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $2251799813685248, %rax # imm = 0x8000000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $4503599627370496, %r12 # imm = 0x10000000000000
; SSE-NEXT: andq %rsi, %r12
; SSE-NEXT: movabsq $9007199254740992, %r15 # imm = 0x20000000000000
; SSE-NEXT: andq %rsi, %r15
; SSE-NEXT: movabsq $18014398509481984, %r14 # imm = 0x40000000000000
; SSE-NEXT: andq %rsi, %r14
; SSE-NEXT: movabsq $36028797018963968, %r11 # imm = 0x80000000000000
; SSE-NEXT: andq %rsi, %r11
; SSE-NEXT: movabsq $72057594037927936, %rax # imm = 0x100000000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; SSE-NEXT: movabsq $144115188075855872, %rbx # imm = 0x200000000000000
; SSE-NEXT: andq %rsi, %rbx
; SSE-NEXT: movabsq $288230376151711744, %r10 # imm = 0x400000000000000
; SSE-NEXT: andq %rsi, %r10
; SSE-NEXT: movabsq $576460752303423488, %r9 # imm = 0x800000000000000
; SSE-NEXT: andq %rsi, %r9
; SSE-NEXT: movabsq $1152921504606846976, %r8 # imm = 0x1000000000000000
; SSE-NEXT: andq %rsi, %r8
; SSE-NEXT: movabsq $2305843009213693952, %rdx # imm = 0x2000000000000000
; SSE-NEXT: andq %rsi, %rdx
; SSE-NEXT: movabsq $4611686018427387904, %rcx # imm = 0x4000000000000000
; SSE-NEXT: andq %rsi, %rcx
; SSE-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
; SSE-NEXT: andq %rsi, %rax
; SSE-NEXT: # kill: def $esi killed $esi killed $rsi def $rsi
; SSE-NEXT: andl $-2147483648, %esi # imm = 0x80000000
; SSE-NEXT: imulq %rdi, %rsi
; SSE-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
; SSE-NEXT: imulq %rdi, %rbp
; SSE-NEXT: xorq %rsi, %rbp
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rsi
; SSE-NEXT: xorq %rbp, %rsi
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rbp
; SSE-NEXT: xorq %rsi, %rbp
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rsi
; SSE-NEXT: xorq %rbp, %rsi
; SSE-NEXT: movq %rsi, %rbp
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rsi
; SSE-NEXT: xorq %rbp, %rsi
; SSE-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
; SSE-NEXT: movq (%rsp), %rbp # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rbp
; SSE-NEXT: imulq %rdi, %r13
; SSE-NEXT: xorq %rbp, %r13
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rbp
; SSE-NEXT: xorq %r13, %rbp
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
; SSE-NEXT: imulq %rdi, %r13
; SSE-NEXT: xorq %rbp, %r13
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rbp
; SSE-NEXT: xorq %r13, %rbp
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
; SSE-NEXT: imulq %rdi, %r13
; SSE-NEXT: xorq %rbp, %r13
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rbp
; SSE-NEXT: xorq %r13, %rbp
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
; SSE-NEXT: imulq %rdi, %r13
; SSE-NEXT: xorq %rbp, %r13
; SSE-NEXT: movq %r13, %rbp
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
; SSE-NEXT: imulq %rdi, %r13
; SSE-NEXT: xorq %rbp, %r13
; SSE-NEXT: xorq %rsi, %r13
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rsi
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rbp
; SSE-NEXT: xorq %rsi, %rbp
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rsi
; SSE-NEXT: xorq %rbp, %rsi
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rbp
; SSE-NEXT: xorq %rsi, %rbp
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rsi
; SSE-NEXT: xorq %rbp, %rsi
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rbp
; SSE-NEXT: xorq %rsi, %rbp
; SSE-NEXT: imulq %rdi, %r12
; SSE-NEXT: xorq %rbp, %r12
; SSE-NEXT: imulq %rdi, %r15
; SSE-NEXT: xorq %r12, %r15
; SSE-NEXT: imulq %rdi, %r14
; SSE-NEXT: xorq %r15, %r14
; SSE-NEXT: imulq %rdi, %r11
; SSE-NEXT: xorq %r14, %r11
; SSE-NEXT: xorq %r13, %r11
; SSE-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; SSE-NEXT: imulq %rdi, %rsi
; SSE-NEXT: imulq %rdi, %rbx
; SSE-NEXT: xorq %rsi, %rbx
; SSE-NEXT: imulq %rdi, %r10
; SSE-NEXT: xorq %rbx, %r10
; SSE-NEXT: imulq %rdi, %r9
; SSE-NEXT: xorq %r10, %r9
; SSE-NEXT: imulq %rdi, %r8
; SSE-NEXT: xorq %r9, %r8
; SSE-NEXT: imulq %rdi, %rdx
; SSE-NEXT: xorq %r8, %rdx
; SSE-NEXT: imulq %rdi, %rcx
; SSE-NEXT: xorq %rdx, %rcx
; SSE-NEXT: imulq %rdi, %rax
; SSE-NEXT: xorq %rcx, %rax
; SSE-NEXT: xorq %r11, %rax
; SSE-NEXT: bswapq %rax
; SSE-NEXT: movq %rax, %rcx
; SSE-NEXT: shrq $4, %rcx
; SSE-NEXT: movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F
; SSE-NEXT: andq %rdx, %rcx
; SSE-NEXT: andq %rdx, %rax
; SSE-NEXT: shlq $4, %rax
; SSE-NEXT: orq %rcx, %rax
; SSE-NEXT: movq %rax, %rcx
; SSE-NEXT: movabsq $3689348814741910323, %rdx # imm = 0x3333333333333333
; SSE-NEXT: andq %rdx, %rcx
; SSE-NEXT: shrq $2, %rax
; SSE-NEXT: andq %rdx, %rax
; SSE-NEXT: leaq (%rax,%rcx,4), %rax
; SSE-NEXT: movabsq $6148914691236517205, %rdx # imm = 0x5555555555555555
; SSE-NEXT: andq %rax, %rdx
; SSE-NEXT: shrq %rax
; SSE-NEXT: movabsq $6148914691236517204, %rcx # imm = 0x5555555555555554
; SSE-NEXT: andq %rax, %rcx
; SSE-NEXT: leaq (%rcx,%rdx,2), %rax
; SSE-NEXT: shrq %rax
; SSE-NEXT: addq $40, %rsp
; SSE-NEXT: popq %rbx
; SSE-NEXT: popq %r12
; SSE-NEXT: popq %r13
; SSE-NEXT: popq %r14
; SSE-NEXT: popq %r15
; SSE-NEXT: popq %rbp
; SSE-NEXT: retq
;
; AVX-LABEL: clmulh_i64:
; AVX: # %bb.0:
; AVX-NEXT: pushq %rbp
; AVX-NEXT: pushq %r15
; AVX-NEXT: pushq %r14
; AVX-NEXT: pushq %r13
; AVX-NEXT: pushq %r12
; AVX-NEXT: pushq %rbx
; AVX-NEXT: subq $40, %rsp
; AVX-NEXT: bswapq %rdi
; AVX-NEXT: movq %rdi, %rax
; AVX-NEXT: shrq $4, %rax
; AVX-NEXT: movabsq $1085102592571150095, %r9 # imm = 0xF0F0F0F0F0F0F0F
; AVX-NEXT: andq %r9, %rax
; AVX-NEXT: andq %r9, %rdi
; AVX-NEXT: shlq $4, %rdi
; AVX-NEXT: orq %rax, %rdi
; AVX-NEXT: movabsq $3689348814741910323, %r8 # imm = 0x3333333333333333
; AVX-NEXT: movq %rdi, %rax
; AVX-NEXT: andq %r8, %rax
; AVX-NEXT: shrq $2, %rdi
; AVX-NEXT: andq %r8, %rdi
; AVX-NEXT: leaq (%rdi,%rax,4), %rax
; AVX-NEXT: movabsq $6148914691236517205, %rdx # imm = 0x5555555555555555
; AVX-NEXT: movq %rax, %rcx
; AVX-NEXT: andq %rdx, %rcx
; AVX-NEXT: shrq %rax
; AVX-NEXT: andq %rdx, %rax
; AVX-NEXT: leaq (%rax,%rcx,2), %rdi
; AVX-NEXT: bswapq %rsi
; AVX-NEXT: movq %rsi, %rax
; AVX-NEXT: shrq $4, %rax
; AVX-NEXT: andq %r9, %rax
; AVX-NEXT: andq %r9, %rsi
; AVX-NEXT: shlq $4, %rsi
; AVX-NEXT: orq %rax, %rsi
; AVX-NEXT: movq %rsi, %rax
; AVX-NEXT: andq %r8, %rax
; AVX-NEXT: shrq $2, %rsi
; AVX-NEXT: andq %r8, %rsi
; AVX-NEXT: leaq (%rsi,%rax,4), %rax
; AVX-NEXT: movq %rax, %rcx
; AVX-NEXT: andq %rdx, %rcx
; AVX-NEXT: shrq %rax
; AVX-NEXT: andq %rdx, %rax
; AVX-NEXT: leaq (%rax,%rcx,2), %rsi
; AVX-NEXT: movl %esi, %r10d
; AVX-NEXT: movl %esi, %r15d
; AVX-NEXT: movl %esi, %ecx
; AVX-NEXT: movl %esi, %r14d
; AVX-NEXT: movl %esi, %r11d
; AVX-NEXT: movl %esi, %eax
; AVX-NEXT: movl %esi, %ebx
; AVX-NEXT: movl %esi, %r9d
; AVX-NEXT: movl %esi, %r8d
; AVX-NEXT: movl %esi, %edx
; AVX-NEXT: andl $2, %edx
; AVX-NEXT: imulq %rdi, %rdx
; AVX-NEXT: andl $1, %r10d
; AVX-NEXT: imulq %rdi, %r10
; AVX-NEXT: xorq %rdx, %r10
; AVX-NEXT: movl %esi, %edx
; AVX-NEXT: andl $4, %r15d
; AVX-NEXT: imulq %rdi, %r15
; AVX-NEXT: andl $8, %ecx
; AVX-NEXT: imulq %rdi, %rcx
; AVX-NEXT: xorq %r15, %rcx
; AVX-NEXT: movl %esi, %r13d
; AVX-NEXT: xorq %r10, %rcx
; AVX-NEXT: movl %esi, %r10d
; AVX-NEXT: andl $16, %r14d
; AVX-NEXT: imulq %rdi, %r14
; AVX-NEXT: andl $32, %r11d
; AVX-NEXT: imulq %rdi, %r11
; AVX-NEXT: xorq %r14, %r11
; AVX-NEXT: movl %esi, %r14d
; AVX-NEXT: andl $64, %eax
; AVX-NEXT: imulq %rdi, %rax
; AVX-NEXT: xorq %r11, %rax
; AVX-NEXT: movl %esi, %r11d
; AVX-NEXT: xorq %rcx, %rax
; AVX-NEXT: movl %esi, %ecx
; AVX-NEXT: andl $128, %ebx
; AVX-NEXT: imulq %rdi, %rbx
; AVX-NEXT: andl $256, %r9d # imm = 0x100
; AVX-NEXT: imulq %rdi, %r9
; AVX-NEXT: xorq %rbx, %r9
; AVX-NEXT: movl %esi, %ebp
; AVX-NEXT: andl $512, %r8d # imm = 0x200
; AVX-NEXT: imulq %rdi, %r8
; AVX-NEXT: xorq %r9, %r8
; AVX-NEXT: movl %esi, %r15d
; AVX-NEXT: andl $1024, %edx # imm = 0x400
; AVX-NEXT: imulq %rdi, %rdx
; AVX-NEXT: xorq %r8, %rdx
; AVX-NEXT: movl %esi, %r12d
; AVX-NEXT: xorq %rax, %rdx
; AVX-NEXT: movl %esi, %ebx
; AVX-NEXT: andl $2048, %r13d # imm = 0x800
; AVX-NEXT: imulq %rdi, %r13
; AVX-NEXT: andl $4096, %r10d # imm = 0x1000
; AVX-NEXT: imulq %rdi, %r10
; AVX-NEXT: xorq %r13, %r10
; AVX-NEXT: movl %esi, %r13d
; AVX-NEXT: andl $8192, %r14d # imm = 0x2000
; AVX-NEXT: imulq %rdi, %r14
; AVX-NEXT: xorq %r10, %r14
; AVX-NEXT: movl %esi, %eax
; AVX-NEXT: andl $16384, %r11d # imm = 0x4000
; AVX-NEXT: imulq %rdi, %r11
; AVX-NEXT: xorq %r14, %r11
; AVX-NEXT: movl %esi, %r14d
; AVX-NEXT: andl $32768, %ecx # imm = 0x8000
; AVX-NEXT: imulq %rdi, %rcx
; AVX-NEXT: xorq %r11, %rcx
; AVX-NEXT: movl %esi, %r8d
; AVX-NEXT: xorq %rdx, %rcx
; AVX-NEXT: movl %esi, %edx
; AVX-NEXT: andl $65536, %ebp # imm = 0x10000
; AVX-NEXT: imulq %rdi, %rbp
; AVX-NEXT: andl $131072, %r15d # imm = 0x20000
; AVX-NEXT: imulq %rdi, %r15
; AVX-NEXT: xorq %rbp, %r15
; AVX-NEXT: movl %esi, %r9d
; AVX-NEXT: andl $262144, %r12d # imm = 0x40000
; AVX-NEXT: imulq %rdi, %r12
; AVX-NEXT: xorq %r15, %r12
; AVX-NEXT: movl %esi, %r10d
; AVX-NEXT: andl $524288, %ebx # imm = 0x80000
; AVX-NEXT: imulq %rdi, %rbx
; AVX-NEXT: xorq %r12, %rbx
; AVX-NEXT: movl %esi, %r11d
; AVX-NEXT: andl $1048576, %r13d # imm = 0x100000
; AVX-NEXT: imulq %rdi, %r13
; AVX-NEXT: xorq %rbx, %r13
; AVX-NEXT: movl %esi, %r15d
; AVX-NEXT: andl $2097152, %eax # imm = 0x200000
; AVX-NEXT: imulq %rdi, %rax
; AVX-NEXT: xorq %r13, %rax
; AVX-NEXT: movl %esi, %ebx
; AVX-NEXT: xorq %rcx, %rax
; AVX-NEXT: movl %esi, %ecx
; AVX-NEXT: andl $4194304, %r14d # imm = 0x400000
; AVX-NEXT: imulq %rdi, %r14
; AVX-NEXT: andl $8388608, %r8d # imm = 0x800000
; AVX-NEXT: imulq %rdi, %r8
; AVX-NEXT: xorq %r14, %r8
; AVX-NEXT: movabsq $4294967296, %rbp # imm = 0x100000000
; AVX-NEXT: andq %rsi, %rbp
; AVX-NEXT: andl $16777216, %edx # imm = 0x1000000
; AVX-NEXT: imulq %rdi, %rdx
; AVX-NEXT: xorq %r8, %rdx
; AVX-NEXT: movabsq $8589934592, %r8 # imm = 0x200000000
; AVX-NEXT: andq %rsi, %r8
; AVX-NEXT: movq %r8, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: andl $33554432, %r9d # imm = 0x2000000
; AVX-NEXT: imulq %rdi, %r9
; AVX-NEXT: xorq %rdx, %r9
; AVX-NEXT: movabsq $17179869184, %rdx # imm = 0x400000000
; AVX-NEXT: andq %rsi, %rdx
; AVX-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: andl $67108864, %r10d # imm = 0x4000000
; AVX-NEXT: imulq %rdi, %r10
; AVX-NEXT: xorq %r9, %r10
; AVX-NEXT: movabsq $34359738368, %rdx # imm = 0x800000000
; AVX-NEXT: andq %rsi, %rdx
; AVX-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: andl $134217728, %r11d # imm = 0x8000000
; AVX-NEXT: imulq %rdi, %r11
; AVX-NEXT: xorq %r10, %r11
; AVX-NEXT: movabsq $68719476736, %rdx # imm = 0x1000000000
; AVX-NEXT: andq %rsi, %rdx
; AVX-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: andl $268435456, %r15d # imm = 0x10000000
; AVX-NEXT: imulq %rdi, %r15
; AVX-NEXT: xorq %r11, %r15
; AVX-NEXT: movabsq $137438953472, %rdx # imm = 0x2000000000
; AVX-NEXT: andq %rsi, %rdx
; AVX-NEXT: movq %rdx, (%rsp) # 8-byte Spill
; AVX-NEXT: xorq %rax, %r15
; AVX-NEXT: movq %r15, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $274877906944, %r13 # imm = 0x4000000000
; AVX-NEXT: andq %rsi, %r13
; AVX-NEXT: andl $536870912, %ebx # imm = 0x20000000
; AVX-NEXT: imulq %rdi, %rbx
; AVX-NEXT: andl $1073741824, %ecx # imm = 0x40000000
; AVX-NEXT: imulq %rdi, %rcx
; AVX-NEXT: xorq %rbx, %rcx
; AVX-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $549755813888, %rax # imm = 0x8000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $1099511627776, %rax # imm = 0x10000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $2199023255552, %rax # imm = 0x20000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $4398046511104, %rax # imm = 0x40000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $8796093022208, %rax # imm = 0x80000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $17592186044416, %rax # imm = 0x100000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $35184372088832, %rax # imm = 0x200000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $70368744177664, %rax # imm = 0x400000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $140737488355328, %rax # imm = 0x800000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $281474976710656, %rax # imm = 0x1000000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $562949953421312, %rax # imm = 0x2000000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $1125899906842624, %rax # imm = 0x4000000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $2251799813685248, %rax # imm = 0x8000000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $4503599627370496, %r12 # imm = 0x10000000000000
; AVX-NEXT: andq %rsi, %r12
; AVX-NEXT: movabsq $9007199254740992, %r15 # imm = 0x20000000000000
; AVX-NEXT: andq %rsi, %r15
; AVX-NEXT: movabsq $18014398509481984, %r14 # imm = 0x40000000000000
; AVX-NEXT: andq %rsi, %r14
; AVX-NEXT: movabsq $36028797018963968, %r11 # imm = 0x80000000000000
; AVX-NEXT: andq %rsi, %r11
; AVX-NEXT: movabsq $72057594037927936, %rax # imm = 0x100000000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
; AVX-NEXT: movabsq $144115188075855872, %rbx # imm = 0x200000000000000
; AVX-NEXT: andq %rsi, %rbx
; AVX-NEXT: movabsq $288230376151711744, %r10 # imm = 0x400000000000000
; AVX-NEXT: andq %rsi, %r10
; AVX-NEXT: movabsq $576460752303423488, %r9 # imm = 0x800000000000000
; AVX-NEXT: andq %rsi, %r9
; AVX-NEXT: movabsq $1152921504606846976, %r8 # imm = 0x1000000000000000
; AVX-NEXT: andq %rsi, %r8
; AVX-NEXT: movabsq $2305843009213693952, %rdx # imm = 0x2000000000000000
; AVX-NEXT: andq %rsi, %rdx
; AVX-NEXT: movabsq $4611686018427387904, %rcx # imm = 0x4000000000000000
; AVX-NEXT: andq %rsi, %rcx
; AVX-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
; AVX-NEXT: andq %rsi, %rax
; AVX-NEXT: # kill: def $esi killed $esi killed $rsi def $rsi
; AVX-NEXT: andl $-2147483648, %esi # imm = 0x80000000
; AVX-NEXT: imulq %rdi, %rsi
; AVX-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
; AVX-NEXT: imulq %rdi, %rbp
; AVX-NEXT: xorq %rsi, %rbp
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rsi
; AVX-NEXT: xorq %rbp, %rsi
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rbp
; AVX-NEXT: xorq %rsi, %rbp
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rsi
; AVX-NEXT: xorq %rbp, %rsi
; AVX-NEXT: movq %rsi, %rbp
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rsi
; AVX-NEXT: xorq %rbp, %rsi
; AVX-NEXT: xorq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Folded Reload
; AVX-NEXT: movq (%rsp), %rbp # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rbp
; AVX-NEXT: imulq %rdi, %r13
; AVX-NEXT: xorq %rbp, %r13
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rbp
; AVX-NEXT: xorq %r13, %rbp
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
; AVX-NEXT: imulq %rdi, %r13
; AVX-NEXT: xorq %rbp, %r13
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rbp
; AVX-NEXT: xorq %r13, %rbp
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
; AVX-NEXT: imulq %rdi, %r13
; AVX-NEXT: xorq %rbp, %r13
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rbp
; AVX-NEXT: xorq %r13, %rbp
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
; AVX-NEXT: imulq %rdi, %r13
; AVX-NEXT: xorq %rbp, %r13
; AVX-NEXT: movq %r13, %rbp
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r13 # 8-byte Reload
; AVX-NEXT: imulq %rdi, %r13
; AVX-NEXT: xorq %rbp, %r13
; AVX-NEXT: xorq %rsi, %r13
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rsi
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rbp
; AVX-NEXT: xorq %rsi, %rbp
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rsi
; AVX-NEXT: xorq %rbp, %rsi
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rbp
; AVX-NEXT: xorq %rsi, %rbp
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rsi
; AVX-NEXT: xorq %rbp, %rsi
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbp # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rbp
; AVX-NEXT: xorq %rsi, %rbp
; AVX-NEXT: imulq %rdi, %r12
; AVX-NEXT: xorq %rbp, %r12
; AVX-NEXT: imulq %rdi, %r15
; AVX-NEXT: xorq %r12, %r15
; AVX-NEXT: imulq %rdi, %r14
; AVX-NEXT: xorq %r15, %r14
; AVX-NEXT: imulq %rdi, %r11
; AVX-NEXT: xorq %r14, %r11
; AVX-NEXT: xorq %r13, %r11
; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rsi # 8-byte Reload
; AVX-NEXT: imulq %rdi, %rsi
; AVX-NEXT: imulq %rdi, %rbx
; AVX-NEXT: xorq %rsi, %rbx
; AVX-NEXT: imulq %rdi, %r10
; AVX-NEXT: xorq %rbx, %r10
; AVX-NEXT: imulq %rdi, %r9
; AVX-NEXT: xorq %r10, %r9
; AVX-NEXT: imulq %rdi, %r8
; AVX-NEXT: xorq %r9, %r8
; AVX-NEXT: imulq %rdi, %rdx
; AVX-NEXT: xorq %r8, %rdx
; AVX-NEXT: imulq %rdi, %rcx
; AVX-NEXT: xorq %rdx, %rcx
; AVX-NEXT: imulq %rdi, %rax
; AVX-NEXT: xorq %rcx, %rax
; AVX-NEXT: xorq %r11, %rax
; AVX-NEXT: bswapq %rax
; AVX-NEXT: movq %rax, %rcx
; AVX-NEXT: shrq $4, %rcx
; AVX-NEXT: movabsq $1085102592571150095, %rdx # imm = 0xF0F0F0F0F0F0F0F
; AVX-NEXT: andq %rdx, %rcx
; AVX-NEXT: andq %rdx, %rax
; AVX-NEXT: shlq $4, %rax
; AVX-NEXT: orq %rcx, %rax
; AVX-NEXT: movq %rax, %rcx
; AVX-NEXT: movabsq $3689348814741910323, %rdx # imm = 0x3333333333333333
; AVX-NEXT: andq %rdx, %rcx
; AVX-NEXT: shrq $2, %rax
; AVX-NEXT: andq %rdx, %rax
; AVX-NEXT: leaq (%rax,%rcx,4), %rax
; AVX-NEXT: movabsq $6148914691236517205, %rdx # imm = 0x5555555555555555
; AVX-NEXT: andq %rax, %rdx
; AVX-NEXT: shrq %rax
; AVX-NEXT: movabsq $6148914691236517204, %rcx # imm = 0x5555555555555554
; AVX-NEXT: andq %rax, %rcx
; AVX-NEXT: leaq (%rcx,%rdx,2), %rax
; AVX-NEXT: shrq %rax
; AVX-NEXT: addq $40, %rsp
; AVX-NEXT: popq %rbx
; AVX-NEXT: popq %r12
; AVX-NEXT: popq %r13
; AVX-NEXT: popq %r14
; AVX-NEXT: popq %r15
; AVX-NEXT: popq %rbp
; AVX-NEXT: retq
%a.ext = zext i64 %a to i128
%b.ext = zext i64 %b to i128
%clmul = call i128 @llvm.clmul.i128(i128 %a.ext, i128 %b.ext)
%res.ext = lshr i128 %clmul, 64
%res = trunc i128 %res.ext to i64
ret i64 %res
}